diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
index 6e6eec1148..79ee123c2b 100644
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -1,6 +1,5 @@
-
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index e63971d275..3f395ea3b8 100644
--- a/build.gradle
+++ b/build.gradle
@@ -274,7 +274,7 @@ configure(project(':desktop')) {
apply plugin: 'witness'
apply from: '../gradle/witness/gradle-witness.gradle'
- version = '1.1.7-SNAPSHOT'
+ version = '1.2.1-SNAPSHOT'
mainClassName = 'bisq.desktop.app.BisqAppMain'
diff --git a/common/src/main/java/bisq/common/app/Capability.java b/common/src/main/java/bisq/common/app/Capability.java
index 8d18736f7b..33040bbfa4 100644
--- a/common/src/main/java/bisq/common/app/Capability.java
+++ b/common/src/main/java/bisq/common/app/Capability.java
@@ -35,9 +35,10 @@ public enum Capability {
RECEIVE_BSQ_BLOCK, // Signaling that node which wants to receive BSQ blocks (DAO lite node)
@Deprecated DAO_STATE, // Not required anymore as no old clients out there not having that support
- //TODO can be set deprecated after v1.1.6 as we enforce update there
- BUNDLE_OF_ENVELOPES, // Supports bundling of messages if many messages are sent in short interval
+ @Deprecated BUNDLE_OF_ENVELOPES, // Supports bundling of messages if many messages are sent in short interval
SIGNED_ACCOUNT_AGE_WITNESS, // Supports the signed account age witness feature
- MEDIATION // Supports mediation feature
+ MEDIATION, // Supports mediation feature
+ REFUND_AGENT, // Supports refund agents
+ TRADE_STATISTICS_HASH_UPDATE // We changed the hash method in 1.2.0 and that requires update to 1.2.2 for handling it correctly, otherwise the seed nodes have to process too much data.
}
diff --git a/common/src/main/java/bisq/common/app/Version.java b/common/src/main/java/bisq/common/app/Version.java
index c5275945fd..2ef33d2e0b 100644
--- a/common/src/main/java/bisq/common/app/Version.java
+++ b/common/src/main/java/bisq/common/app/Version.java
@@ -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 = "1.1.7";
+ public static final String VERSION = "1.2.1";
public static int getMajorVersion(String version) {
return getSubVersion(version, 0);
@@ -73,7 +73,7 @@ public class Version {
// The version no. for the objects sent over the network. A change will break the serialization of old objects.
// If objects are used for both network and database the network version is applied.
// VERSION = 0.5.0 -> P2P_NETWORK_VERSION = 1
- @SuppressWarnings("ConstantConditions")
+ // With version 1.2.1 we change to version 2 (new trade protocol)
public static final int P2P_NETWORK_VERSION = 1;
// The version no. of the serialized data stored to disc. A change will break the serialization of old objects.
@@ -84,7 +84,8 @@ public class Version {
// A taker will check the version of the offers to see if his version is compatible.
// Offers created with the old version will become invalid and have to be canceled.
// VERSION = 0.5.0 -> TRADE_PROTOCOL_VERSION = 1
- public static final int TRADE_PROTOCOL_VERSION = 1;
+ // Version 1.2.1 -> TRADE_PROTOCOL_VERSION = 2
+ public static final int TRADE_PROTOCOL_VERSION = 2;
private static int p2pMessageVersion;
public static final String BSQ_TX_VERSION = "1";
diff --git a/common/src/main/proto/pb.proto b/common/src/main/proto/pb.proto
index 63385e522d..340be39a10 100644
--- a/common/src/main/proto/pb.proto
+++ b/common/src/main/proto/pb.proto
@@ -36,9 +36,9 @@ message NetworkEnvelope {
CloseConnectionMessage close_connection_message = 15;
PrefixedSealedAndSignedMessage prefixed_sealed_and_signed_message = 16;
- PayDepositRequest pay_deposit_request = 17;
- PublishDepositTxRequest publish_deposit_tx_request = 18;
- DepositTxPublishedMessage deposit_tx_published_message = 19;
+ InputsForDepositTxRequest inputs_for_deposit_tx_request = 17;
+ InputsForDepositTxResponse inputs_for_deposit_tx_response = 18;
+ DepositTxMessage deposit_tx_message = 19;
CounterCurrencyTransferStartedMessage counter_currency_transfer_started_message = 20;
PayoutTxPublishedMessage payout_tx_published_message = 21;
@@ -70,6 +70,11 @@ message NetworkEnvelope {
BundleOfEnvelopes bundle_of_envelopes = 43;
MediatedPayoutTxSignatureMessage mediated_payout_tx_signature_message = 44;
MediatedPayoutTxPublishedMessage mediated_payout_tx_published_message = 45;
+
+ DelayedPayoutTxSignatureRequest delayed_payout_tx_signature_request = 46;
+ DelayedPayoutTxSignatureResponse delayed_payout_tx_signature_response = 47;
+ DepositTxAndDelayedPayoutTxMessage deposit_tx_and_delayed_payout_tx_message = 48;
+ PeerPublishedDelayedPayoutTxMessage peer_published_delayed_payout_tx_message = 49;
}
}
@@ -144,6 +149,7 @@ message OfferAvailabilityResponse {
string uid = 4;
NodeAddress arbitrator = 5;
NodeAddress mediator = 6;
+ NodeAddress refund_agent = 7;
}
message RefreshOfferMessage {
@@ -197,7 +203,7 @@ message PrefixedSealedAndSignedMessage {
// trade
-message PayDepositRequest {
+message InputsForDepositTxRequest {
string trade_id = 1;
NodeAddress sender_node_address = 2;
int64 trade_amount = 3;
@@ -221,9 +227,11 @@ message PayDepositRequest {
string uid = 21;
bytes account_age_witness_signature_of_offer_id = 22;
int64 current_date = 23;
+ repeated NodeAddress accepted_refund_agent_node_addresses = 24;
+ NodeAddress refund_agent_node_address = 25;
}
-message PublishDepositTxRequest {
+message InputsForDepositTxResponse {
string trade_id = 1;
PaymentAccountPayload maker_payment_account_payload = 2;
string maker_account_id = 3;
@@ -237,13 +245,42 @@ message PublishDepositTxRequest {
string uid = 11;
bytes account_age_witness_signature_of_prepared_deposit_tx = 12;
int64 current_date = 13;
+ int64 lock_time = 14;
}
-message DepositTxPublishedMessage {
- string trade_id = 1;
- bytes deposit_tx = 2;
+message DelayedPayoutTxSignatureRequest {
+ string uid = 1;
+ string trade_id = 2;
+ NodeAddress sender_node_address = 3;
+ bytes delayed_payout_tx = 4;
+}
+
+message DelayedPayoutTxSignatureResponse {
+ string uid = 1;
+ string trade_id = 2;
+ NodeAddress sender_node_address = 3;
+ bytes delayed_payout_tx_signature = 4;
+}
+
+message DepositTxAndDelayedPayoutTxMessage {
+ string uid = 1;
+ string trade_id = 2;
+ NodeAddress sender_node_address = 3;
+ bytes deposit_tx = 4;
+ bytes delayed_payout_tx = 5;
+}
+
+message DepositTxMessage {
+ string uid = 1;
+ string trade_id = 2;
+ NodeAddress sender_node_address = 3;
+ bytes deposit_tx = 4;
+}
+
+message PeerPublishedDelayedPayoutTxMessage {
+ string uid = 1;
+ string trade_id = 2;
NodeAddress sender_node_address = 3;
- string uid = 4;
}
message CounterCurrencyTransferStartedMessage {
@@ -279,8 +316,8 @@ message MediatedPayoutTxPublishedMessage {
message MediatedPayoutTxSignatureMessage {
string uid = 1;
- bytes tx_signature = 2;
string trade_id = 3;
+ bytes tx_signature = 2;
NodeAddress sender_node_address = 4;
}
@@ -290,6 +327,7 @@ enum SupportType {
ARBITRATION = 0;
MEDIATION = 1;
TRADE = 2;
+ REFUND = 3;
}
message OpenNewDisputeMessage {
@@ -431,7 +469,7 @@ message Peer {
message PubKeyRing {
bytes signature_pub_key_bytes = 1;
bytes encryption_pub_key_bytes = 2;
- reserved 3; // WAS: string pgp_pub_key_as_pem = 3;
+ reserved 3; // WAS: string pgp_pub_key_as_pem = 3;
}
message SealedAndSigned {
@@ -457,6 +495,7 @@ message StoragePayload {
MailboxStoragePayload mailbox_storage_payload = 6;
OfferPayload offer_payload = 7;
TempProposalPayload temp_proposal_payload = 8;
+ RefundAgent refund_agent = 9;
}
}
@@ -550,6 +589,18 @@ message Mediator {
map extra_data = 9;
}
+message RefundAgent {
+ NodeAddress node_address = 1;
+ repeated string language_codes = 2;
+ int64 registration_date = 3;
+ string registration_signature = 4;
+ bytes registration_pub_key = 5;
+ PubKeyRing pub_key_ring = 6;
+ string email_address = 7;
+ string info = 8;
+ map extra_data = 9;
+}
+
message Filter {
repeated string banned_node_address = 1;
repeated string banned_offer_ids = 2;
@@ -568,6 +619,7 @@ message Filter {
string disable_dao_below_version = 15;
string disable_trade_below_version = 16;
repeated string mediators = 17;
+ repeated string refundAgents = 18;
}
// not used anymore from v0.6 on. But leave it for receiving TradeStatistics objects from older
@@ -670,8 +722,14 @@ message AccountAgeWitness {
}
message SignedWitness {
- bool signed_by_arbitrator = 1;
- bytes witness_hash = 2;
+ enum VerificationMethod {
+ PB_ERROR = 0;
+ ARBITRATOR = 1;
+ TRADE = 2;
+ }
+
+ VerificationMethod verification_method = 1;
+ bytes account_age_witness_hash = 2;
bytes signature = 3;
bytes signer_pub_key = 4;
bytes witness_owner_pub_key = 5;
@@ -708,6 +766,9 @@ message Dispute {
bool is_closed = 21;
DisputeResult dispute_result = 22;
string dispute_payout_tx_id = 23;
+ SupportType support_type = 24;
+ string mediators_dispute_result = 25;
+ string delayed_payout_tx_id = 26;
}
message Attachment {
@@ -759,7 +820,7 @@ message Contract {
int64 trade_amount = 2;
int64 trade_price = 3;
string taker_fee_tx_id = 4;
- NodeAddress arbitrator_node_address = 5;
+ reserved 5; // WAS: arbitrator_node_address
bool is_buyer_maker_and_seller_taker = 6;
string maker_account_id = 7;
string taker_account_id = 8;
@@ -774,6 +835,8 @@ message Contract {
bytes maker_multi_sig_pub_key = 17;
bytes taker_multi_sig_pub_key = 18;
NodeAddress mediator_node_address = 19;
+ int64 lock_time = 20;
+ NodeAddress refund_agent_node_address = 21;
}
message RawTransactionInput {
@@ -793,6 +856,7 @@ enum AvailabilityResult {
NO_MEDIATORS = 7;
USER_IGNORED = 8;
MISSING_MANDATORY_CAPABILITY = 9;
+ NO_REFUND_AGENTS = 10;
}
///////////////////////////////////////////////////////////////////////////////////////////
@@ -1074,6 +1138,7 @@ message PersistableEnvelope {
UnconfirmedBsqChangeOutputList unconfirmed_bsq_change_output_list = 27;
SignedWitnessStore signed_witness_store = 28;
MediationDisputeList mediation_dispute_list = 29;
+ RefundDisputeList refund_dispute_list = 30;
}
}
@@ -1198,6 +1263,7 @@ message OpenOffer {
State state = 2;
NodeAddress arbitrator_node_address = 3;
NodeAddress mediator_node_address = 4;
+ NodeAddress refund_agent_node_address = 5;
}
message Tradable {
@@ -1220,13 +1286,13 @@ message Trade {
MAKER_STORED_IN_MAILBOX_PUBLISH_DEPOSIT_TX_REQUEST = 5;
MAKER_SEND_FAILED_PUBLISH_DEPOSIT_TX_REQUEST = 6;
TAKER_RECEIVED_PUBLISH_DEPOSIT_TX_REQUEST = 7;
- TAKER_PUBLISHED_DEPOSIT_TX = 8;
- TAKER_SENT_DEPOSIT_TX_PUBLISHED_MSG = 9;
- TAKER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG = 10;
- TAKER_STORED_IN_MAILBOX_DEPOSIT_TX_PUBLISHED_MSG = 11;
- TAKER_SEND_FAILED_DEPOSIT_TX_PUBLISHED_MSG = 12;
- MAKER_RECEIVED_DEPOSIT_TX_PUBLISHED_MSG = 13;
- MAKER_SAW_DEPOSIT_TX_IN_NETWORK = 14;
+ SELLER_PUBLISHED_DEPOSIT_TX = 8;
+ SELLER_SENT_DEPOSIT_TX_PUBLISHED_MSG = 9;
+ SELLER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG = 10;
+ SELLER_STORED_IN_MAILBOX_DEPOSIT_TX_PUBLISHED_MSG = 11;
+ SELLER_SEND_FAILED_DEPOSIT_TX_PUBLISHED_MSG = 12;
+ BUYER_RECEIVED_DEPOSIT_TX_PUBLISHED_MSG = 13;
+ BUYER_SAW_DEPOSIT_TX_IN_NETWORK = 14;
DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN = 15;
BUYER_CONFIRMED_IN_UI_FIAT_PAYMENT_INITIATED = 16;
BUYER_SENT_FIAT_PAYMENT_INITIATED_MSG = 17;
@@ -1266,6 +1332,9 @@ message Trade {
MEDIATION_REQUESTED = 5;
MEDIATION_STARTED_BY_PEER = 6;
MEDIATION_CLOSED = 7;
+ REFUND_REQUESTED = 8;
+ REFUND_REQUEST_STARTED_BY_PEER = 9;
+ REFUND_REQUEST_CLOSED = 10;
}
enum TradePeriodState {
@@ -1305,6 +1374,11 @@ message Trade {
string counter_currency_tx_id = 28;
repeated ChatMessage chat_message = 29;
MediationResultState mediation_result_state = 30;
+ int64 lock_time = 31;
+ bytes delayed_payout_tx_bytes = 32;
+ NodeAddress refund_agent_node_address = 33;
+ PubKeyRing refund_agent_pub_key_ring = 34;
+ RefundResultState refund_result_state = 35;
}
message BuyerAsMakerTrade {
@@ -1330,8 +1404,8 @@ message ProcessModel {
PubKeyRing pub_key_ring = 4;
string take_offer_fee_tx_id = 5;
bytes payout_tx_signature = 6;
- repeated NodeAddress taker_accepted_arbitrator_node_addresses = 7;
- repeated NodeAddress taker_accepted_mediator_node_addresses = 8;
+ reserved 7; // Not used anymore
+ reserved 8; // Not used anymore
bytes prepared_deposit_tx = 9;
repeated RawTransactionInput raw_transaction_inputs = 10;
int64 change_output_value = 11;
@@ -1376,6 +1450,10 @@ message MediationDisputeList {
repeated Dispute dispute = 1;
}
+message RefundDisputeList {
+ repeated Dispute dispute = 1;
+}
+
enum MediationResultState {
PB_ERROR_MEDIATION_RESULT = 0;
UNDEFINED_MEDIATION_RESULT = 1;
@@ -1395,6 +1473,12 @@ enum MediationResultState {
PAYOUT_TX_SEEN_IN_NETWORK = 15;
}
+//todo
+enum RefundResultState {
+ PB_ERROR_REFUND_RESULT = 0;
+ UNDEFINED_REFUND_RESULT = 1;
+}
+
///////////////////////////////////////////////////////////////////////////////////////////
// Preferences
///////////////////////////////////////////////////////////////////////////////////////////
@@ -1454,6 +1538,7 @@ message PreferencesPayload {
double buyer_security_deposit_as_percent_for_crypto = 52;
int32 block_notify_port = 53;
int32 css_theme = 54;
+ bool tac_accepted_v120 = 55;
}
///////////////////////////////////////////////////////////////////////////////////////////
@@ -1474,6 +1559,8 @@ message UserPayload {
Mediator registered_mediator = 11;
PriceAlertFilter price_alert_filter = 12;
repeated MarketAlertFilter market_alert_filters = 13;
+ repeated RefundAgent accepted_refund_agents = 14;
+ RefundAgent registered_refund_agent = 15;
}
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/core/src/main/java/bisq/core/account/sign/SignedWitness.java b/core/src/main/java/bisq/core/account/sign/SignedWitness.java
index 111bb195cb..e5af940470 100644
--- a/core/src/main/java/bisq/core/account/sign/SignedWitness.java
+++ b/core/src/main/java/bisq/core/account/sign/SignedWitness.java
@@ -26,6 +26,7 @@ import bisq.network.p2p.storage.payload.PersistableNetworkPayload;
import bisq.common.app.Capabilities;
import bisq.common.app.Capability;
import bisq.common.crypto.Hash;
+import bisq.common.proto.ProtoUtil;
import bisq.common.proto.persistable.PersistableEnvelope;
import bisq.common.util.Utilities;
@@ -46,10 +47,24 @@ import lombok.extern.slf4j.Slf4j;
@Value
public class SignedWitness implements LazyProcessedPayload, PersistableNetworkPayload, PersistableEnvelope,
DateTolerantPayload, CapabilityRequiringPayload {
+
+ public enum VerificationMethod {
+ ARBITRATOR,
+ TRADE;
+
+ public static SignedWitness.VerificationMethod fromProto(protobuf.SignedWitness.VerificationMethod method) {
+ return ProtoUtil.enumFromProto(SignedWitness.VerificationMethod.class, method.name());
+ }
+
+ public static protobuf.SignedWitness.VerificationMethod toProtoMessage(SignedWitness.VerificationMethod method) {
+ return protobuf.SignedWitness.VerificationMethod.valueOf(method.name());
+ }
+ }
+
private static final long TOLERANCE = TimeUnit.DAYS.toMillis(1);
- private final boolean signedByArbitrator;
- private final byte[] witnessHash;
+ private final VerificationMethod verificationMethod;
+ private final byte[] accountAgeWitnessHash;
private final byte[] signature;
private final byte[] signerPubKey;
private final byte[] witnessOwnerPubKey;
@@ -58,15 +73,15 @@ public class SignedWitness implements LazyProcessedPayload, PersistableNetworkPa
transient private final byte[] hash;
- public SignedWitness(boolean signedByArbitrator,
- byte[] witnessHash,
+ public SignedWitness(VerificationMethod verificationMethod,
+ byte[] accountAgeWitnessHash,
byte[] signature,
byte[] signerPubKey,
byte[] witnessOwnerPubKey,
long date,
long tradeAmount) {
- this.signedByArbitrator = signedByArbitrator;
- this.witnessHash = witnessHash.clone();
+ this.verificationMethod = verificationMethod;
+ this.accountAgeWitnessHash = accountAgeWitnessHash.clone();
this.signature = signature.clone();
this.signerPubKey = signerPubKey.clone();
this.witnessOwnerPubKey = witnessOwnerPubKey.clone();
@@ -80,7 +95,7 @@ public class SignedWitness implements LazyProcessedPayload, PersistableNetworkPa
// same peer to add more security as if that one would be colluding it would be not detected anyway. The total
// number of signed trades with different peers is still available and can be considered more valuable data for
// security.
- byte[] data = Utilities.concatenateByteArrays(witnessHash, signature);
+ byte[] data = Utilities.concatenateByteArrays(accountAgeWitnessHash, signature);
data = Utilities.concatenateByteArrays(data, signerPubKey);
hash = Hash.getSha256Ripemd160hash(data);
}
@@ -93,8 +108,8 @@ public class SignedWitness implements LazyProcessedPayload, PersistableNetworkPa
@Override
public protobuf.PersistableNetworkPayload toProtoMessage() {
final protobuf.SignedWitness.Builder builder = protobuf.SignedWitness.newBuilder()
- .setSignedByArbitrator(signedByArbitrator)
- .setWitnessHash(ByteString.copyFrom(witnessHash))
+ .setVerificationMethod(VerificationMethod.toProtoMessage(verificationMethod))
+ .setAccountAgeWitnessHash(ByteString.copyFrom(accountAgeWitnessHash))
.setSignature(ByteString.copyFrom(signature))
.setSignerPubKey(ByteString.copyFrom(signerPubKey))
.setWitnessOwnerPubKey(ByteString.copyFrom(witnessOwnerPubKey))
@@ -108,8 +123,9 @@ public class SignedWitness implements LazyProcessedPayload, PersistableNetworkPa
}
public static SignedWitness fromProto(protobuf.SignedWitness proto) {
- return new SignedWitness(proto.getSignedByArbitrator(),
- proto.getWitnessHash().toByteArray(),
+ return new SignedWitness(
+ SignedWitness.VerificationMethod.fromProto(proto.getVerificationMethod()),
+ proto.getAccountAgeWitnessHash().toByteArray(),
proto.getSignature().toByteArray(),
proto.getSignerPubKey().toByteArray(),
proto.getWitnessOwnerPubKey().toByteArray(),
@@ -124,7 +140,7 @@ public class SignedWitness implements LazyProcessedPayload, PersistableNetworkPa
@Override
public boolean isDateInTolerance(Clock clock) {
- // We don't allow older or newer then 1 day.
+ // We don't allow older or newer than 1 day.
// Preventing forward dating is also important to protect against a sophisticated attack
return Math.abs(new Date().getTime() - date) <= TOLERANCE;
}
@@ -145,6 +161,9 @@ public class SignedWitness implements LazyProcessedPayload, PersistableNetworkPa
return hash;
}
+ public boolean isSignedByArbitrator() {
+ return verificationMethod == VerificationMethod.ARBITRATOR;
+ }
///////////////////////////////////////////////////////////////////////////////////////////
// Getters
@@ -157,8 +176,8 @@ public class SignedWitness implements LazyProcessedPayload, PersistableNetworkPa
@Override
public String toString() {
return "SignedWitness{" +
- ",\n signedByArbitrator=" + signedByArbitrator +
- ",\n witnessHash=" + Utilities.bytesAsHexString(witnessHash) +
+ ",\n verificationMethod=" + verificationMethod +
+ ",\n witnessHash=" + Utilities.bytesAsHexString(accountAgeWitnessHash) +
",\n signature=" + Utilities.bytesAsHexString(signature) +
",\n signerPubKey=" + Utilities.bytesAsHexString(signerPubKey) +
",\n witnessOwnerPubKey=" + Utilities.bytesAsHexString(witnessOwnerPubKey) +
diff --git a/core/src/main/java/bisq/core/account/sign/SignedWitnessService.java b/core/src/main/java/bisq/core/account/sign/SignedWitnessService.java
index ef87a6e35f..e32061766d 100644
--- a/core/src/main/java/bisq/core/account/sign/SignedWitnessService.java
+++ b/core/src/main/java/bisq/core/account/sign/SignedWitnessService.java
@@ -18,23 +18,17 @@
package bisq.core.account.sign;
import bisq.core.account.witness.AccountAgeWitness;
-import bisq.core.account.witness.AccountAgeWitnessService;
-import bisq.core.payment.ChargeBackRisk;
-import bisq.core.payment.payload.PaymentAccountPayload;
-import bisq.core.payment.payload.PaymentMethod;
-import bisq.core.support.dispute.Dispute;
-import bisq.core.support.dispute.DisputeResult;
-import bisq.core.support.dispute.arbitration.ArbitrationManager;
-import bisq.core.support.dispute.arbitration.BuyerDataItem;
import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager;
+import bisq.core.user.User;
+import bisq.network.p2p.BootstrapListener;
import bisq.network.p2p.P2PService;
import bisq.network.p2p.storage.P2PDataStorage;
import bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService;
+import bisq.common.UserThread;
import bisq.common.crypto.CryptoException;
import bisq.common.crypto.KeyRing;
-import bisq.common.crypto.PubKeyRing;
import bisq.common.crypto.Sig;
import bisq.common.util.Utilities;
@@ -57,30 +51,24 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
import java.util.Set;
import java.util.Stack;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
-import org.jetbrains.annotations.Nullable;
-
@Slf4j
public class SignedWitnessService {
- public static final long CHARGEBACK_SAFETY_DAYS = 30;
+ public static final long SIGNER_AGE_DAYS = 30;
+ public static final long SIGNER_AGE = SIGNER_AGE_DAYS * ChronoUnit.DAYS.getDuration().toMillis();
private final KeyRing keyRing;
private final P2PService p2PService;
- private final AccountAgeWitnessService accountAgeWitnessService;
private final ArbitratorManager arbitratorManager;
- private final ArbitrationManager arbitrationManager;
- private final ChargeBackRisk chargeBackRisk;
+ private final User user;
private final Map signedWitnessMap = new HashMap<>();
-
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
///////////////////////////////////////////////////////////////////////////////////////////
@@ -88,18 +76,14 @@ public class SignedWitnessService {
@Inject
public SignedWitnessService(KeyRing keyRing,
P2PService p2PService,
- AccountAgeWitnessService accountAgeWitnessService,
ArbitratorManager arbitratorManager,
SignedWitnessStorageService signedWitnessStorageService,
AppendOnlyDataStoreService appendOnlyDataStoreService,
- ArbitrationManager arbitrationManager,
- ChargeBackRisk chargeBackRisk) {
+ User user) {
this.keyRing = keyRing;
this.p2PService = p2PService;
- this.accountAgeWitnessService = accountAgeWitnessService;
this.arbitratorManager = arbitratorManager;
- this.arbitrationManager = arbitrationManager;
- this.chargeBackRisk = chargeBackRisk;
+ this.user = user;
// We need to add that early (before onAllServicesInitialized) as it will be used at startup.
appendOnlyDataStoreService.addService(signedWitnessStorageService);
@@ -121,15 +105,45 @@ public class SignedWitnessService {
if (e instanceof SignedWitness)
addToMap((SignedWitness) e);
});
+
+ if (p2PService.isBootstrapped()) {
+ onBootstrapComplete();
+ } else {
+ p2PService.addP2PServiceListener(new BootstrapListener() {
+ @Override
+ public void onUpdatedDataReceived() {
+ onBootstrapComplete();
+ }
+ });
+ }
}
+ private void onBootstrapComplete() {
+ if (user.getRegisteredArbitrator() != null) {
+ UserThread.runAfter(this::doRepublishAllSignedWitnesses, 60);
+ }
+ }
///////////////////////////////////////////////////////////////////////////////////////////
// API
///////////////////////////////////////////////////////////////////////////////////////////
- public List getMyWitnessAgeList(PaymentAccountPayload myPaymentAccountPayload) {
- AccountAgeWitness accountAgeWitness = accountAgeWitnessService.getMyWitness(myPaymentAccountPayload);
+ /**
+ * List of dates as long when accountAgeWitness was signed
+ */
+ public List getVerifiedWitnessDateList(AccountAgeWitness accountAgeWitness) {
+ return getSignedWitnessSet(accountAgeWitness).stream()
+ .filter(this::verifySignature)
+ .map(SignedWitness::getDate)
+ .sorted()
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * List of dates as long when accountAgeWitness was signed
+ * Not verifying that signatures are correct
+ */
+ public List getWitnessDateList(AccountAgeWitness accountAgeWitness) {
// We do not validate as it would not make sense to cheat one self...
return getSignedWitnessSet(accountAgeWitness).stream()
.map(SignedWitness::getDate)
@@ -137,24 +151,26 @@ public class SignedWitnessService {
.collect(Collectors.toList());
}
-
- public List getVerifiedWitnessAgeList(AccountAgeWitness accountAgeWitness) {
- return signedWitnessMap.values().stream()
- .filter(e -> Arrays.equals(e.getWitnessHash(), accountAgeWitness.getHash()))
- .filter(this::verifySignature)
- .map(SignedWitness::getDate)
- .sorted()
- .collect(Collectors.toList());
+ public boolean isSignedByArbitrator(AccountAgeWitness accountAgeWitness) {
+ return getSignedWitnessSet(accountAgeWitness).stream()
+ .map(SignedWitness::isSignedByArbitrator)
+ .findAny()
+ .orElse(false);
}
// Arbitrators sign with EC key
- public SignedWitness signAccountAgeWitness(Coin tradeAmount,
- AccountAgeWitness accountAgeWitness,
- ECKey key,
- PublicKey peersPubKey) {
+ public void signAccountAgeWitness(Coin tradeAmount,
+ AccountAgeWitness accountAgeWitness,
+ ECKey key,
+ PublicKey peersPubKey) {
+ if (isSignedAccountAgeWitness(accountAgeWitness)) {
+ log.warn("Arbitrator trying to sign already signed accountagewitness {}", accountAgeWitness.toString());
+ return;
+ }
+
String accountAgeWitnessHashAsHex = Utilities.encodeToHex(accountAgeWitness.getHash());
String signatureBase64 = key.signMessage(accountAgeWitnessHashAsHex);
- SignedWitness signedWitness = new SignedWitness(true,
+ SignedWitness signedWitness = new SignedWitness(SignedWitness.VerificationMethod.ARBITRATOR,
accountAgeWitness.getHash(),
signatureBase64.getBytes(Charsets.UTF_8),
key.getPubKey(),
@@ -162,15 +178,20 @@ public class SignedWitnessService {
new Date().getTime(),
tradeAmount.value);
publishSignedWitness(signedWitness);
- return signedWitness;
+ log.info("Arbitrator signed witness {}", signedWitness.toString());
}
// Any peer can sign with DSA key
- public SignedWitness signAccountAgeWitness(Coin tradeAmount,
- AccountAgeWitness accountAgeWitness,
- PublicKey peersPubKey) throws CryptoException {
+ public void signAccountAgeWitness(Coin tradeAmount,
+ AccountAgeWitness accountAgeWitness,
+ PublicKey peersPubKey) throws CryptoException {
+ if (isSignedAccountAgeWitness(accountAgeWitness)) {
+ log.warn("Trader trying to sign already signed accountagewitness {}", accountAgeWitness.toString());
+ return;
+ }
+
byte[] signature = Sig.sign(keyRing.getSignatureKeyPair().getPrivate(), accountAgeWitness.getHash());
- SignedWitness signedWitness = new SignedWitness(false,
+ SignedWitness signedWitness = new SignedWitness(SignedWitness.VerificationMethod.TRADE,
accountAgeWitness.getHash(),
signature,
keyRing.getSignatureKeyPair().getPublic().getEncoded(),
@@ -178,7 +199,7 @@ public class SignedWitnessService {
new Date().getTime(),
tradeAmount.value);
publishSignedWitness(signedWitness);
- return signedWitness;
+ log.info("Trader signed witness {}", signedWitness.toString());
}
public boolean verifySignature(SignedWitness signedWitness) {
@@ -191,7 +212,7 @@ public class SignedWitnessService {
private boolean verifySignatureWithECKey(SignedWitness signedWitness) {
try {
- String message = Utilities.encodeToHex(signedWitness.getWitnessHash());
+ String message = Utilities.encodeToHex(signedWitness.getAccountAgeWitnessHash());
String signatureBase64 = new String(signedWitness.getSignature(), Charsets.UTF_8);
ECKey key = ECKey.fromPublicOnly(signedWitness.getSignerPubKey());
if (arbitratorManager.isPublicKeyInList(Utilities.encodeToHex(key.getPubKey()))) {
@@ -211,7 +232,7 @@ public class SignedWitnessService {
private boolean verifySignatureWithDSAKey(SignedWitness signedWitness) {
try {
PublicKey signaturePubKey = Sig.getPublicKeyFromBytes(signedWitness.getSignerPubKey());
- Sig.verify(signaturePubKey, signedWitness.getWitnessHash(), signedWitness.getSignature());
+ Sig.verify(signaturePubKey, signedWitness.getAccountAgeWitnessHash(), signedWitness.getSignature());
return true;
} catch (CryptoException e) {
log.warn("verifySignature signedWitness failed. signedWitness={}", signedWitness);
@@ -220,9 +241,9 @@ public class SignedWitnessService {
}
}
- public Set getSignedWitnessSet(AccountAgeWitness accountAgeWitness) {
+ private Set getSignedWitnessSet(AccountAgeWitness accountAgeWitness) {
return signedWitnessMap.values().stream()
- .filter(e -> Arrays.equals(e.getWitnessHash(), accountAgeWitness.getHash()))
+ .filter(e -> Arrays.equals(e.getAccountAgeWitnessHash(), accountAgeWitness.getHash()))
.collect(Collectors.toSet());
}
@@ -230,7 +251,7 @@ public class SignedWitnessService {
public Set getArbitratorsSignedWitnessSet(AccountAgeWitness accountAgeWitness) {
return signedWitnessMap.values().stream()
.filter(SignedWitness::isSignedByArbitrator)
- .filter(e -> Arrays.equals(e.getWitnessHash(), accountAgeWitness.getHash()))
+ .filter(e -> Arrays.equals(e.getAccountAgeWitnessHash(), accountAgeWitness.getHash()))
.collect(Collectors.toSet());
}
@@ -238,31 +259,41 @@ public class SignedWitnessService {
public Set getTrustedPeerSignedWitnessSet(AccountAgeWitness accountAgeWitness) {
return signedWitnessMap.values().stream()
.filter(e -> !e.isSignedByArbitrator())
- .filter(e -> Arrays.equals(e.getWitnessHash(), accountAgeWitness.getHash()))
+ .filter(e -> Arrays.equals(e.getAccountAgeWitnessHash(), accountAgeWitness.getHash()))
.collect(Collectors.toSet());
}
// We go one level up by using the signer Key to lookup for SignedWitness objects which contain the signerKey as
// witnessOwnerPubKey
- public Set getSignedWitnessSetByOwnerPubKey(byte[] ownerPubKey,
- Stack excluded) {
+ private Set getSignedWitnessSetByOwnerPubKey(byte[] ownerPubKey,
+ Stack excluded) {
return signedWitnessMap.values().stream()
.filter(e -> Arrays.equals(e.getWitnessOwnerPubKey(), ownerPubKey))
.filter(e -> !excluded.contains(new P2PDataStorage.ByteArray(e.getSignerPubKey())))
.collect(Collectors.toSet());
}
+ public boolean isSignedAccountAgeWitness(AccountAgeWitness accountAgeWitness) {
+ return isSignerAccountAgeWitness(accountAgeWitness, new Date().getTime() + SIGNER_AGE);
+ }
+
+ public boolean isSignerAccountAgeWitness(AccountAgeWitness accountAgeWitness) {
+ return isSignerAccountAgeWitness(accountAgeWitness, new Date().getTime());
+ }
+
/**
- * Checks whether the accountAgeWitness has a valid signature from a peer/arbitrator.
- * @param accountAgeWitness
- * @return true if accountAgeWitness is valid, false otherwise.
+ * Checks whether the accountAgeWitness has a valid signature from a peer/arbitrator and is allowed to sign
+ * other accounts.
+ *
+ * @param accountAgeWitness accountAgeWitness
+ * @param time time of signing
+ * @return true if accountAgeWitness is allowed to sign at time, false otherwise.
*/
- public boolean isValidAccountAgeWitness(AccountAgeWitness accountAgeWitness) {
+ private boolean isSignerAccountAgeWitness(AccountAgeWitness accountAgeWitness, long time) {
Stack excludedPubKeys = new Stack<>();
- long now = new Date().getTime();
Set signedWitnessSet = getSignedWitnessSet(accountAgeWitness);
for (SignedWitness signedWitness : signedWitnessSet) {
- if (isValidSignedWitnessInternal(signedWitness, now, excludedPubKeys)) {
+ if (isValidSignerWitnessInternal(signedWitness, time, excludedPubKeys)) {
return true;
}
}
@@ -272,12 +303,13 @@ public class SignedWitnessService {
/**
* Helper to isValidAccountAgeWitness(accountAgeWitness)
- * @param signedWitness the signedWitness to validate
+ *
+ * @param signedWitness the signedWitness to validate
* @param childSignedWitnessDateMillis the date the child SignedWitness was signed or current time if it is a leave.
- * @param excludedPubKeys stack to prevent recursive loops
+ * @param excludedPubKeys stack to prevent recursive loops
* @return true if signedWitness is valid, false otherwise.
*/
- private boolean isValidSignedWitnessInternal(SignedWitness signedWitness,
+ private boolean isValidSignerWitnessInternal(SignedWitness signedWitness,
long childSignedWitnessDateMillis,
Stack excludedPubKeys) {
if (!verifySignature(signedWitness)) {
@@ -299,7 +331,7 @@ public class SignedWitnessService {
// Iterate over signedWitness signers
Set signerSignedWitnessSet = getSignedWitnessSetByOwnerPubKey(signedWitness.getSignerPubKey(), excludedPubKeys);
for (SignedWitness signerSignedWitness : signerSignedWitnessSet) {
- if (isValidSignedWitnessInternal(signerSignedWitness, signedWitness.getDate(), excludedPubKeys)) {
+ if (isValidSignerWitnessInternal(signerSignedWitness, signedWitness.getDate(), excludedPubKeys)) {
return true;
}
}
@@ -311,7 +343,8 @@ public class SignedWitnessService {
}
private boolean verifyDate(SignedWitness signedWitness, long childSignedWitnessDateMillis) {
- long childSignedWitnessDateMinusChargebackPeriodMillis = Instant.ofEpochMilli(childSignedWitnessDateMillis).minus(CHARGEBACK_SAFETY_DAYS, ChronoUnit.DAYS).toEpochMilli();
+ long childSignedWitnessDateMinusChargebackPeriodMillis = Instant.ofEpochMilli(
+ childSignedWitnessDateMillis).minus(SIGNER_AGE, ChronoUnit.MILLIS).toEpochMilli();
long signedWitnessDateMillis = signedWitness.getDate();
return signedWitnessDateMillis <= childSignedWitnessDateMinusChargebackPeriodMillis;
}
@@ -322,49 +355,18 @@ public class SignedWitnessService {
@VisibleForTesting
void addToMap(SignedWitness signedWitness) {
+ // TODO: Perhaps filter out all but one signedwitness per accountagewitness
signedWitnessMap.putIfAbsent(signedWitness.getHashAsByteArray(), signedWitness);
}
private void publishSignedWitness(SignedWitness signedWitness) {
if (!signedWitnessMap.containsKey(signedWitness.getHashAsByteArray())) {
+ log.info("broadcast signed witness {}", signedWitness.toString());
p2PService.addPersistableNetworkPayload(signedWitness, false);
}
}
- // Arbitrator signing
- public List getBuyerPaymentAccounts(long safeDate, PaymentMethod paymentMethod) {
- return arbitrationManager.getDisputesAsObservableList().stream()
- .filter(dispute -> dispute.getContract().getPaymentMethodId().equals(paymentMethod.getId()))
- .filter(this::hasChargebackRisk)
- .filter(this::isBuyerWinner)
- .map(this::getBuyerData)
- .filter(Objects::nonNull)
- .filter(buyerDataItem -> buyerDataItem.getAccountAgeWitness().getDate() < safeDate)
- .distinct()
- .collect(Collectors.toList());
+ private void doRepublishAllSignedWitnesses() {
+ signedWitnessMap.forEach((e, signedWitness) -> p2PService.addPersistableNetworkPayload(signedWitness, true));
}
-
- private boolean hasChargebackRisk(Dispute dispute) {
- return chargeBackRisk.hasChargebackRisk(dispute.getContract().getPaymentMethodId(),
- dispute.getContract().getOfferPayload().getCurrencyCode());
- }
-
- private boolean isBuyerWinner(Dispute dispute) {
- return dispute.getDisputeResultProperty().get().getWinner() == DisputeResult.Winner.BUYER;
- }
-
- @Nullable
- private BuyerDataItem getBuyerData(Dispute dispute) {
- PubKeyRing buyerPubKeyRing = dispute.getContract().getBuyerPubKeyRing();
- PaymentAccountPayload buyerPaymentAccountPaload = dispute.getContract().getBuyerPaymentAccountPayload();
- Optional optionalWitness = accountAgeWitnessService
- .findWitness(buyerPaymentAccountPaload, buyerPubKeyRing);
- return optionalWitness.map(witness -> new BuyerDataItem(
- buyerPaymentAccountPaload,
- witness,
- dispute.getContract().getTradeAmount(),
- dispute.getContract().getSellerPubKeyRing().getSignaturePubKey()))
- .orElse(null);
- }
-
}
diff --git a/core/src/main/java/bisq/core/account/witness/AccountAgeRestrictions.java b/core/src/main/java/bisq/core/account/witness/AccountAgeRestrictions.java
deleted file mode 100644
index 04c6ab2af4..0000000000
--- a/core/src/main/java/bisq/core/account/witness/AccountAgeRestrictions.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * This file is part of Bisq.
- *
- * Bisq is free software: you can redistribute it and/or modify it
- * under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or (at
- * your option) any later version.
- *
- * Bisq is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
- * License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with Bisq. If not, see .
- */
-
-package bisq.core.account.witness;
-
-import bisq.core.offer.Offer;
-import bisq.core.offer.OfferPayload;
-import bisq.core.offer.OfferRestrictions;
-import bisq.core.payment.PaymentAccount;
-import bisq.core.payment.payload.PaymentMethod;
-import bisq.core.trade.Trade;
-
-import bisq.common.util.Utilities;
-
-import java.util.Date;
-import java.util.GregorianCalendar;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class AccountAgeRestrictions {
- private static final long SAFE_ACCOUNT_AGE_DATE = Utilities.getUTCDate(2019, GregorianCalendar.MARCH, 1).getTime();
-
- public static boolean isMakersAccountAgeImmature(AccountAgeWitnessService accountAgeWitnessService, Offer offer) {
- long accountCreationDate = new Date().getTime() - accountAgeWitnessService.getMakersAccountAge(offer, new Date());
- return accountCreationDate > SAFE_ACCOUNT_AGE_DATE;
- }
-
- public static boolean isTradePeersAccountAgeImmature(AccountAgeWitnessService accountAgeWitnessService, Trade trade) {
- long accountCreationDate = new Date().getTime() - accountAgeWitnessService.getTradingPeersAccountAge(trade);
- return accountCreationDate > SAFE_ACCOUNT_AGE_DATE;
- }
-
- public static boolean isMyAccountAgeImmature(AccountAgeWitnessService accountAgeWitnessService, PaymentAccount myPaymentAccount) {
- long accountCreationDate = new Date().getTime() - accountAgeWitnessService.getMyAccountAge(myPaymentAccount.getPaymentAccountPayload());
- return accountCreationDate > SAFE_ACCOUNT_AGE_DATE;
- }
-
- public static long getMyTradeLimitAtCreateOffer(AccountAgeWitnessService accountAgeWitnessService,
- PaymentAccount paymentAccount,
- String currencyCode,
- OfferPayload.Direction direction) {
- if (direction == OfferPayload.Direction.BUY &&
- PaymentMethod.hasChargebackRisk(paymentAccount.getPaymentMethod(), currencyCode) &&
- AccountAgeRestrictions.isMyAccountAgeImmature(accountAgeWitnessService, paymentAccount)) {
- return OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT.value;
- } else {
- return accountAgeWitnessService.getMyTradeLimit(paymentAccount, currencyCode);
- }
- }
-
- public static long getMyTradeLimitAtTakeOffer(AccountAgeWitnessService accountAgeWitnessService,
- PaymentAccount paymentAccount,
- Offer offer,
- String currencyCode,
- OfferPayload.Direction direction) {
- if (direction == OfferPayload.Direction.BUY &&
- PaymentMethod.hasChargebackRisk(paymentAccount.getPaymentMethod(), currencyCode) &&
- AccountAgeRestrictions.isMakersAccountAgeImmature(accountAgeWitnessService, offer)) {
- // Taker is seller
- return OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT.value;
- } else if (direction == OfferPayload.Direction.SELL &&
- PaymentMethod.hasChargebackRisk(paymentAccount.getPaymentMethod(), currencyCode) &&
- AccountAgeRestrictions.isMyAccountAgeImmature(accountAgeWitnessService, paymentAccount)) {
- // Taker is buyer
- return OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT.value;
- } else {
- // Offers with no chargeback risk or mature buyer accounts
- return accountAgeWitnessService.getMyTradeLimit(paymentAccount, currencyCode);
- }
- }
-}
diff --git a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java
index 74f7d276d3..37df8b9a63 100644
--- a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java
+++ b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java
@@ -17,12 +17,22 @@
package bisq.core.account.witness;
+import bisq.core.account.sign.SignedWitnessService;
+import bisq.core.filter.FilterManager;
+import bisq.core.filter.PaymentAccountFilter;
import bisq.core.locale.CurrencyUtil;
+import bisq.core.locale.Res;
import bisq.core.offer.Offer;
+import bisq.core.offer.OfferPayload;
+import bisq.core.offer.OfferRestrictions;
import bisq.core.payment.AssetAccount;
+import bisq.core.payment.ChargeBackRisk;
import bisq.core.payment.PaymentAccount;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.payment.payload.PaymentMethod;
+import bisq.core.support.dispute.Dispute;
+import bisq.core.support.dispute.DisputeResult;
+import bisq.core.support.dispute.arbitration.TraderDataItem;
import bisq.core.trade.Trade;
import bisq.core.trade.protocol.TradingPeer;
import bisq.core.user.User;
@@ -43,6 +53,7 @@ import bisq.common.util.MathUtils;
import bisq.common.util.Utilities;
import org.bitcoinj.core.Coin;
+import org.bitcoinj.core.ECKey;
import javax.inject.Inject;
@@ -52,10 +63,14 @@ import java.util.Arrays;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
import java.util.Random;
import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import lombok.extern.slf4j.Slf4j;
@@ -65,16 +80,40 @@ import static com.google.common.base.Preconditions.checkNotNull;
public class AccountAgeWitnessService {
private static final Date RELEASE = Utilities.getUTCDate(2017, GregorianCalendar.NOVEMBER, 11);
public static final Date FULL_ACTIVATION = Utilities.getUTCDate(2018, GregorianCalendar.FEBRUARY, 15);
+ private static final long SAFE_ACCOUNT_AGE_DATE = Utilities.getUTCDate(2019, GregorianCalendar.MARCH, 1).getTime();
public enum AccountAge {
+ UNVERIFIED,
LESS_ONE_MONTH,
ONE_TO_TWO_MONTHS,
TWO_MONTHS_OR_MORE
}
+ public enum SignState {
+ UNSIGNED(Res.get("offerbook.timeSinceSigning.notSigned")),
+ ARBITRATOR(Res.get("offerbook.timeSinceSigning.info.arbitrator")),
+ PEER_INITIAL(Res.get("offerbook.timeSinceSigning.info.peer")),
+ PEER_LIMIT_LIFTED(Res.get("offerbook.timeSinceSigning.info.peerLimitLifted")),
+ PEER_SIGNER(Res.get("offerbook.timeSinceSigning.info.signer"));
+
+ private String presentation;
+
+ SignState(String presentation) {
+ this.presentation = presentation;
+ }
+
+ public String getPresentation() {
+ return presentation;
+ }
+
+ }
+
private final KeyRing keyRing;
private final P2PService p2PService;
private final User user;
+ private final SignedWitnessService signedWitnessService;
+ private final ChargeBackRisk chargeBackRisk;
+ private final FilterManager filterManager;
private final Map accountAgeWitnessMap = new HashMap<>();
@@ -85,12 +124,20 @@ public class AccountAgeWitnessService {
@Inject
- public AccountAgeWitnessService(KeyRing keyRing, P2PService p2PService, User user,
+ public AccountAgeWitnessService(KeyRing keyRing,
+ P2PService p2PService,
+ User user,
+ SignedWitnessService signedWitnessService,
+ ChargeBackRisk chargeBackRisk,
AccountAgeWitnessStorageService accountAgeWitnessStorageService,
- AppendOnlyDataStoreService appendOnlyDataStoreService) {
+ AppendOnlyDataStoreService appendOnlyDataStoreService,
+ FilterManager filterManager) {
this.keyRing = keyRing;
this.p2PService = p2PService;
this.user = user;
+ this.signedWitnessService = signedWitnessService;
+ this.chargeBackRisk = chargeBackRisk;
+ this.filterManager = filterManager;
// We need to add that early (before onAllServicesInitialized) as it will be used at startup.
appendOnlyDataStoreService.addService(accountAgeWitnessStorageService);
@@ -164,7 +211,8 @@ public class AccountAgeWitnessService {
return new AccountAgeWitness(hash, new Date().getTime());
}
- public Optional findWitness(PaymentAccountPayload paymentAccountPayload, PubKeyRing pubKeyRing) {
+ private Optional findWitness(PaymentAccountPayload paymentAccountPayload,
+ PubKeyRing pubKeyRing) {
byte[] accountInputDataWithSalt = getAccountInputDataWithSalt(paymentAccountPayload);
byte[] hash = Hash.getSha256Ripemd160hash(Utilities.concatenateByteArrays(accountInputDataWithSalt,
pubKeyRing.getSignaturePubKeyBytes()));
@@ -172,6 +220,19 @@ public class AccountAgeWitnessService {
return getWitnessByHash(hash);
}
+ private Optional findWitness(Offer offer) {
+ final Optional accountAgeWitnessHash = offer.getAccountAgeWitnessHashAsHex();
+ return accountAgeWitnessHash.isPresent() ?
+ getWitnessByHashAsHex(accountAgeWitnessHash.get()) :
+ Optional.empty();
+ }
+
+ private Optional findTradePeerWitness(Trade trade) {
+ TradingPeer tradingPeer = trade.getProcessModel().getTradingPeer();
+ return (tradingPeer.getPaymentAccountPayload() == null || tradingPeer.getPubKeyRing() == null) ?
+ Optional.empty() : findWitness(tradingPeer.getPaymentAccountPayload(), tradingPeer.getPubKeyRing());
+ }
+
private Optional getWitnessByHash(byte[] hash) {
P2PDataStorage.ByteArray hashAsByteArray = new P2PDataStorage.ByteArray(hash);
@@ -186,19 +247,57 @@ public class AccountAgeWitnessService {
return getWitnessByHash(Utilities.decodeFromHex(hashAsHex));
}
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Witness age
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
public long getAccountAge(AccountAgeWitness accountAgeWitness, Date now) {
log.debug("getAccountAge now={}, accountAgeWitness.getDate()={}", now.getTime(), accountAgeWitness.getDate());
return now.getTime() - accountAgeWitness.getDate();
}
+ // Return -1 if no witness found
public long getAccountAge(PaymentAccountPayload paymentAccountPayload, PubKeyRing pubKeyRing) {
return findWitness(paymentAccountPayload, pubKeyRing)
.map(accountAgeWitness -> getAccountAge(accountAgeWitness, new Date()))
.orElse(-1L);
}
- public AccountAge getAccountAgeCategory(long accountAge) {
- if (accountAge < TimeUnit.DAYS.toMillis(30)) {
+ public long getAccountAge(Offer offer) {
+ return findWitness(offer)
+ .map(accountAgeWitness -> getAccountAge(accountAgeWitness, new Date()))
+ .orElse(-1L);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Signed age
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ // Return -1 if not signed
+ public long getWitnessSignAge(AccountAgeWitness accountAgeWitness, Date now) {
+ List dates = signedWitnessService.getVerifiedWitnessDateList(accountAgeWitness);
+ if (dates.isEmpty()) {
+ return -1L;
+ } else {
+ return now.getTime() - dates.get(0);
+ }
+ }
+
+ // Return -1 if not signed
+ public long getWitnessSignAge(Offer offer, Date now) {
+ return findWitness(offer)
+ .map(witness -> getWitnessSignAge(witness, now))
+ .orElse(-1L);
+ }
+
+ public AccountAge getPeersAccountAgeCategory(long peersAccountAge) {
+ return getAccountAgeCategory(peersAccountAge);
+ }
+
+ private AccountAge getAccountAgeCategory(long accountAge) {
+ if (accountAge < 0) {
+ return AccountAge.UNVERIFIED;
+ } else if (accountAge < TimeUnit.DAYS.toMillis(30)) {
return AccountAge.LESS_ONE_MONTH;
} else if (accountAge < TimeUnit.DAYS.toMillis(60)) {
return AccountAge.ONE_TO_TWO_MONTHS;
@@ -207,41 +306,85 @@ public class AccountAgeWitnessService {
}
}
- private long getTradeLimit(Coin maxTradeLimit, String currencyCode, Optional accountAgeWitnessOptional, Date now) {
+ // Checks trade limit based on time since signing of AccountAgeWitness
+ private long getTradeLimit(Coin maxTradeLimit,
+ String currencyCode,
+ AccountAgeWitness accountAgeWitness,
+ AccountAge accountAgeCategory,
+ OfferPayload.Direction direction,
+ PaymentMethod paymentMethod) {
if (CurrencyUtil.isFiatCurrency(currencyCode)) {
double factor;
-
- final long accountAge = getAccountAge((accountAgeWitnessOptional.get()), now);
- AccountAge accountAgeCategory = accountAgeWitnessOptional
- .map(accountAgeWitness -> getAccountAgeCategory(accountAge))
- .orElse(AccountAge.LESS_ONE_MONTH);
-
- switch (accountAgeCategory) {
- case TWO_MONTHS_OR_MORE:
- factor = 1;
- break;
- case ONE_TO_TWO_MONTHS:
- factor = 0.5;
- break;
- case LESS_ONE_MONTH:
- default:
- factor = 0.25;
- break;
+ boolean isRisky = PaymentMethod.hasChargebackRisk(paymentMethod, currencyCode);
+ if (!isRisky || direction == OfferPayload.Direction.SELL) {
+ // Get age of witness rather than time since signing for non risky payment methods and for selling
+ accountAgeCategory = getAccountAgeCategory(getAccountAge(accountAgeWitness, new Date()));
+ }
+ long limit = OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT.value;
+ if (direction == OfferPayload.Direction.BUY && isRisky) {
+ // Used only for bying of BTC with risky payment methods
+ switch (accountAgeCategory) {
+ case TWO_MONTHS_OR_MORE:
+ factor = 1;
+ break;
+ case ONE_TO_TWO_MONTHS:
+ factor = 0.5;
+ break;
+ case LESS_ONE_MONTH:
+ case UNVERIFIED:
+ default:
+ factor = 0;
+ }
+ } else {
+ // Used by non risky payment methods and for selling BTC with risky methods
+ switch (accountAgeCategory) {
+ case TWO_MONTHS_OR_MORE:
+ factor = 1;
+ break;
+ case ONE_TO_TWO_MONTHS:
+ factor = 0.5;
+ break;
+ case LESS_ONE_MONTH:
+ case UNVERIFIED:
+ factor = 0.25;
+ break;
+ default:
+ factor = 0;
+ }
+ }
+ if (factor > 0) {
+ limit = MathUtils.roundDoubleToLong((double) maxTradeLimit.value * factor);
}
- final long limit = MathUtils.roundDoubleToLong((double) maxTradeLimit.value * factor);
- log.debug("accountAgeCategory={}, accountAge={}, limit={}, factor={}, accountAgeWitnessHash={}",
+ log.debug("accountAgeCategory={}, limit={}, factor={}, accountAgeWitnessHash={}",
accountAgeCategory,
- accountAge / TimeUnit.DAYS.toMillis(1) + " days",
Coin.valueOf(limit).toFriendlyString(),
factor,
- accountAgeWitnessOptional.map(accountAgeWitness -> Utilities.bytesAsHexString(accountAgeWitness.getHash())).orElse("accountAgeWitnessOptional not present"));
+ Utilities.bytesAsHexString(accountAgeWitness.getHash()));
return limit;
} else {
return maxTradeLimit.value;
}
}
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Trade limit exceptions
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ private boolean isImmature(AccountAgeWitness accountAgeWitness) {
+ return accountAgeWitness.getDate() > SAFE_ACCOUNT_AGE_DATE;
+ }
+
+ public boolean myHasTradeLimitException(PaymentAccount myPaymentAccount) {
+ return hasTradeLimitException(getMyWitness(myPaymentAccount.getPaymentAccountPayload()));
+ }
+
+ // There are no trade limits on accounts that
+ // - are mature
+ // - were signed by an arbitrator
+ private boolean hasTradeLimitException(AccountAgeWitness accountAgeWitness) {
+ return !isImmature(accountAgeWitness) || signedWitnessService.isSignedByArbitrator(accountAgeWitness);
+ }
///////////////////////////////////////////////////////////////////////////////////////////
// My witness
@@ -264,44 +407,27 @@ public class AccountAgeWitnessService {
return getAccountAge(getMyWitness(paymentAccountPayload), new Date());
}
- public long getMyTradeLimit(PaymentAccount paymentAccount, String currencyCode) {
+ public long getMyTradeLimit(PaymentAccount paymentAccount, String currencyCode, OfferPayload.Direction
+ direction) {
if (paymentAccount == null)
return 0;
- Optional witnessOptional = Optional.of(getMyWitness(paymentAccount.getPaymentAccountPayload()));
- return getTradeLimit(paymentAccount.getPaymentMethod().getMaxTradeLimitAsCoin(currencyCode),
- currencyCode,
- witnessOptional,
- new Date());
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Peers witness
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- // Return -1 if witness data is not found (old versions)
- public long getMakersAccountAge(Offer offer, Date peersCurrentDate) {
- final Optional accountAgeWitnessHash = offer.getAccountAgeWitnessHashAsHex();
- final Optional witnessByHashAsHex = accountAgeWitnessHash.isPresent() ?
- getWitnessByHashAsHex(accountAgeWitnessHash.get()) :
- Optional.empty();
- return witnessByHashAsHex
- .map(accountAgeWitness -> getAccountAge(accountAgeWitness, peersCurrentDate))
- .orElse(-1L);
- }
-
- public long getTradingPeersAccountAge(Trade trade) {
- TradingPeer tradingPeer = trade.getProcessModel().getTradingPeer();
- if (tradingPeer.getPaymentAccountPayload() == null || tradingPeer.getPubKeyRing() == null) {
- // unexpected
- return -1;
+ AccountAgeWitness accountAgeWitness = getMyWitness(paymentAccount.getPaymentAccountPayload());
+ Coin maxTradeLimit = paymentAccount.getPaymentMethod().getMaxTradeLimitAsCoin(currencyCode);
+ if (hasTradeLimitException(accountAgeWitness)) {
+ return maxTradeLimit.value;
}
+ final long accountSignAge = getWitnessSignAge(accountAgeWitness, new Date());
+ AccountAge accountAgeCategory = getAccountAgeCategory(accountSignAge);
- return getAccountAge(tradingPeer.getPaymentAccountPayload(), tradingPeer.getPubKeyRing());
+ return getTradeLimit(maxTradeLimit,
+ currencyCode,
+ accountAgeWitness,
+ accountAgeCategory,
+ direction,
+ paymentAccount.getPaymentMethod());
}
-
///////////////////////////////////////////////////////////////////////////////////////////
// Verification
///////////////////////////////////////////////////////////////////////////////////////////
@@ -343,7 +469,8 @@ public class AccountAgeWitnessService {
return false;
// Check if the peers trade limit is not less than the trade amount
- if (!verifyPeersTradeLimit(trade, peersWitness, peersCurrentDate, errorMessageHandler)) {
+ if (!verifyPeersTradeLimit(trade.getOffer(), trade.getTradeAmount(), peersWitness, peersCurrentDate,
+ errorMessageHandler)) {
log.error("verifyPeersTradeLimit failed: peersPaymentAccountPayload {}", peersPaymentAccountPayload);
return false;
}
@@ -351,12 +478,22 @@ public class AccountAgeWitnessService {
return verifySignature(peersPubKeyRing.getSignaturePubKey(), nonce, signature, errorMessageHandler);
}
+ public boolean verifyPeersTradeAmount(Offer offer,
+ Coin tradeAmount,
+ ErrorMessageHandler errorMessageHandler) {
+ checkNotNull(offer);
+ return findWitness(offer)
+ .map(witness -> verifyPeersTradeLimit(offer, tradeAmount, witness, new Date(), errorMessageHandler))
+ .orElse(false);
+ }
///////////////////////////////////////////////////////////////////////////////////////////
// Package scope verification subroutines
///////////////////////////////////////////////////////////////////////////////////////////
- boolean isDateAfterReleaseDate(long witnessDateAsLong, Date ageWitnessReleaseDate, ErrorMessageHandler errorMessageHandler) {
+ boolean isDateAfterReleaseDate(long witnessDateAsLong,
+ Date ageWitnessReleaseDate,
+ ErrorMessageHandler errorMessageHandler) {
// Release date minus 1 day as tolerance for not synced clocks
Date releaseDateWithTolerance = new Date(ageWitnessReleaseDate.getTime() - TimeUnit.DAYS.toMillis(1));
final Date witnessDate = new Date(witnessDateAsLong);
@@ -394,16 +531,23 @@ public class AccountAgeWitnessService {
return result;
}
- private boolean verifyPeersTradeLimit(Trade trade,
+ private boolean verifyPeersTradeLimit(Offer offer,
+ Coin tradeAmount,
AccountAgeWitness peersWitness,
Date peersCurrentDate,
ErrorMessageHandler errorMessageHandler) {
- Offer offer = trade.getOffer();
- Coin tradeAmount = checkNotNull(trade.getTradeAmount());
checkNotNull(offer);
final String currencyCode = offer.getCurrencyCode();
final Coin defaultMaxTradeLimit = PaymentMethod.getPaymentMethodById(offer.getOfferPayload().getPaymentMethodId()).getMaxTradeLimitAsCoin(currencyCode);
- long peersCurrentTradeLimit = getTradeLimit(defaultMaxTradeLimit, currencyCode, Optional.of(peersWitness), peersCurrentDate);
+ long peersCurrentTradeLimit = defaultMaxTradeLimit.value;
+ if (!hasTradeLimitException(peersWitness)) {
+ final long accountSignAge = getWitnessSignAge(peersWitness, peersCurrentDate);
+ AccountAge accountAgeCategory = getPeersAccountAgeCategory(accountSignAge);
+ OfferPayload.Direction direction = offer.isMyOffer(keyRing) ?
+ offer.getMirroredDirection() : offer.getDirection();
+ peersCurrentTradeLimit = getTradeLimit(defaultMaxTradeLimit, currencyCode, peersWitness,
+ accountAgeCategory, direction, offer.getPaymentMethod());
+ }
// Makers current trade limit cannot be smaller than that in the offer
boolean result = tradeAmount.value <= peersCurrentTradeLimit;
if (!result) {
@@ -436,4 +580,139 @@ public class AccountAgeWitnessService {
}
return result;
}
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Witness signing
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public void arbitratorSignAccountAgeWitness(Coin tradeAmount,
+ AccountAgeWitness accountAgeWitness,
+ ECKey key,
+ PublicKey peersPubKey) {
+ signedWitnessService.signAccountAgeWitness(tradeAmount, accountAgeWitness, key, peersPubKey);
+ }
+
+ public void traderSignPeersAccountAgeWitness(Trade trade) {
+ AccountAgeWitness peersWitness = findTradePeerWitness(trade).orElse(null);
+ Coin tradeAmount = trade.getTradeAmount();
+ checkNotNull(trade.getProcessModel().getTradingPeer().getPubKeyRing(), "Peer must have a keyring");
+ PublicKey peersPubKey = trade.getProcessModel().getTradingPeer().getPubKeyRing().getSignaturePubKey();
+ checkNotNull(peersWitness, "Not able to find peers witness, unable to sign for trade {}", trade.toString());
+ checkNotNull(tradeAmount, "Trade amount must not be null");
+ checkNotNull(peersPubKey, "Peers pub key must not be null");
+
+ try {
+ signedWitnessService.signAccountAgeWitness(tradeAmount, peersWitness, peersPubKey);
+ } catch (CryptoException e) {
+ log.warn("Trader failed to sign witness, exception {}", e.toString());
+ }
+ }
+
+ // Arbitrator signing
+ public List getTraderPaymentAccounts(long safeDate, PaymentMethod paymentMethod,
+ List disputes) {
+ return disputes.stream()
+ .filter(dispute -> dispute.getContract().getPaymentMethodId().equals(paymentMethod.getId()))
+ .filter(this::isNotFiltered)
+ .filter(this::hasChargebackRisk)
+ .filter(this::isBuyerWinner)
+ .flatMap(this::getTraderData)
+ .filter(Objects::nonNull)
+ .filter(traderDataItem ->
+ !signedWitnessService.isSignedAccountAgeWitness(traderDataItem.getAccountAgeWitness()))
+ .filter(traderDataItem -> traderDataItem.getAccountAgeWitness().getDate() < safeDate)
+ .distinct()
+ .collect(Collectors.toList());
+ }
+
+ private boolean isNotFiltered(Dispute dispute) {
+ boolean isFiltered = filterManager.isNodeAddressBanned(dispute.getContract().getBuyerNodeAddress()) ||
+ filterManager.isNodeAddressBanned(dispute.getContract().getSellerNodeAddress()) ||
+ filterManager.isCurrencyBanned(dispute.getContract().getOfferPayload().getCurrencyCode()) ||
+ filterManager.isPaymentMethodBanned(
+ PaymentMethod.getPaymentMethodById(dispute.getContract().getPaymentMethodId())) ||
+ filterManager.isPeersPaymentAccountDataAreBanned(dispute.getContract().getBuyerPaymentAccountPayload(),
+ new PaymentAccountFilter[1]) ||
+ filterManager.isPeersPaymentAccountDataAreBanned(dispute.getContract().getSellerPaymentAccountPayload(),
+ new PaymentAccountFilter[1]);
+ return !isFiltered;
+ }
+
+ private boolean hasChargebackRisk(Dispute dispute) {
+ return chargeBackRisk.hasChargebackRisk(dispute.getContract().getPaymentMethodId(),
+ dispute.getContract().getOfferPayload().getCurrencyCode());
+ }
+
+ private boolean isBuyerWinner(Dispute dispute) {
+ if (!dispute.isClosed() || dispute.getDisputeResultProperty() == null)
+ return false;
+ return dispute.getDisputeResultProperty().get().getWinner() == DisputeResult.Winner.BUYER;
+ }
+
+ private Stream getTraderData(Dispute dispute) {
+ Coin tradeAmount = dispute.getContract().getTradeAmount();
+
+ PubKeyRing buyerPubKeyRing = dispute.getContract().getBuyerPubKeyRing();
+ PubKeyRing sellerPubKeyRing = dispute.getContract().getSellerPubKeyRing();
+
+ PaymentAccountPayload buyerPaymentAccountPaload = dispute.getContract().getBuyerPaymentAccountPayload();
+ PaymentAccountPayload sellerPaymentAccountPaload = dispute.getContract().getSellerPaymentAccountPayload();
+
+ TraderDataItem buyerData = findWitness(buyerPaymentAccountPaload, buyerPubKeyRing)
+ .map(witness -> new TraderDataItem(
+ buyerPaymentAccountPaload,
+ witness,
+ tradeAmount,
+ sellerPubKeyRing.getSignaturePubKey()))
+ .orElse(null);
+ TraderDataItem sellerData = findWitness(sellerPaymentAccountPaload, sellerPubKeyRing)
+ .map(witness -> new TraderDataItem(
+ sellerPaymentAccountPaload,
+ witness,
+ tradeAmount,
+ buyerPubKeyRing.getSignaturePubKey()))
+ .orElse(null);
+ return Stream.of(buyerData, sellerData);
+ }
+
+ public boolean hasSignedWitness(Offer offer) {
+ return findWitness(offer)
+ .map(signedWitnessService::isSignedAccountAgeWitness)
+ .orElse(false);
+ }
+
+ public boolean peerHasSignedWitness(Trade trade) {
+ return findTradePeerWitness(trade)
+ .map(signedWitnessService::isSignedAccountAgeWitness)
+ .orElse(false);
+ }
+
+ public boolean accountIsSigner(AccountAgeWitness accountAgeWitness) {
+ return signedWitnessService.isSignerAccountAgeWitness(accountAgeWitness);
+ }
+
+ public SignState getSignState(Offer offer) {
+ return findWitness(offer)
+ .map(this::getSignState)
+ .orElse(SignState.UNSIGNED);
+ }
+
+ public SignState getSignState(AccountAgeWitness accountAgeWitness) {
+ if (signedWitnessService.isSignedByArbitrator(accountAgeWitness)) {
+ return SignState.ARBITRATOR;
+ } else {
+ final long accountSignAge = getWitnessSignAge(accountAgeWitness, new Date());
+ switch (getAccountAgeCategory(accountSignAge)) {
+ case TWO_MONTHS_OR_MORE:
+ return SignState.PEER_SIGNER;
+ case ONE_TO_TWO_MONTHS:
+ return SignState.PEER_LIMIT_LIFTED;
+ case LESS_ONE_MONTH:
+ return SignState.PEER_INITIAL;
+ case UNVERIFIED:
+ default:
+ return SignState.UNSIGNED;
+ }
+ }
+ }
}
diff --git a/core/src/main/java/bisq/core/app/BisqSetup.java b/core/src/main/java/bisq/core/app/BisqSetup.java
index cd9a11ed63..6f3222b0ef 100644
--- a/core/src/main/java/bisq/core/app/BisqSetup.java
+++ b/core/src/main/java/bisq/core/app/BisqSetup.java
@@ -17,6 +17,7 @@
package bisq.core.app;
+import bisq.core.account.sign.SignedWitness;
import bisq.core.account.sign.SignedWitnessService;
import bisq.core.account.witness.AccountAgeWitnessService;
import bisq.core.alert.Alert;
@@ -43,12 +44,15 @@ import bisq.core.notifications.alerts.price.PriceAlert;
import bisq.core.offer.OpenOfferManager;
import bisq.core.payment.PaymentAccount;
import bisq.core.payment.TradeLimits;
+import bisq.core.payment.payload.PaymentMethod;
import bisq.core.provider.fee.FeeService;
import bisq.core.provider.price.PriceFeedService;
import bisq.core.support.dispute.arbitration.ArbitrationManager;
import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager;
import bisq.core.support.dispute.mediation.MediationManager;
import bisq.core.support.dispute.mediation.mediator.MediatorManager;
+import bisq.core.support.dispute.refund.RefundManager;
+import bisq.core.support.dispute.refund.refundagent.RefundAgentManager;
import bisq.core.support.traderchat.TraderChatManager;
import bisq.core.trade.TradeManager;
import bisq.core.trade.statistics.AssetTradeActivityCheck;
@@ -61,6 +65,7 @@ import bisq.network.crypto.DecryptedDataTuple;
import bisq.network.crypto.EncryptionService;
import bisq.network.p2p.P2PService;
import bisq.network.p2p.peers.keepalive.messages.Ping;
+import bisq.network.p2p.storage.payload.PersistableNetworkPayload;
import bisq.common.ClockWatcher;
import bisq.common.Timer;
@@ -100,6 +105,7 @@ import java.net.Socket;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
@@ -143,11 +149,13 @@ public class BisqSetup {
private final PriceFeedService priceFeedService;
private final ArbitratorManager arbitratorManager;
private final MediatorManager mediatorManager;
+ private final RefundAgentManager refundAgentManager;
private final P2PService p2PService;
private final TradeManager tradeManager;
private final OpenOfferManager openOfferManager;
private final ArbitrationManager arbitrationManager;
private final MediationManager mediationManager;
+ private final RefundManager refundManager;
private final TraderChatManager traderChatManager;
private final Preferences preferences;
private final User user;
@@ -183,7 +191,8 @@ public class BisqSetup {
private Consumer cryptoSetupFailedHandler, chainFileLockedExceptionHandler,
spvFileCorruptedHandler, lockedUpFundsHandler, daoErrorMessageHandler, daoWarnMessageHandler,
filterWarningHandler, displaySecurityRecommendationHandler, displayLocalhostHandler,
- wrongOSArchitectureHandler;
+ wrongOSArchitectureHandler, displaySignedByArbitratorHandler,
+ displaySignedByPeerHandler, displayPeerLimitLiftedHandler, displayPeerSignerHandler;
@Setter
@Nullable
private Consumer displayTorNetworkSettingsHandler;
@@ -225,11 +234,13 @@ public class BisqSetup {
PriceFeedService priceFeedService,
ArbitratorManager arbitratorManager,
MediatorManager mediatorManager,
+ RefundAgentManager refundAgentManager,
P2PService p2PService,
TradeManager tradeManager,
OpenOfferManager openOfferManager,
ArbitrationManager arbitrationManager,
MediationManager mediationManager,
+ RefundManager refundManager,
TraderChatManager traderChatManager,
Preferences preferences,
User user,
@@ -269,11 +280,13 @@ public class BisqSetup {
this.priceFeedService = priceFeedService;
this.arbitratorManager = arbitratorManager;
this.mediatorManager = mediatorManager;
+ this.refundAgentManager = refundAgentManager;
this.p2PService = p2PService;
this.tradeManager = tradeManager;
this.openOfferManager = openOfferManager;
this.arbitrationManager = arbitrationManager;
this.mediationManager = mediationManager;
+ this.refundManager = refundManager;
this.traderChatManager = traderChatManager;
this.preferences = preferences;
this.user = user;
@@ -313,11 +326,8 @@ public class BisqSetup {
}
public void start() {
- if (log.isDebugEnabled()) {
- UserThread.runPeriodically(() -> {
- log.debug("1 second heartbeat");
- }, 1);
- }
+ UserThread.runPeriodically(() -> {
+ }, 1);
maybeReSyncSPVChain();
maybeShowTac();
}
@@ -346,6 +356,7 @@ public class BisqSetup {
// in MainViewModel
maybeShowSecurityRecommendation();
maybeShowLocalhostRunningInfo();
+ maybeShowAccountSigningStateInfo();
}
@@ -440,10 +451,10 @@ public class BisqSetup {
}
private void maybeShowTac() {
- if (!preferences.isTacAccepted() && !DevEnv.isDevMode()) {
+ if (!preferences.isTacAcceptedV120() && !DevEnv.isDevMode()) {
if (displayTacHandler != null)
displayTacHandler.accept(() -> {
- preferences.setTacAccepted(true);
+ preferences.setTacAcceptedV120(true);
step2();
});
} else {
@@ -593,9 +604,7 @@ public class BisqSetup {
if (allBasicServicesInitialized)
checkForLockedUpFunds();
},
- () -> {
- walletInitialized.set(true);
- });
+ () -> walletInitialized.set(true));
}
@@ -637,6 +646,7 @@ public class BisqSetup {
arbitrationManager.onAllServicesInitialized();
mediationManager.onAllServicesInitialized();
+ refundManager.onAllServicesInitialized();
traderChatManager.onAllServicesInitialized();
tradeManager.onAllServicesInitialized();
@@ -650,6 +660,7 @@ public class BisqSetup {
arbitratorManager.onAllServicesInitialized();
mediatorManager.onAllServicesInitialized();
+ refundAgentManager.onAllServicesInitialized();
alertManager.alertMessageProperty().addListener((observable, oldValue, newValue) ->
displayAlertIfPresent(newValue, false));
@@ -715,9 +726,7 @@ public class BisqSetup {
voteResultService.getVoteResultExceptions().addListener((ListChangeListener) c -> {
c.next();
if (c.wasAdded() && voteResultExceptionHandler != null) {
- c.getAddedSubList().forEach(e -> {
- voteResultExceptionHandler.accept(e);
- });
+ c.getAddedSubList().forEach(e -> voteResultExceptionHandler.accept(e));
}
});
@@ -741,9 +750,62 @@ public class BisqSetup {
}
private void maybeShowLocalhostRunningInfo() {
- String key = "bitcoinLocalhostNode";
- if (bisqEnvironment.isBitcoinLocalhostNodeRunning() && preferences.showAgain(key) &&
- displayLocalhostHandler != null)
- displayLocalhostHandler.accept(key);
+ maybeTriggerDisplayHandler("bitcoinLocalhostNode", displayLocalhostHandler, bisqEnvironment.isBitcoinLocalhostNodeRunning());
+ }
+
+ private void maybeShowAccountSigningStateInfo() {
+ String keySignedByArbitrator = "accountSignedByArbitrator";
+ String keySignedByPeer = "accountSignedByPeer";
+ String keyPeerLimitedLifted = "accountLimitLifted";
+ String keyPeerSigner = "accountPeerSigner";
+
+ // check signed witness on startup
+ checkSigningState(AccountAgeWitnessService.SignState.ARBITRATOR, keySignedByArbitrator, displaySignedByArbitratorHandler);
+ checkSigningState(AccountAgeWitnessService.SignState.PEER_INITIAL, keySignedByPeer, displaySignedByPeerHandler);
+ checkSigningState(AccountAgeWitnessService.SignState.PEER_LIMIT_LIFTED, keyPeerLimitedLifted, displayPeerLimitLiftedHandler);
+ checkSigningState(AccountAgeWitnessService.SignState.PEER_SIGNER, keyPeerSigner, displayPeerSignerHandler);
+
+ // check signed witness during runtime
+ p2PService.getP2PDataStorage().addAppendOnlyDataStoreListener(
+ payload -> {
+ maybeTriggerDisplayHandler(keySignedByArbitrator, displaySignedByArbitratorHandler,
+ isSignedWitnessOfMineWithState(payload, AccountAgeWitnessService.SignState.ARBITRATOR));
+ maybeTriggerDisplayHandler(keySignedByPeer, displaySignedByPeerHandler,
+ isSignedWitnessOfMineWithState(payload, AccountAgeWitnessService.SignState.PEER_INITIAL));
+ maybeTriggerDisplayHandler(keyPeerLimitedLifted, displayPeerLimitLiftedHandler,
+ isSignedWitnessOfMineWithState(payload, AccountAgeWitnessService.SignState.PEER_LIMIT_LIFTED));
+ maybeTriggerDisplayHandler(keyPeerSigner, displayPeerSignerHandler,
+ isSignedWitnessOfMineWithState(payload, AccountAgeWitnessService.SignState.PEER_SIGNER));
+ });
+ }
+
+ private void checkSigningState(AccountAgeWitnessService.SignState state,
+ String key, Consumer displayHandler) {
+ boolean signingStateFound = p2PService.getP2PDataStorage().getAppendOnlyDataStoreMap().values().stream()
+ .anyMatch(payload -> isSignedWitnessOfMineWithState(payload, state));
+
+ maybeTriggerDisplayHandler(key, displayHandler, signingStateFound);
+ }
+
+ private boolean isSignedWitnessOfMineWithState(PersistableNetworkPayload payload,
+ AccountAgeWitnessService.SignState state) {
+ if (payload instanceof SignedWitness && user.getPaymentAccounts() != null) {
+ // We know at this point that it is already added to the signed witness list
+ // Check if new signed witness is for one of my own accounts
+ return user.getPaymentAccounts().stream()
+ .filter(a -> PaymentMethod.hasChargebackRisk(a.getPaymentMethod(), a.getTradeCurrencies()))
+ .filter(a -> Arrays.equals(((SignedWitness) payload).getAccountAgeWitnessHash(),
+ accountAgeWitnessService.getMyWitness(a.getPaymentAccountPayload()).getHash()))
+ .anyMatch(a -> accountAgeWitnessService.getSignState(accountAgeWitnessService.getMyWitness(
+ a.getPaymentAccountPayload())).equals(state));
+ }
+ return false;
+ }
+
+ private void maybeTriggerDisplayHandler(String key, Consumer displayHandler, boolean signingStateFound) {
+ if (signingStateFound && preferences.showAgain(key) &&
+ displayHandler != null) {
+ displayHandler.accept(key);
+ }
}
}
diff --git a/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java b/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java
index 5959b7ee89..783440b1b7 100644
--- a/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java
+++ b/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java
@@ -41,14 +41,18 @@ import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public abstract class ExecutableForAppWithP2p extends BisqExecutable implements UncaughtExceptionHandler {
- private static final long MAX_MEMORY_MB_DEFAULT = 500;
+ private static final long MAX_MEMORY_MB_DEFAULT = 1200;
private static final long CHECK_MEMORY_PERIOD_SEC = 300;
+ private static final long CHECK_SHUTDOWN_SEC = TimeUnit.HOURS.toSeconds(1);
+ private static final long SHUTDOWN_INTERVAL = TimeUnit.HOURS.toMillis(24);
private volatile boolean stopped;
+ private final long startTime = System.currentTimeMillis();
private static long maxMemory = MAX_MEMORY_MB_DEFAULT;
public ExecutableForAppWithP2p(String fullName, String scriptName, String version) {
@@ -120,6 +124,20 @@ public abstract class ExecutableForAppWithP2p extends BisqExecutable implements
}
}
+ protected void startShutDownInterval(GracefulShutDownHandler gracefulShutDownHandler) {
+ UserThread.runPeriodically(() -> {
+ if (System.currentTimeMillis() - startTime > SHUTDOWN_INTERVAL) {
+ log.warn("\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" +
+ "Shut down as node was running longer as {} hours" +
+ "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n",
+ SHUTDOWN_INTERVAL / 3600000);
+
+ shutDown(gracefulShutDownHandler);
+ }
+
+ }, CHECK_SHUTDOWN_SEC);
+ }
+
protected void checkMemory(BisqEnvironment environment, GracefulShutDownHandler gracefulShutDownHandler) {
String maxMemoryOption = environment.getProperty(AppOptionKeys.MAX_MEMORY);
if (maxMemoryOption != null && !maxMemoryOption.isEmpty()) {
@@ -153,16 +171,24 @@ public abstract class ExecutableForAppWithP2p extends BisqExecutable implements
long usedMemory = Profiler.getUsedMemoryInMB();
if (usedMemory > maxMemory) {
log.warn("\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" +
- "We are over our memory limit ({}) and trigger a restart. usedMemory: {} MB. freeMemory: {} MB" +
+ "We are over our memory limit ({}) and trigger a shutdown. usedMemory: {} MB. freeMemory: {} MB" +
"\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n",
(int) maxMemory, usedMemory, Profiler.getFreeMemoryInMB());
- restart(environment, gracefulShutDownHandler);
+ shutDown(gracefulShutDownHandler);
}
}, 5);
}
}, CHECK_MEMORY_PERIOD_SEC);
}
+ protected void shutDown(GracefulShutDownHandler gracefulShutDownHandler) {
+ stopped = true;
+ gracefulShutDownHandler.gracefulShutDown(() -> {
+ log.info("Shutdown complete");
+ System.exit(1);
+ });
+ }
+
protected void restart(BisqEnvironment bisqEnvironment, GracefulShutDownHandler gracefulShutDownHandler) {
stopped = true;
gracefulShutDownHandler.gracefulShutDown(() -> {
@@ -180,5 +206,4 @@ public abstract class ExecutableForAppWithP2p extends BisqExecutable implements
}
});
}
-
}
diff --git a/core/src/main/java/bisq/core/btc/Balances.java b/core/src/main/java/bisq/core/btc/Balances.java
index 984211c451..cf85da0b98 100644
--- a/core/src/main/java/bisq/core/btc/Balances.java
+++ b/core/src/main/java/bisq/core/btc/Balances.java
@@ -22,6 +22,8 @@ import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.offer.OpenOffer;
import bisq.core.offer.OpenOfferManager;
+import bisq.core.support.dispute.Dispute;
+import bisq.core.support.dispute.refund.RefundManager;
import bisq.core.trade.Trade;
import bisq.core.trade.TradeManager;
import bisq.core.trade.closed.ClosedTradableManager;
@@ -52,6 +54,7 @@ public class Balances {
private final OpenOfferManager openOfferManager;
private final ClosedTradableManager closedTradableManager;
private final FailedTradesManager failedTradesManager;
+ private final RefundManager refundManager;
@Getter
private final ObjectProperty availableBalance = new SimpleObjectProperty<>();
@@ -65,17 +68,20 @@ public class Balances {
BtcWalletService btcWalletService,
OpenOfferManager openOfferManager,
ClosedTradableManager closedTradableManager,
- FailedTradesManager failedTradesManager) {
+ FailedTradesManager failedTradesManager,
+ RefundManager refundManager) {
this.tradeManager = tradeManager;
this.btcWalletService = btcWalletService;
this.openOfferManager = openOfferManager;
this.closedTradableManager = closedTradableManager;
this.failedTradesManager = failedTradesManager;
+ this.refundManager = refundManager;
}
public void onAllServicesInitialized() {
openOfferManager.getObservableList().addListener((ListChangeListener) c -> updateBalance());
tradeManager.getTradableList().addListener((ListChangeListener) change -> updateBalance());
+ refundManager.getDisputesAsObservableList().addListener((ListChangeListener) c -> updateBalance());
btcWalletService.addBalanceListener(new BalanceListener() {
@Override
public void onBalanceChanged(Coin balance, Transaction tx) {
diff --git a/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java b/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java
index 9a2e1c76ba..c0fbfb5b68 100644
--- a/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java
+++ b/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java
@@ -126,6 +126,25 @@ public class TxFeeEstimationService {
return new Tuple2<>(txFee, size);
}
+ public Tuple2 getEstimatedFeeAndTxSize(Coin amount,
+ FeeService feeService,
+ BtcWalletService btcWalletService) {
+ Coin txFeePerByte = feeService.getTxFeePerByte();
+ // We start with min taker fee size of 260
+ int estimatedTxSize = TYPICAL_TX_WITH_1_INPUT_SIZE;
+ try {
+ estimatedTxSize = getEstimatedTxSize(List.of(amount), estimatedTxSize, txFeePerByte, btcWalletService);
+ } catch (InsufficientMoneyException e) {
+ log.info("We cannot do the fee estimation because there are not enough funds in the wallet. This is expected " +
+ "if the user pays from an external wallet. In that case we use an estimated tx size of {} bytes.", estimatedTxSize);
+ }
+
+ Coin txFee = txFeePerByte.multiply(estimatedTxSize);
+ log.info("Fee estimation resulted in a tx size of {} bytes and a tx fee of {} Sat.", estimatedTxSize, txFee.value);
+
+ return new Tuple2<>(txFee, estimatedTxSize);
+ }
+
// We start with the initialEstimatedTxSize for a tx with 1 input (260) bytes and get from BitcoinJ a tx back which
// contains the required inputs to fund that tx (outputs + miner fee). The miner fee in that case is based on
// the assumption that we only need 1 input. Once we receive back the real tx size from the tx BitcoinJ has created
diff --git a/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java b/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java
index 5b7c3b661e..a394892aba 100644
--- a/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java
+++ b/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java
@@ -47,10 +47,6 @@ public class BtcNodes {
public List getProvidedBtcNodes() {
return useProvidedBtcNodes() ?
Arrays.asList(
- // ManfredKarrer
- new BtcNode("btc1.0-2-1.net", "r3dsojfhwcm7x7p6.onion", "159.89.16.222", BtcNode.DEFAULT_PORT, "@manfredkarrer"),
- new BtcNode("btc2.0-2-1.net", "vlf5i3grro3wux24.onion", "165.227.34.56", BtcNode.DEFAULT_PORT, "@manfredkarrer"),
-
// emzy
new BtcNode("kirsche.emzy.de", "fz6nsij6jiyuwlsc.onion", "78.47.61.83", BtcNode.DEFAULT_PORT, "@emzy"),
new BtcNode("node2.emzy.de", "c6ac4jdfyeiakex2.onion", "62.75.210.81", BtcNode.DEFAULT_PORT, "@emzy"),
diff --git a/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java b/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java
index 300771460f..915e00ca23 100644
--- a/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java
+++ b/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java
@@ -493,6 +493,15 @@ public class BsqWalletService extends WalletService implements DaoStateListener
}
}
+ for (TransactionOutput txo : tx.getOutputs()) {
+ Coin value = txo.getValue();
+ // OpReturn outputs have value 0
+ if (value.isPositive()) {
+ checkArgument(Restrictions.isAboveDust(txo.getValue()),
+ "An output value is below dust limit. Transaction=" + tx);
+ }
+ }
+
checkWalletConsistency(wallet);
verifyTransaction(tx);
printTx("BSQ wallet: Signed Tx", tx);
@@ -556,11 +565,11 @@ public class BsqWalletService extends WalletService implements DaoStateListener
// Tx has as first output BSQ and an optional second BSQ change output.
// At that stage we do not have added the BTC inputs so there is no BTC change output here.
if (tx.getOutputs().size() == 2) {
- TransactionOutput bsqChangeOutput = tx.getOutputs().get(1);
- if (!Restrictions.isAboveDust(bsqChangeOutput.getValue())) {
- String msg = "BSQ change output is below dust limit. outputValue=" + bsqChangeOutput.getValue().toFriendlyString();
+ Coin bsqChangeOutputValue = tx.getOutputs().get(1).getValue();
+ if (!Restrictions.isAboveDust(bsqChangeOutputValue)) {
+ String msg = "BSQ change output is below dust limit. outputValue=" + bsqChangeOutputValue.value / 100 + " BSQ";
log.warn(msg);
- throw new BsqChangeBelowDustException(msg, bsqChangeOutput.getValue());
+ throw new BsqChangeBelowDustException(msg, bsqChangeOutputValue);
}
}
@@ -573,60 +582,128 @@ public class BsqWalletService extends WalletService implements DaoStateListener
///////////////////////////////////////////////////////////////////////////////////////////
- // Burn fee tx
+ // Burn fee txs
///////////////////////////////////////////////////////////////////////////////////////////
+ public Transaction getPreparedTradeFeeTx(Coin fee) throws InsufficientBsqException {
+ daoKillSwitch.assertDaoIsNotDisabled();
+
+ Transaction tx = new Transaction(params);
+ addInputsAndChangeOutputForTx(tx, fee, bsqCoinSelector);
+ return tx;
+ }
+
// We create a tx with Bsq inputs for the fee and optional BSQ change output.
// As the fee amount will be missing in the output those BSQ fees are burned.
- public Transaction getPreparedProposalTx(Coin fee, boolean requireChangeOutput) throws InsufficientBsqException {
- return getPreparedBurnFeeTx(fee, requireChangeOutput);
+ public Transaction getPreparedProposalTx(Coin fee) throws InsufficientBsqException {
+ return getPreparedTxWithMandatoryBsqChangeOutput(fee);
}
- public Transaction getPreparedBurnFeeTx(Coin fee) throws InsufficientBsqException {
- return getPreparedBurnFeeTx(fee, false);
+ public Transaction getPreparedIssuanceTx(Coin fee) throws InsufficientBsqException {
+ return getPreparedTxWithMandatoryBsqChangeOutput(fee);
}
- private Transaction getPreparedBurnFeeTx(Coin fee, boolean requireChangeOutput) throws InsufficientBsqException {
+ public Transaction getPreparedProofOfBurnTx(Coin fee) throws InsufficientBsqException {
+ return getPreparedTxWithMandatoryBsqChangeOutput(fee);
+ }
+
+ public Transaction getPreparedBurnFeeTxForAssetListing(Coin fee) throws InsufficientBsqException {
+ return getPreparedTxWithMandatoryBsqChangeOutput(fee);
+ }
+
+ // We need to require one BSQ change output as we could otherwise not be able to distinguish between 2
+ // structurally same transactions where only the BSQ fee is different. In case of asset listing fee and proof of
+ // burn it is a user input, so it is not know to the parser, instead we derive the burned fee from the parser.
+
+ // In case of proposal fee we could derive it from the params.
+
+ // For issuance txs we also require a BSQ change output before the issuance output gets added. There was a
+ // minor bug with the old version that multiple inputs would have caused an exception in case there was no
+ // change output (e.g. inputs of 21 and 6 BSQ for BSQ fee of 21 BSQ would have caused that only 1 input was used
+ // and then caused an error as we enforced a change output. This new version handles such cases correctly.
+
+ // Examples for the structurally indistinguishable transactions:
+ // Case 1: 10 BSQ fee to burn
+ // In: 17 BSQ
+ // Out: BSQ change 7 BSQ -> valid BSQ
+ // Out: OpReturn
+ // Miner fee: 1000 sat (10 BSQ burned)
+
+ // Case 2: 17 BSQ fee to burn
+ // In: 17 BSQ
+ // Out: burned BSQ change 7 BSQ -> BTC (7 BSQ burned)
+ // Out: OpReturn
+ // Miner fee: 1000 sat (10 BSQ burned)
+
+ private Transaction getPreparedTxWithMandatoryBsqChangeOutput(Coin fee) throws InsufficientBsqException {
daoKillSwitch.assertDaoIsNotDisabled();
- final Transaction tx = new Transaction(params);
- addInputsAndChangeOutputForTx(tx, fee, bsqCoinSelector, requireChangeOutput);
- // printTx("getPreparedFeeTx", tx);
- return tx;
+
+ Transaction tx = new Transaction(params);
+ // We look for inputs covering out BSQ fee we want to pay.
+ CoinSelection coinSelection = bsqCoinSelector.select(fee, wallet.calculateAllSpendCandidates());
+ try {
+ Coin change = bsqCoinSelector.getChange(fee, coinSelection);
+ if (change.isZero() || Restrictions.isDust(change)) {
+ // If change is zero or below dust we increase required input amount to enforce a BSQ change output.
+ // All outputs after that are considered BTC and therefore would be burned BSQ if BSQ is left from what
+ // we use for miner fee.
+
+ Coin minDustThreshold = Coin.valueOf(preferences.getIgnoreDustThreshold());
+ Coin increasedRequiredInput = fee.add(minDustThreshold);
+ coinSelection = bsqCoinSelector.select(increasedRequiredInput, wallet.calculateAllSpendCandidates());
+ change = bsqCoinSelector.getChange(fee, coinSelection);
+
+ log.warn("We increased required input as change output was zero or dust: New change value={}", change);
+ String info = "Available BSQ balance=" + coinSelection.valueGathered.value / 100 + " BSQ. " +
+ "Intended fee to burn=" + fee.value / 100 + " BSQ. " +
+ "Please increase your balance to at least " + (coinSelection.valueGathered.value + minDustThreshold.value) / 100 + " BSQ.";
+ checkArgument(coinSelection.valueGathered.compareTo(fee) > 0,
+ "This transaction require a change output of at least " + minDustThreshold.value / 100 + " BSQ (dust limit). " +
+ info);
+
+ checkArgument(!Restrictions.isDust(change),
+ "This transaction would create a dust output of " + change.value / 100 + " BSQ. " +
+ "It requires a change output of at least " + minDustThreshold.value / 100 + " BSQ (dust limit). " +
+ info);
+ }
+
+ coinSelection.gathered.forEach(tx::addInput);
+ tx.addOutput(change, getChangeAddress());
+
+ return tx;
+
+ } catch (InsufficientMoneyException e) {
+ log.error("coinSelection.gathered={}", coinSelection.gathered);
+ throw new InsufficientBsqException(e.missing);
+ }
}
private void addInputsAndChangeOutputForTx(Transaction tx,
Coin fee,
- BsqCoinSelector bsqCoinSelector,
- boolean requireChangeOutput)
+ BsqCoinSelector bsqCoinSelector)
throws InsufficientBsqException {
Coin requiredInput;
// If our fee is less then dust limit we increase it so we are sure to not get any dust output.
- if (Restrictions.isDust(fee))
- requiredInput = Restrictions.getMinNonDustOutput().add(fee);
- else
+ if (Restrictions.isDust(fee)) {
+ requiredInput = fee.add(Restrictions.getMinNonDustOutput());
+ } else {
requiredInput = fee;
+ }
CoinSelection coinSelection = bsqCoinSelector.select(requiredInput, wallet.calculateAllSpendCandidates());
coinSelection.gathered.forEach(tx::addInput);
try {
- // TODO why is fee passed to getChange ???
Coin change = bsqCoinSelector.getChange(fee, coinSelection);
- if (requireChangeOutput) {
- checkArgument(change.isPositive(),
- "This transaction requires a mandatory BSQ change output. " +
- "At least " + Restrictions.getMinNonDustOutput().add(fee).value / 100d + " " +
- "BSQ is needed for this transaction");
- }
-
if (change.isPositive()) {
checkArgument(Restrictions.isAboveDust(change),
"The change output of " + change.value / 100d + " BSQ is below the min. dust value of "
+ Restrictions.getMinNonDustOutput().value / 100d +
- ". At least " + Restrictions.getMinNonDustOutput().add(fee).value / 100d + " " +
- "BSQ is needed for this transaction");
+ ". At least " + Restrictions.getMinNonDustOutput().add(fee).value / 100d +
+ " BSQ is needed for this transaction");
tx.addOutput(change, getChangeAddress());
}
} catch (InsufficientMoneyException e) {
+ log.error(tx.toString());
throw new InsufficientBsqException(e.missing);
}
}
@@ -642,7 +719,7 @@ public class BsqWalletService extends WalletService implements DaoStateListener
daoKillSwitch.assertDaoIsNotDisabled();
Transaction tx = new Transaction(params);
tx.addOutput(new TransactionOutput(params, tx, stake, getUnusedAddress()));
- addInputsAndChangeOutputForTx(tx, fee.add(stake), bsqCoinSelector, false);
+ addInputsAndChangeOutputForTx(tx, fee.add(stake), bsqCoinSelector);
//printTx("getPreparedBlindVoteTx", tx);
return tx;
}
@@ -676,7 +753,7 @@ public class BsqWalletService extends WalletService implements DaoStateListener
Transaction tx = new Transaction(params);
checkArgument(Restrictions.isAboveDust(lockupAmount), "The amount is too low (dust limit).");
tx.addOutput(new TransactionOutput(params, tx, lockupAmount, getUnusedAddress()));
- addInputsAndChangeOutputForTx(tx, lockupAmount, bsqCoinSelector, false);
+ addInputsAndChangeOutputForTx(tx, lockupAmount, bsqCoinSelector);
printTx("prepareLockupTx", tx);
return tx;
}
diff --git a/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java b/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java
index 0e0ee6f0e9..7e1ed9c9c7 100644
--- a/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java
+++ b/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java
@@ -408,13 +408,13 @@ public class BtcWalletService extends WalletService {
TransactionVerificationException, WalletException, InsufficientMoneyException {
// preparedBsqTx has following structure:
// inputs [1-n] BSQ inputs
- // outputs [0-1] BSQ receivers output
+ // outputs [1] BSQ receivers output
// outputs [0-1] BSQ change output
// We add BTC mining fee. Result tx looks like:
// inputs [1-n] BSQ inputs
// inputs [1-n] BTC inputs
- // outputs [0-1] BSQ receivers output
+ // outputs [1] BSQ receivers output
// outputs [0-1] BSQ change output
// outputs [0-1] BTC change output
// mining fee: BTC mining fee
@@ -426,7 +426,7 @@ public class BtcWalletService extends WalletService {
// preparedBsqTx has following structure:
// inputs [1-n] BSQ inputs
- // outputs [0-1] BSQ receivers output
+ // outputs [1] BSQ receivers output
// outputs [0-1] BSQ change output
// mining fee: optional burned BSQ fee (only if opReturnData != null)
@@ -1114,4 +1114,55 @@ public class BtcWalletService extends WalletService {
protected boolean isDustAttackUtxo(TransactionOutput output) {
return output.getValue().value < preferences.getIgnoreDustThreshold();
}
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Refund payoutTx
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public Transaction createRefundPayoutTx(Coin buyerAmount,
+ Coin sellerAmount,
+ Coin fee,
+ String buyerAddressString,
+ String sellerAddressString)
+ throws AddressFormatException, InsufficientMoneyException, WalletException, TransactionVerificationException {
+ Transaction tx = new Transaction(params);
+ Preconditions.checkArgument(buyerAmount.add(sellerAmount).isPositive(),
+ "The sellerAmount + buyerAmount must be positive.");
+ // buyerAmount can be 0
+ if (buyerAmount.isPositive()) {
+ Preconditions.checkArgument(Restrictions.isAboveDust(buyerAmount),
+ "The buyerAmount is too low (dust limit).");
+
+ tx.addOutput(buyerAmount, Address.fromBase58(params, buyerAddressString));
+ }
+ // sellerAmount can be 0
+ if (sellerAmount.isPositive()) {
+ Preconditions.checkArgument(Restrictions.isAboveDust(sellerAmount),
+ "The sellerAmount is too low (dust limit).");
+
+ tx.addOutput(sellerAmount, Address.fromBase58(params, sellerAddressString));
+ }
+
+ SendRequest sendRequest = SendRequest.forTx(tx);
+ sendRequest.fee = fee;
+ sendRequest.feePerKb = Coin.ZERO;
+ sendRequest.ensureMinRequiredFee = false;
+ sendRequest.aesKey = aesKey;
+ sendRequest.shuffleOutputs = false;
+ sendRequest.coinSelector = new BtcCoinSelector(walletsSetup.getAddressesByContext(AddressEntry.Context.AVAILABLE),
+ preferences.getIgnoreDustThreshold());
+ sendRequest.changeAddress = getFreshAddressEntry().getAddress();
+
+ checkNotNull(wallet);
+ wallet.completeTx(sendRequest);
+
+ Transaction resultTx = sendRequest.tx;
+ checkWalletConsistency(wallet);
+ verifyTransaction(resultTx);
+
+ WalletService.printTx("createRefundPayoutTx", resultTx);
+
+ return resultTx;
+ }
}
diff --git a/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java b/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java
index ac18d14e10..e0c5705854 100644
--- a/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java
+++ b/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java
@@ -33,13 +33,11 @@ import bisq.core.user.Preferences;
import org.bitcoinj.core.Address;
import org.bitcoinj.core.AddressFormatException;
import org.bitcoinj.core.Coin;
-import org.bitcoinj.core.Context;
import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.InsufficientMoneyException;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.Sha256Hash;
import org.bitcoinj.core.Transaction;
-import org.bitcoinj.core.TransactionConfidence;
import org.bitcoinj.core.TransactionInput;
import org.bitcoinj.core.TransactionOutPoint;
import org.bitcoinj.core.TransactionOutput;
@@ -72,46 +70,6 @@ import javax.annotation.Nullable;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
-// TradeService handles all relevant transactions used in the trade process
-/*
- To maintain a consistent tx structure we use that structure:
- Always buyers in/outputs/keys first then sellers in/outputs/keys the arbitrators outputs/keys.
-
- Deposit tx:
- IN[0] buyer (mandatory) e.g. 0.1 BTC
- IN[...] optional additional buyer inputs (normally never used as we pay from trade fee tx and always have 1 output there)
- IN[...] seller (mandatory) e.g. 1.1001 BTC
- IN[...] optional additional seller inputs (normally never used as we pay from trade fee tx and always have 1 output there)
- OUT[0] Multisig output (include tx fee for payout tx) e.g. 1.2001
- OUT[1] OP_RETURN with hash of contract and 0 BTC amount
- OUT[...] optional buyer change (normally never used as we pay from trade fee tx and always have 1 output there)
- OUT[...] optional seller change (normally never used as we pay from trade fee tx and always have 1 output there)
- FEE tx fee 0.0001 BTC
-
- Payout tx:
- IN[0] Multisig output from deposit Tx (signed by buyer and trader)
- OUT[0] Buyer payout address
- OUT[1] Seller payout address
-
- We use 0 confirmation transactions to make the trade process practical from usability side.
- There is no risk for double spends as the deposit transaction would become invalid if any preceding transaction would have been double spent.
- If a preceding transaction in the chain will not make it into the same or earlier block as the deposit transaction the deposit transaction
- will be invalid as well.
- Though the deposit need 1 confirmation before the buyer starts the Fiat payment.
-
- We have that chain of transactions:
- 1. Deposit from external wallet to our trading wallet: Tx0 (0 conf)
- 2. Create offer (or take offer) fee payment from Tx0 output: tx1 (0 conf)
- 3. Deposit tx created with inputs from tx1 of both traders: Tx2 (here we wait for 1 conf)
-
- Fiat transaction will not start before we get at least 1 confirmation for the deposit tx, then we can proceed.
- 4. Payout tx with input from MS output and output to both traders: Tx3 (0 conf)
- 5. Withdrawal to external wallet from Tx3: Tx4 (0 conf)
-
- After the payout transaction we also don't have issues with 0 conf or if not both tx (payout, withdrawal) make it into a block.
- Worst case is to rebroadcast the transactions (TODO: is not implemented yet).
-
- */
public class TradeWalletService {
private static final Logger log = LoggerFactory.getLogger(TradeWalletService.class);
@@ -178,16 +136,7 @@ public class TradeWalletService {
Coin txFee,
String feeReceiverAddresses,
boolean doBroadcast,
- @Nullable TxBroadcaster.Callback callback)
- throws InsufficientMoneyException, AddressFormatException {
- log.debug("fundingAddress {}", fundingAddress);
- log.debug("reservedForTradeAddress {}", reservedForTradeAddress);
- log.debug("changeAddress {}", changeAddress);
- log.info("reservedFundsForOffer {}", reservedFundsForOffer.toPlainString());
- log.debug("useSavingsWallet {}", useSavingsWallet);
- log.info("tradingFee {}", tradingFee.toPlainString());
- log.info("txFee {}", txFee.toPlainString());
- log.debug("feeReceiverAddresses {}", feeReceiverAddresses);
+ @Nullable TxBroadcaster.Callback callback) throws InsufficientMoneyException, AddressFormatException {
Transaction tradingFeeTx = new Transaction(params);
SendRequest sendRequest = null;
try {
@@ -220,17 +169,18 @@ public class TradeWalletService {
wallet.completeTx(sendRequest);
WalletService.printTx("tradingFeeTx", tradingFeeTx);
- if (doBroadcast && callback != null)
+ if (doBroadcast && callback != null) {
broadcastTx(tradingFeeTx, callback);
+ }
return tradingFeeTx;
} catch (Throwable t) {
- if (wallet != null && sendRequest != null && sendRequest.coinSelector != null)
- log.warn("Balance = {}; CoinSelector = {}",
- wallet.getBalance(sendRequest.coinSelector),
- sendRequest.coinSelector);
+ if (wallet != null && sendRequest != null && sendRequest.coinSelector != null) {
+ log.warn("Balance = {}; CoinSelector = {}", wallet.getBalance(sendRequest.coinSelector), sendRequest.coinSelector);
+ }
- log.warn("createBtcTradingFeeTx failed: tradingFeeTx={}, txOutputs={}", tradingFeeTx.toString(), tradingFeeTx.getOutputs());
+ log.warn("createBtcTradingFeeTx failed: tradingFeeTx={}, txOutputs={}", tradingFeeTx.toString(),
+ tradingFeeTx.getOutputs());
throw t;
}
}
@@ -241,17 +191,8 @@ public class TradeWalletService {
Address changeAddress,
Coin reservedFundsForOffer,
boolean useSavingsWallet,
- Coin txFee) throws
- TransactionVerificationException, WalletException,
- InsufficientMoneyException, AddressFormatException {
-
- log.debug("preparedBsqTx {}", preparedBsqTx);
- log.debug("fundingAddress {}", fundingAddress);
- log.debug("changeAddress {}", changeAddress);
- log.debug("reservedFundsForOffer {}", reservedFundsForOffer.toPlainString());
- log.debug("useSavingsWallet {}", useSavingsWallet);
- log.debug("txFee {}", txFee.toPlainString());
-
+ Coin txFee)
+ throws TransactionVerificationException, WalletException, InsufficientMoneyException, AddressFormatException {
// preparedBsqTx has following structure:
// inputs [1-n] BSQ inputs
// outputs [0-1] BSQ change output
@@ -279,6 +220,10 @@ public class TradeWalletService {
// wait for 1 confirmation)
// In case of double spend we will detect later in the trade process and use a ban score to penalize bad behaviour (not impl. yet)
+ // If BSQ trade fee > reservedFundsForOffer we would create a BSQ output instead of a BTC output.
+ // As the min. reservedFundsForOffer is 0.001 BTC which is 1000 BSQ this is an unrealistic scenario and not
+ // handled atm (if BTC price is 1M USD and BSQ price is 0.1 USD, then fee would be 10% which still is unrealistic).
+
// WalletService.printTx("preparedBsqTx", preparedBsqTx);
SendRequest sendRequest = SendRequest.forTx(preparedBsqTx);
sendRequest.shuffleOutputs = false;
@@ -306,7 +251,8 @@ public class TradeWalletService {
// Sign all BTC inputs
for (int i = preparedBsqTxInputsSize; i < resultTx.getInputs().size(); i++) {
TransactionInput txIn = resultTx.getInputs().get(i);
- checkArgument(txIn.getConnectedOutput() != null && txIn.getConnectedOutput().isMine(wallet),
+ checkArgument(txIn.getConnectedOutput() != null &&
+ txIn.getConnectedOutput().isMine(wallet),
"txIn.getConnectedOutput() is not in our wallet. That must not happen.");
WalletService.signTransactionInput(wallet, aesKey, resultTx, txIn, i);
WalletService.checkScriptSig(resultTx, txIn, i);
@@ -321,9 +267,10 @@ public class TradeWalletService {
///////////////////////////////////////////////////////////////////////////////////////////
- // Trade
+ // Deposit tx
///////////////////////////////////////////////////////////////////////////////////////////
+
// We construct the deposit transaction in the way that the buyer is always the first entry (inputs, outputs, MS keys) and then the seller.
// In the creation of the deposit tx the taker/maker roles are the determining roles instead of buyer/seller.
// In the payout tx is is the buyer/seller role. We keep the buyer/seller ordering over all transactions to not get confusion with ordering,
@@ -341,18 +288,10 @@ public class TradeWalletService {
* @return A data container holding the inputs, the output value and address
* @throws TransactionVerificationException
*/
- public InputsAndChangeOutput takerCreatesDepositsTxInputs(Transaction takeOfferFeeTx,
- Coin inputAmount,
- Coin txFee,
- Address takersAddress) throws
- TransactionVerificationException {
- if (log.isDebugEnabled()) {
- log.debug("takerCreatesDepositsTxInputs called");
- log.debug("inputAmount {}", inputAmount.toFriendlyString());
- log.debug("txFee {}", txFee.toFriendlyString());
- log.debug("takersAddress {}", takersAddress.toString());
- }
-
+ public InputsAndChangeOutput takerCreatesDepositTxInputs(Transaction takeOfferFeeTx,
+ Coin inputAmount,
+ Coin txFee)
+ throws TransactionVerificationException {
// We add the mining fee 2 times to the deposit tx:
// 1. Will be spent when publishing the deposit tx (paid by buyer)
// 2. Will be added to the MS amount, so when publishing the payout tx the fee is already there and the outputs are not changed by fee reduction
@@ -390,14 +329,13 @@ public class TradeWalletService {
//WalletService.printTx("dummyTX", dummyTX);
- List rawTransactionInputList = dummyTX.getInputs().stream()
- .map(e -> {
- checkNotNull(e.getConnectedOutput(), "e.getConnectedOutput() must not be null");
- checkNotNull(e.getConnectedOutput().getParentTransaction(), "e.getConnectedOutput().getParentTransaction() must not be null");
- checkNotNull(e.getValue(), "e.getValue() must not be null");
- return getRawInputFromTransactionInput(e);
- })
- .collect(Collectors.toList());
+ List rawTransactionInputList = dummyTX.getInputs().stream().map(e -> {
+ checkNotNull(e.getConnectedOutput(), "e.getConnectedOutput() must not be null");
+ checkNotNull(e.getConnectedOutput().getParentTransaction(),
+ "e.getConnectedOutput().getParentTransaction() must not be null");
+ checkNotNull(e.getValue(), "e.getValue() must not be null");
+ return getRawInputFromTransactionInput(e);
+ }).collect(Collectors.toList());
// TODO changeOutputValue and changeOutputAddress is not used as taker spends exact amount from fee tx.
@@ -408,6 +346,54 @@ public class TradeWalletService {
return new InputsAndChangeOutput(new ArrayList<>(rawTransactionInputList), 0, null);
}
+ public PreparedDepositTxAndMakerInputs sellerAsMakerCreatesDepositTx(byte[] contractHash,
+ Coin makerInputAmount,
+ Coin msOutputAmount,
+ List takerRawTransactionInputs,
+ long takerChangeOutputValue,
+ @Nullable String takerChangeAddressString,
+ Address makerAddress,
+ Address makerChangeAddress,
+ byte[] buyerPubKey,
+ byte[] sellerPubKey)
+ throws SigningException, TransactionVerificationException, WalletException, AddressFormatException {
+ return makerCreatesDepositTx(false,
+ contractHash,
+ makerInputAmount,
+ msOutputAmount,
+ takerRawTransactionInputs,
+ takerChangeOutputValue,
+ takerChangeAddressString,
+ makerAddress,
+ makerChangeAddress,
+ buyerPubKey,
+ sellerPubKey);
+ }
+
+ public PreparedDepositTxAndMakerInputs buyerAsMakerCreatesAndSignsDepositTx(byte[] contractHash,
+ Coin makerInputAmount,
+ Coin msOutputAmount,
+ List takerRawTransactionInputs,
+ long takerChangeOutputValue,
+ @Nullable String takerChangeAddressString,
+ Address makerAddress,
+ Address makerChangeAddress,
+ byte[] buyerPubKey,
+ byte[] sellerPubKey)
+ throws SigningException, TransactionVerificationException, WalletException, AddressFormatException {
+ return makerCreatesDepositTx(true,
+ contractHash,
+ makerInputAmount,
+ msOutputAmount,
+ takerRawTransactionInputs,
+ takerChangeOutputValue,
+ takerChangeAddressString,
+ makerAddress,
+ makerChangeAddress,
+ buyerPubKey,
+ sellerPubKey);
+ }
+
/**
* The maker creates the deposit transaction using the takers input(s) and optional output and signs his input(s).
*
@@ -422,38 +408,23 @@ public class TradeWalletService {
* @param makerChangeAddress The maker's change address.
* @param buyerPubKey The public key of the buyer.
* @param sellerPubKey The public key of the seller.
- * @param arbitratorPubKey The public key of the arbitrator.
* @return A data container holding the serialized transaction and the maker raw inputs
* @throws SigningException
* @throws TransactionVerificationException
* @throws WalletException
*/
- public PreparedDepositTxAndMakerInputs makerCreatesAndSignsDepositTx(boolean makerIsBuyer,
- byte[] contractHash,
- Coin makerInputAmount,
- Coin msOutputAmount,
- List takerRawTransactionInputs,
- long takerChangeOutputValue,
- @Nullable String takerChangeAddressString,
- Address makerAddress,
- Address makerChangeAddress,
- byte[] buyerPubKey,
- byte[] sellerPubKey,
- byte[] arbitratorPubKey)
+ private PreparedDepositTxAndMakerInputs makerCreatesDepositTx(boolean makerIsBuyer,
+ byte[] contractHash,
+ Coin makerInputAmount,
+ Coin msOutputAmount,
+ List takerRawTransactionInputs,
+ long takerChangeOutputValue,
+ @Nullable String takerChangeAddressString,
+ Address makerAddress,
+ Address makerChangeAddress,
+ byte[] buyerPubKey,
+ byte[] sellerPubKey)
throws SigningException, TransactionVerificationException, WalletException, AddressFormatException {
- log.debug("makerCreatesAndSignsDepositTx called");
- log.debug("makerIsBuyer {}", makerIsBuyer);
- log.debug("makerInputAmount {}", makerInputAmount.toFriendlyString());
- log.debug("msOutputAmount {}", msOutputAmount.toFriendlyString());
- log.debug("takerRawInputs {}", takerRawTransactionInputs.toString());
- log.debug("takerChangeOutputValue {}", takerChangeOutputValue);
- log.debug("takerChangeAddressString {}", takerChangeAddressString);
- log.debug("makerAddress {}", makerAddress);
- log.debug("makerChangeAddress {}", makerChangeAddress);
- log.debug("buyerPubKey {}", ECKey.fromPublicOnly(buyerPubKey));
- log.debug("sellerPubKey {}", ECKey.fromPublicOnly(sellerPubKey));
- log.debug("arbitratorPubKey {}", ECKey.fromPublicOnly(arbitratorPubKey));
-
checkArgument(!takerRawTransactionInputs.isEmpty());
// First we construct a dummy TX to get the inputs and outputs we want to use for the real deposit tx.
@@ -461,7 +432,7 @@ public class TradeWalletService {
Transaction dummyTx = new Transaction(params);
TransactionOutput dummyOutput = new TransactionOutput(params, dummyTx, makerInputAmount, new ECKey().toAddress(params));
dummyTx.addOutput(dummyOutput);
- addAvailableInputsAndChangeOutputs(dummyTx, makerAddress, makerChangeAddress, Coin.ZERO);
+ addAvailableInputsAndChangeOutputs(dummyTx, makerAddress, makerChangeAddress);
// Normally we have only 1 input but we support multiple inputs if the user has paid in with several transactions.
List makerInputs = dummyTx.getInputs();
TransactionOutput makerOutput = null;
@@ -470,8 +441,9 @@ public class TradeWalletService {
checkArgument(dummyTx.getOutputs().size() < 3, "dummyTx.getOutputs().size() >= 3");
// Only save change outputs, the dummy output is ignored (that's why we start with index 1)
- if (dummyTx.getOutputs().size() > 1)
+ if (dummyTx.getOutputs().size() > 1) {
makerOutput = dummyTx.getOutput(1);
+ }
// Now we construct the real deposit tx
Transaction preparedDepositTx = new Transaction(params);
@@ -505,10 +477,11 @@ public class TradeWalletService {
// Add MultiSig output
- Script p2SHMultiSigOutputScript = getP2SHMultiSigOutputScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
+ Script p2SHMultiSigOutputScript = get2of2MultiSigOutputScript(buyerPubKey, sellerPubKey);
// Tx fee for deposit tx will be paid by buyer.
- TransactionOutput p2SHMultiSigOutput = new TransactionOutput(params, preparedDepositTx, msOutputAmount, p2SHMultiSigOutputScript.getProgram());
+ TransactionOutput p2SHMultiSigOutput = new TransactionOutput(params, preparedDepositTx, msOutputAmount,
+ p2SHMultiSigOutputScript.getProgram());
preparedDepositTx.addOutput(p2SHMultiSigOutput);
// We add the hash ot OP_RETURN with a 0 amount output
@@ -517,31 +490,35 @@ public class TradeWalletService {
preparedDepositTx.addOutput(contractHashOutput);
TransactionOutput takerTransactionOutput = null;
- if (takerChangeOutputValue > 0 && takerChangeAddressString != null)
+ if (takerChangeOutputValue > 0 && takerChangeAddressString != null) {
takerTransactionOutput = new TransactionOutput(params, preparedDepositTx, Coin.valueOf(takerChangeOutputValue),
Address.fromBase58(params, takerChangeAddressString));
+ }
if (makerIsBuyer) {
// Add optional buyer outputs
- if (makerOutput != null)
+ if (makerOutput != null) {
preparedDepositTx.addOutput(makerOutput);
+ }
// Add optional seller outputs
- if (takerTransactionOutput != null)
+ if (takerTransactionOutput != null) {
preparedDepositTx.addOutput(takerTransactionOutput);
+ }
} else {
// taker is buyer role
// Add optional seller outputs
- if (takerTransactionOutput != null)
+ if (takerTransactionOutput != null) {
preparedDepositTx.addOutput(takerTransactionOutput);
+ }
// Add optional buyer outputs
- if (makerOutput != null)
+ if (makerOutput != null) {
preparedDepositTx.addOutput(makerOutput);
+ }
}
- // Sign inputs
int start = makerIsBuyer ? 0 : takerRawTransactionInputs.size();
int end = makerIsBuyer ? makerInputs.size() : preparedDepositTx.getInputs().size();
for (int i = start; i < end; i++) {
@@ -550,8 +527,7 @@ public class TradeWalletService {
WalletService.checkScriptSig(preparedDepositTx, input, i);
}
- WalletService.printTx("prepared depositTx", preparedDepositTx);
-
+ WalletService.printTx("makerCreatesDepositTx", preparedDepositTx);
WalletService.verifyTransaction(preparedDepositTx);
return new PreparedDepositTxAndMakerInputs(makerRawTransactionInputs, preparedDepositTx.bitcoinSerialize());
@@ -567,40 +543,28 @@ public class TradeWalletService {
* @param sellerInputs The connected outputs for all inputs of the seller.
* @param buyerPubKey The public key of the buyer.
* @param sellerPubKey The public key of the seller.
- * @param arbitratorPubKey The public key of the arbitrator.
- * @param callback Callback when transaction is broadcasted.
* @throws SigningException
* @throws TransactionVerificationException
* @throws WalletException
*/
- public Transaction takerSignsAndPublishesDepositTx(boolean takerIsSeller,
- byte[] contractHash,
- byte[] makersDepositTxSerialized,
- List buyerInputs,
- List sellerInputs,
- byte[] buyerPubKey,
- byte[] sellerPubKey,
- byte[] arbitratorPubKey,
- TxBroadcaster.Callback callback) throws SigningException, TransactionVerificationException,
- WalletException {
+ public Transaction takerSignsDepositTx(boolean takerIsSeller,
+ byte[] contractHash,
+ byte[] makersDepositTxSerialized,
+ List buyerInputs,
+ List sellerInputs,
+ byte[] buyerPubKey,
+ byte[] sellerPubKey)
+ throws SigningException, TransactionVerificationException, WalletException {
Transaction makersDepositTx = new Transaction(params, makersDepositTxSerialized);
- log.debug("signAndPublishDepositTx called");
- log.debug("takerIsSeller {}", takerIsSeller);
- log.debug("makersDepositTx {}", makersDepositTx.toString());
- log.debug("buyerConnectedOutputsForAllInputs {}", buyerInputs.toString());
- log.debug("sellerConnectedOutputsForAllInputs {}", sellerInputs.toString());
- log.debug("buyerPubKey {}", ECKey.fromPublicOnly(buyerPubKey).toString());
- log.debug("sellerPubKey {}", ECKey.fromPublicOnly(sellerPubKey).toString());
- log.debug("arbitratorPubKey {}", ECKey.fromPublicOnly(arbitratorPubKey).toString());
-
checkArgument(!buyerInputs.isEmpty());
checkArgument(!sellerInputs.isEmpty());
// Check if maker's Multisig script is identical to the takers
- Script p2SHMultiSigOutputScript = getP2SHMultiSigOutputScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
- if (!makersDepositTx.getOutput(0).getScriptPubKey().equals(p2SHMultiSigOutputScript))
+ Script p2SHMultiSigOutputScript = get2of2MultiSigOutputScript(buyerPubKey, sellerPubKey);
+ if (!makersDepositTx.getOutput(0).getScriptPubKey().equals(p2SHMultiSigOutputScript)) {
throw new TransactionVerificationException("Maker's p2SHMultiSigOutputScript does not match to takers p2SHMultiSigOutputScript");
+ }
// The outpoints are not available from the serialized makersDepositTx, so we cannot use that tx directly, but we use it to construct a new
// depositTx
@@ -609,22 +573,29 @@ public class TradeWalletService {
if (takerIsSeller) {
// Add buyer inputs and apply signature
// We grab the signature from the makersDepositTx and apply it to the new tx input
- for (int i = 0; i < buyerInputs.size(); i++)
- depositTx.addInput(getTransactionInput(depositTx, getScriptProgram(makersDepositTx, i), buyerInputs.get(i)));
+ for (int i = 0; i < buyerInputs.size(); i++) {
+ TransactionInput transactionInput = makersDepositTx.getInputs().get(i);
+ depositTx.addInput(getTransactionInput(depositTx, getMakersScriptSigProgram(transactionInput), buyerInputs.get(i)));
+ }
// Add seller inputs
- for (RawTransactionInput rawTransactionInput : sellerInputs)
+ for (RawTransactionInput rawTransactionInput : sellerInputs) {
depositTx.addInput(getTransactionInput(depositTx, new byte[]{}, rawTransactionInput));
+ }
} else {
// taker is buyer
// Add buyer inputs and apply signature
- for (RawTransactionInput rawTransactionInput : buyerInputs)
+ for (RawTransactionInput rawTransactionInput : buyerInputs) {
depositTx.addInput(getTransactionInput(depositTx, new byte[]{}, rawTransactionInput));
+ }
// Add seller inputs
// We grab the signature from the makersDepositTx and apply it to the new tx input
- for (int i = buyerInputs.size(), k = 0; i < makersDepositTx.getInputs().size(); i++, k++)
- depositTx.addInput(getTransactionInput(depositTx, getScriptProgram(makersDepositTx, i), sellerInputs.get(k)));
+ for (int i = buyerInputs.size(), k = 0; i < makersDepositTx.getInputs().size(); i++, k++) {
+ TransactionInput transactionInput = makersDepositTx.getInputs().get(i);
+ // We get the deposit tx unsigned if maker is seller
+ depositTx.addInput(getTransactionInput(depositTx, new byte[]{}, sellerInputs.get(k)));
+ }
}
// Check if OP_RETURN output with contract hash matches the one from the maker
@@ -633,12 +604,13 @@ public class TradeWalletService {
log.debug("contractHashOutput {}", contractHashOutput);
TransactionOutput makersContractHashOutput = makersDepositTx.getOutputs().get(1);
log.debug("makersContractHashOutput {}", makersContractHashOutput);
- if (!makersContractHashOutput.getScriptPubKey().equals(contractHashOutput.getScriptPubKey()))
+ if (!makersContractHashOutput.getScriptPubKey().equals(contractHashOutput.getScriptPubKey())) {
throw new TransactionVerificationException("Maker's transaction output for the contract hash is not matching takers version.");
+ }
// Add all outputs from makersDepositTx to depositTx
makersDepositTx.getOutputs().forEach(depositTx::addOutput);
- //WalletService.printTx("makersDepositTx", makersDepositTx);
+ WalletService.printTx("makersDepositTx", makersDepositTx);
// Sign inputs
int start = takerIsSeller ? buyerInputs.size() : 0;
@@ -649,17 +621,113 @@ public class TradeWalletService {
WalletService.checkScriptSig(depositTx, input, i);
}
- WalletService.printTx("depositTx", depositTx);
+ WalletService.printTx("takerSignsDepositTx", depositTx);
WalletService.verifyTransaction(depositTx);
WalletService.checkWalletConsistency(wallet);
- broadcastTx(depositTx, callback);
-
return depositTx;
}
+ public void sellerAsMakerFinalizesDepositTx(Transaction myDepositTx, Transaction takersDepositTx, int numTakersInputs)
+ throws TransactionVerificationException, AddressFormatException {
+
+ // We add takers signature from his inputs and add it to out tx which was already signed earlier.
+ for (int i = 0; i < numTakersInputs; i++) {
+ TransactionInput input = takersDepositTx.getInput(i);
+ Script scriptSig = input.getScriptSig();
+ myDepositTx.getInput(i).setScriptSig(scriptSig);
+ }
+
+ WalletService.printTx("sellerAsMakerFinalizesDepositTx", myDepositTx);
+ WalletService.verifyTransaction(myDepositTx);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Delayed payout tx
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public Transaction createDelayedUnsignedPayoutTx(Transaction depositTx,
+ String donationAddressString,
+ Coin minerFee,
+ long lockTime)
+ throws AddressFormatException, TransactionVerificationException {
+ TransactionOutput p2SHMultiSigOutput = depositTx.getOutput(0);
+ Transaction delayedPayoutTx = new Transaction(params);
+ delayedPayoutTx.addInput(p2SHMultiSigOutput);
+ applyLockTime(lockTime, delayedPayoutTx);
+ Coin outputAmount = depositTx.getOutputSum().subtract(minerFee);
+ delayedPayoutTx.addOutput(outputAmount, Address.fromBase58(params, donationAddressString));
+ WalletService.printTx("Unsigned delayedPayoutTx ToDonationAddress", delayedPayoutTx);
+ WalletService.verifyTransaction(delayedPayoutTx);
+ return delayedPayoutTx;
+ }
+
+ public byte[] signDelayedPayoutTx(Transaction delayedPayoutTx,
+ DeterministicKey myMultiSigKeyPair,
+ byte[] buyerPubKey,
+ byte[] sellerPubKey)
+ throws AddressFormatException, TransactionVerificationException {
+
+ Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey);
+ Sha256Hash sigHash = delayedPayoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false);
+ checkNotNull(myMultiSigKeyPair, "myMultiSigKeyPair must not be null");
+ if (myMultiSigKeyPair.isEncrypted()) {
+ checkNotNull(aesKey);
+ }
+
+ ECKey.ECDSASignature mySignature = myMultiSigKeyPair.sign(sigHash, aesKey).toCanonicalised();
+ WalletService.printTx("delayedPayoutTx for sig creation", delayedPayoutTx);
+ WalletService.verifyTransaction(delayedPayoutTx);
+ return mySignature.encodeToDER();
+ }
+
+ public Transaction finalizeDelayedPayoutTx(Transaction delayedPayoutTx,
+ byte[] buyerPubKey,
+ byte[] sellerPubKey,
+ byte[] buyerSignature,
+ byte[] sellerSignature)
+ throws AddressFormatException, TransactionVerificationException, WalletException {
+ Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey);
+ ECKey.ECDSASignature buyerECDSASignature = ECKey.ECDSASignature.decodeFromDER(buyerSignature);
+ ECKey.ECDSASignature sellerECDSASignature = ECKey.ECDSASignature.decodeFromDER(sellerSignature);
+ TransactionSignature buyerTxSig = new TransactionSignature(buyerECDSASignature, Transaction.SigHash.ALL, false);
+ TransactionSignature sellerTxSig = new TransactionSignature(sellerECDSASignature, Transaction.SigHash.ALL, false);
+ Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig), redeemScript);
+ TransactionInput input = delayedPayoutTx.getInput(0);
+ input.setScriptSig(inputScript);
+ WalletService.printTx("finalizeDelayedPayoutTx", delayedPayoutTx);
+ WalletService.verifyTransaction(delayedPayoutTx);
+ WalletService.checkWalletConsistency(wallet);
+ WalletService.checkScriptSig(delayedPayoutTx, input, 0);
+ checkNotNull(input.getConnectedOutput(), "input.getConnectedOutput() must not be null");
+ input.verify(input.getConnectedOutput());
+ return delayedPayoutTx;
+ }
+
+ public boolean verifiesDepositTxAndDelayedPayoutTx(Transaction depositTx,
+ Transaction delayedPayoutTx) {
+ // todo add more checks
+ if (delayedPayoutTx.getLockTime() == 0) {
+ log.error("Time lock is not set");
+ return false;
+ }
+
+ if (delayedPayoutTx.getInputs().stream().noneMatch(e -> e.getSequenceNumber() == TransactionInput.NO_SEQUENCE - 1)) {
+ log.error("Sequence number must be 0xFFFFFFFE");
+ return false;
+ }
+
+ return true;
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Standard payout tx
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
/**
* Seller signs payout transaction, buyer has not signed yet.
*
@@ -671,7 +739,6 @@ public class TradeWalletService {
* @param multiSigKeyPair DeterministicKey for MultiSig from seller
* @param buyerPubKey The public key of the buyer.
* @param sellerPubKey The public key of the seller.
- * @param arbitratorPubKey The public key of the arbitrator.
* @return DER encoded canonical signature
* @throws AddressFormatException
* @throws TransactionVerificationException
@@ -683,38 +750,21 @@ public class TradeWalletService {
String sellerPayoutAddressString,
DeterministicKey multiSigKeyPair,
byte[] buyerPubKey,
- byte[] sellerPubKey,
- byte[] arbitratorPubKey)
+ byte[] sellerPubKey)
throws AddressFormatException, TransactionVerificationException {
- log.trace("sellerSignsPayoutTx called");
- log.trace("depositTx {}", depositTx.toString());
- log.trace("buyerPayoutAmount {}", buyerPayoutAmount.toFriendlyString());
- log.trace("sellerPayoutAmount {}", sellerPayoutAmount.toFriendlyString());
- log.trace("buyerPayoutAddressString {}", buyerPayoutAddressString);
- log.trace("sellerPayoutAddressString {}", sellerPayoutAddressString);
- log.trace("multiSigKeyPair (not displayed for security reasons)");
- log.info("buyerPubKey HEX=" + ECKey.fromPublicOnly(buyerPubKey).getPublicKeyAsHex());
- log.info("sellerPubKey HEX=" + ECKey.fromPublicOnly(sellerPubKey).getPublicKeyAsHex());
- log.info("arbitratorPubKey HEX=" + ECKey.fromPublicOnly(arbitratorPubKey).getPublicKeyAsHex());
- Transaction preparedPayoutTx = createPayoutTx(depositTx,
- buyerPayoutAmount,
- sellerPayoutAmount,
- buyerPayoutAddressString,
- sellerPayoutAddressString);
+ Transaction preparedPayoutTx = createPayoutTx(depositTx, buyerPayoutAmount, sellerPayoutAmount,
+ buyerPayoutAddressString, sellerPayoutAddressString);
// MS redeemScript
- Script redeemScript = getMultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
+ Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey);
// MS output from prev. tx is index 0
Sha256Hash sigHash = preparedPayoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false);
checkNotNull(multiSigKeyPair, "multiSigKeyPair must not be null");
- if (multiSigKeyPair.isEncrypted())
+ if (multiSigKeyPair.isEncrypted()) {
checkNotNull(aesKey);
-
+ }
ECKey.ECDSASignature buyerSignature = multiSigKeyPair.sign(sigHash, aesKey).toCanonicalised();
-
WalletService.printTx("prepared payoutTx", preparedPayoutTx);
-
WalletService.verifyTransaction(preparedPayoutTx);
-
return buyerSignature.encodeToDER();
}
@@ -731,7 +781,6 @@ public class TradeWalletService {
* @param multiSigKeyPair Buyer's keypair for MultiSig
* @param buyerPubKey The public key of the buyer.
* @param sellerPubKey The public key of the seller.
- * @param arbitratorPubKey The public key of the arbitrator.
* @return The payout transaction
* @throws AddressFormatException
* @throws TransactionVerificationException
@@ -745,49 +794,27 @@ public class TradeWalletService {
String sellerPayoutAddressString,
DeterministicKey multiSigKeyPair,
byte[] buyerPubKey,
- byte[] sellerPubKey,
- byte[] arbitratorPubKey)
+ byte[] sellerPubKey)
throws AddressFormatException, TransactionVerificationException, WalletException {
- log.trace("buyerSignsAndFinalizesPayoutTx called");
- log.trace("depositTx {}", depositTx.toString());
- log.trace("buyerSignature r {}", ECKey.ECDSASignature.decodeFromDER(buyerSignature).r.toString());
- log.trace("buyerSignature s {}", ECKey.ECDSASignature.decodeFromDER(buyerSignature).s.toString());
- log.trace("buyerPayoutAmount {}", buyerPayoutAmount.toFriendlyString());
- log.trace("sellerPayoutAmount {}", sellerPayoutAmount.toFriendlyString());
- log.trace("buyerPayoutAddressString {}", buyerPayoutAddressString);
- log.trace("sellerPayoutAddressString {}", sellerPayoutAddressString);
- log.trace("multiSigKeyPair (not displayed for security reasons)");
- log.info("buyerPubKey {}", ECKey.fromPublicOnly(buyerPubKey).toString());
- log.info("sellerPubKey {}", ECKey.fromPublicOnly(sellerPubKey).toString());
- log.info("arbitratorPubKey {}", ECKey.fromPublicOnly(arbitratorPubKey).toString());
-
- Transaction payoutTx = createPayoutTx(depositTx,
- buyerPayoutAmount,
- sellerPayoutAmount,
- buyerPayoutAddressString,
- sellerPayoutAddressString);
+ Transaction payoutTx = createPayoutTx(depositTx, buyerPayoutAmount, sellerPayoutAmount, buyerPayoutAddressString, sellerPayoutAddressString);
// MS redeemScript
- Script redeemScript = getMultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
+ Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey);
// MS output from prev. tx is index 0
Sha256Hash sigHash = payoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false);
checkNotNull(multiSigKeyPair, "multiSigKeyPair must not be null");
- if (multiSigKeyPair.isEncrypted())
+ if (multiSigKeyPair.isEncrypted()) {
checkNotNull(aesKey);
-
-
+ }
ECKey.ECDSASignature sellerSignature = multiSigKeyPair.sign(sigHash, aesKey).toCanonicalised();
-
TransactionSignature buyerTxSig = new TransactionSignature(ECKey.ECDSASignature.decodeFromDER(buyerSignature),
Transaction.SigHash.ALL, false);
TransactionSignature sellerTxSig = new TransactionSignature(sellerSignature, Transaction.SigHash.ALL, false);
// Take care of order of signatures. Need to be reversed here. See comment below at getMultiSigRedeemScript (arbitrator, seller, buyer)
- Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig), redeemScript);
-
+ Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig),
+ redeemScript);
TransactionInput input = payoutTx.getInput(0);
input.setScriptSig(inputScript);
-
WalletService.printTx("payoutTx", payoutTx);
-
WalletService.verifyTransaction(payoutTx);
WalletService.checkWalletConsistency(wallet);
WalletService.checkScriptSig(payoutTx, input, 0);
@@ -798,7 +825,7 @@ public class TradeWalletService {
///////////////////////////////////////////////////////////////////////////////////////////
- // Mediation
+ // Mediated payoutTx
///////////////////////////////////////////////////////////////////////////////////////////
public byte[] signMediatedPayoutTx(Transaction depositTx,
@@ -808,38 +835,20 @@ public class TradeWalletService {
String sellerPayoutAddressString,
DeterministicKey myMultiSigKeyPair,
byte[] buyerPubKey,
- byte[] sellerPubKey,
- byte[] arbitratorPubKey)
+ byte[] sellerPubKey)
throws AddressFormatException, TransactionVerificationException {
- log.trace("signMediatedPayoutTx called");
- log.trace("depositTx {}", depositTx.toString());
- log.trace("buyerPayoutAmount {}", buyerPayoutAmount.toFriendlyString());
- log.trace("sellerPayoutAmount {}", sellerPayoutAmount.toFriendlyString());
- log.trace("buyerPayoutAddressString {}", buyerPayoutAddressString);
- log.trace("sellerPayoutAddressString {}", sellerPayoutAddressString);
- log.trace("multiSigKeyPair (not displayed for security reasons)");
- log.trace("buyerPubKey HEX=" + ECKey.fromPublicOnly(buyerPubKey).getPublicKeyAsHex());
- log.trace("sellerPubKey HEX=" + ECKey.fromPublicOnly(sellerPubKey).getPublicKeyAsHex());
- log.trace("arbitratorPubKey HEX=" + ECKey.fromPublicOnly(arbitratorPubKey).getPublicKeyAsHex());
- Transaction preparedPayoutTx = createPayoutTx(depositTx,
- buyerPayoutAmount,
- sellerPayoutAmount,
- buyerPayoutAddressString,
- sellerPayoutAddressString);
+ Transaction preparedPayoutTx = createPayoutTx(depositTx, buyerPayoutAmount, sellerPayoutAmount, buyerPayoutAddressString, sellerPayoutAddressString);
// MS redeemScript
- Script redeemScript = getMultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
+ Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey);
// MS output from prev. tx is index 0
Sha256Hash sigHash = preparedPayoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false);
checkNotNull(myMultiSigKeyPair, "myMultiSigKeyPair must not be null");
- if (myMultiSigKeyPair.isEncrypted())
+ if (myMultiSigKeyPair.isEncrypted()) {
checkNotNull(aesKey);
-
+ }
ECKey.ECDSASignature mySignature = myMultiSigKeyPair.sign(sigHash, aesKey).toCanonicalised();
-
WalletService.printTx("prepared mediated payoutTx for sig creation", preparedPayoutTx);
-
WalletService.verifyTransaction(preparedPayoutTx);
-
return mySignature.encodeToDER();
}
@@ -852,47 +861,22 @@ public class TradeWalletService {
String sellerPayoutAddressString,
DeterministicKey multiSigKeyPair,
byte[] buyerPubKey,
- byte[] sellerPubKey,
- byte[] arbitratorPubKey)
+ byte[] sellerPubKey)
throws AddressFormatException, TransactionVerificationException, WalletException {
- log.trace("finalizeMediatedPayoutTx called");
- log.trace("depositTx {}", depositTx.toString());
- log.trace("buyerSignature r {}", ECKey.ECDSASignature.decodeFromDER(buyerSignature).r.toString());
- log.trace("buyerSignature s {}", ECKey.ECDSASignature.decodeFromDER(buyerSignature).s.toString());
- log.trace("sellerSignature r {}", ECKey.ECDSASignature.decodeFromDER(sellerSignature).r.toString());
- log.trace("sellerSignature s {}", ECKey.ECDSASignature.decodeFromDER(sellerSignature).s.toString());
- log.trace("buyerPayoutAmount {}", buyerPayoutAmount.toFriendlyString());
- log.trace("sellerPayoutAmount {}", sellerPayoutAmount.toFriendlyString());
- log.trace("buyerPayoutAddressString {}", buyerPayoutAddressString);
- log.trace("sellerPayoutAddressString {}", sellerPayoutAddressString);
- log.trace("multiSigKeyPair (not displayed for security reasons)");
- log.trace("buyerPubKey {}", ECKey.fromPublicOnly(buyerPubKey).toString());
- log.trace("sellerPubKey {}", ECKey.fromPublicOnly(sellerPubKey).toString());
- log.trace("arbitratorPubKey {}", ECKey.fromPublicOnly(arbitratorPubKey).toString());
-
- Transaction payoutTx = createPayoutTx(depositTx,
- buyerPayoutAmount,
- sellerPayoutAmount,
- buyerPayoutAddressString,
- sellerPayoutAddressString);
+ Transaction payoutTx = createPayoutTx(depositTx, buyerPayoutAmount, sellerPayoutAmount, buyerPayoutAddressString, sellerPayoutAddressString);
// MS redeemScript
- Script redeemScript = getMultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
+ Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey);
// MS output from prev. tx is index 0
checkNotNull(multiSigKeyPair, "multiSigKeyPair must not be null");
-
TransactionSignature buyerTxSig = new TransactionSignature(ECKey.ECDSASignature.decodeFromDER(buyerSignature),
Transaction.SigHash.ALL, false);
TransactionSignature sellerTxSig = new TransactionSignature(ECKey.ECDSASignature.decodeFromDER(sellerSignature),
Transaction.SigHash.ALL, false);
-
// Take care of order of signatures. Need to be reversed here. See comment below at getMultiSigRedeemScript (arbitrator, seller, buyer)
Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig), redeemScript);
-
TransactionInput input = payoutTx.getInput(0);
input.setScriptSig(inputScript);
-
WalletService.printTx("mediated payoutTx", payoutTx);
-
WalletService.verifyTransaction(payoutTx);
WalletService.checkWalletConsistency(wallet);
WalletService.checkScriptSig(payoutTx, input, 0);
@@ -903,7 +887,7 @@ public class TradeWalletService {
///////////////////////////////////////////////////////////////////////////////////////////
- // Arbitration
+ // Arbitrated payoutTx
///////////////////////////////////////////////////////////////////////////////////////////
/**
@@ -933,39 +917,27 @@ public class TradeWalletService {
byte[] arbitratorPubKey)
throws AddressFormatException, TransactionVerificationException {
Transaction depositTx = new Transaction(params, depositTxSerialized);
- log.trace("signDisputedPayoutTx called");
- log.trace("depositTx {}", depositTx.toString());
- log.trace("buyerPayoutAmount {}", buyerPayoutAmount.toFriendlyString());
- log.trace("sellerPayoutAmount {}", sellerPayoutAmount.toFriendlyString());
- log.trace("buyerAddressString {}", buyerAddressString);
- log.trace("sellerAddressString {}", sellerAddressString);
- log.trace("arbitratorKeyPair (not displayed for security reasons)");
- log.info("buyerPubKey {}", ECKey.fromPublicOnly(buyerPubKey).toString());
- log.info("sellerPubKey {}", ECKey.fromPublicOnly(sellerPubKey).toString());
- log.info("arbitratorPubKey {}", ECKey.fromPublicOnly(arbitratorPubKey).toString());
-
// Our MS is index 0
TransactionOutput p2SHMultiSigOutput = depositTx.getOutput(0);
Transaction preparedPayoutTx = new Transaction(params);
preparedPayoutTx.addInput(p2SHMultiSigOutput);
- if (buyerPayoutAmount.isGreaterThan(Coin.ZERO))
+ if (buyerPayoutAmount.isGreaterThan(Coin.ZERO)) {
preparedPayoutTx.addOutput(buyerPayoutAmount, Address.fromBase58(params, buyerAddressString));
- if (sellerPayoutAmount.isGreaterThan(Coin.ZERO))
+ }
+ if (sellerPayoutAmount.isGreaterThan(Coin.ZERO)) {
preparedPayoutTx.addOutput(sellerPayoutAmount, Address.fromBase58(params, sellerAddressString));
+ }
// take care of sorting!
- Script redeemScript = getMultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
+ Script redeemScript = get2of3MultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
Sha256Hash sigHash = preparedPayoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false);
checkNotNull(arbitratorKeyPair, "arbitratorKeyPair must not be null");
- if (arbitratorKeyPair.isEncrypted())
+ if (arbitratorKeyPair.isEncrypted()) {
checkNotNull(aesKey);
-
+ }
ECKey.ECDSASignature arbitratorSignature = arbitratorKeyPair.sign(sigHash, aesKey).toCanonicalised();
-
WalletService.verifyTransaction(preparedPayoutTx);
-
- //WalletService.printTx("preparedPayoutTx", preparedPayoutTx);
-
+ WalletService.printTx("preparedPayoutTx", preparedPayoutTx);
return arbitratorSignature.encodeToDER();
}
@@ -999,47 +971,33 @@ public class TradeWalletService {
byte[] arbitratorPubKey)
throws AddressFormatException, TransactionVerificationException, WalletException {
Transaction depositTx = new Transaction(params, depositTxSerialized);
-
- log.trace("signAndFinalizeDisputedPayoutTx called");
- log.trace("depositTx {}", depositTx);
- log.trace("arbitratorSignature r {}", ECKey.ECDSASignature.decodeFromDER(arbitratorSignature).r.toString());
- log.trace("arbitratorSignature s {}", ECKey.ECDSASignature.decodeFromDER(arbitratorSignature).s.toString());
- log.trace("buyerPayoutAmount {}", buyerPayoutAmount.toFriendlyString());
- log.trace("sellerPayoutAmount {}", sellerPayoutAmount.toFriendlyString());
- log.trace("buyerAddressString {}", buyerAddressString);
- log.trace("sellerAddressString {}", sellerAddressString);
- log.trace("tradersMultiSigKeyPair (not displayed for security reasons)");
- log.info("buyerPubKey {}", ECKey.fromPublicOnly(buyerPubKey).toString());
- log.info("sellerPubKey {}", ECKey.fromPublicOnly(sellerPubKey).toString());
- log.info("arbitratorPubKey {}", ECKey.fromPublicOnly(arbitratorPubKey).toString());
-
-
TransactionOutput p2SHMultiSigOutput = depositTx.getOutput(0);
Transaction payoutTx = new Transaction(params);
payoutTx.addInput(p2SHMultiSigOutput);
- if (buyerPayoutAmount.isGreaterThan(Coin.ZERO))
+ if (buyerPayoutAmount.isGreaterThan(Coin.ZERO)) {
payoutTx.addOutput(buyerPayoutAmount, Address.fromBase58(params, buyerAddressString));
- if (sellerPayoutAmount.isGreaterThan(Coin.ZERO))
+ }
+ if (sellerPayoutAmount.isGreaterThan(Coin.ZERO)) {
payoutTx.addOutput(sellerPayoutAmount, Address.fromBase58(params, sellerAddressString));
+ }
// take care of sorting!
- Script redeemScript = getMultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
+ Script redeemScript = get2of3MultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
Sha256Hash sigHash = payoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false);
checkNotNull(tradersMultiSigKeyPair, "tradersMultiSigKeyPair must not be null");
- if (tradersMultiSigKeyPair.isEncrypted())
+ if (tradersMultiSigKeyPair.isEncrypted()) {
checkNotNull(aesKey);
+ }
ECKey.ECDSASignature tradersSignature = tradersMultiSigKeyPair.sign(sigHash, aesKey).toCanonicalised();
-
TransactionSignature tradersTxSig = new TransactionSignature(tradersSignature, Transaction.SigHash.ALL, false);
TransactionSignature arbitratorTxSig = new TransactionSignature(ECKey.ECDSASignature.decodeFromDER(arbitratorSignature),
Transaction.SigHash.ALL, false);
// Take care of order of signatures. See comment below at getMultiSigRedeemScript (sort order needed here: arbitrator, seller, buyer)
- Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(arbitratorTxSig, tradersTxSig), redeemScript);
+ Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(arbitratorTxSig, tradersTxSig),
+ redeemScript);
TransactionInput input = payoutTx.getInput(0);
input.setScriptSig(inputScript);
-
WalletService.printTx("disputed payoutTx", payoutTx);
-
WalletService.verifyTransaction(payoutTx);
WalletService.checkWalletConsistency(wallet);
WalletService.checkScriptSig(payoutTx, input, 0);
@@ -1049,49 +1007,38 @@ public class TradeWalletService {
}
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Emergency payoutTx
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+
// Emergency payout tool. Used only in cased when the payput from the arbitrator does not work because some data
// in the trade/dispute are messed up.
// We keep here arbitratorPayoutAmount just in case (requires cooperation from peer anyway)
- public Transaction emergencySignAndPublishPayoutTx(String depositTxHex,
- Coin buyerPayoutAmount,
- Coin sellerPayoutAmount,
- Coin arbitratorPayoutAmount,
- Coin txFee,
- String buyerAddressString,
- String sellerAddressString,
- String arbitratorAddressString,
- @Nullable String buyerPrivateKeyAsHex,
- @Nullable String sellerPrivateKeyAsHex,
- String arbitratorPrivateKeyAsHex,
- String buyerPubKeyAsHex,
- String sellerPubKeyAsHex,
- String arbitratorPubKeyAsHex,
- String P2SHMultiSigOutputScript,
- TxBroadcaster.Callback callback)
+ public Transaction emergencySignAndPublishPayoutTxFrom2of3MultiSig(String depositTxHex,
+ Coin buyerPayoutAmount,
+ Coin sellerPayoutAmount,
+ Coin arbitratorPayoutAmount,
+ Coin txFee,
+ String buyerAddressString,
+ String sellerAddressString,
+ String arbitratorAddressString,
+ @Nullable String buyerPrivateKeyAsHex,
+ @Nullable String sellerPrivateKeyAsHex,
+ String arbitratorPrivateKeyAsHex,
+ String buyerPubKeyAsHex,
+ String sellerPubKeyAsHex,
+ String arbitratorPubKeyAsHex,
+ TxBroadcaster.Callback callback)
throws AddressFormatException, TransactionVerificationException, WalletException {
- log.info("signAndPublishPayoutTx called");
- log.info("depositTxHex {}", depositTxHex);
- log.info("buyerPayoutAmount {}", buyerPayoutAmount.toFriendlyString());
- log.info("sellerPayoutAmount {}", sellerPayoutAmount.toFriendlyString());
- log.info("arbitratorPayoutAmount {}", arbitratorPayoutAmount.toFriendlyString());
- log.info("buyerAddressString {}", buyerAddressString);
- log.info("sellerAddressString {}", sellerAddressString);
- log.info("arbitratorAddressString {}", arbitratorAddressString);
- log.info("buyerPrivateKeyAsHex (not displayed for security reasons)");
- log.info("sellerPrivateKeyAsHex (not displayed for security reasons)");
- log.info("arbitratorPrivateKeyAsHex (not displayed for security reasons)");
- log.info("buyerPubKeyAsHex {}", buyerPubKeyAsHex);
- log.info("sellerPubKeyAsHex {}", sellerPubKeyAsHex);
- log.info("arbitratorPubKeyAsHex {}", arbitratorPubKeyAsHex);
- log.info("P2SHMultiSigOutputScript {}", P2SHMultiSigOutputScript);
-
- checkNotNull((buyerPrivateKeyAsHex != null || sellerPrivateKeyAsHex != null), "either buyerPrivateKeyAsHex or sellerPrivateKeyAsHex must not be null");
+ checkNotNull((buyerPrivateKeyAsHex != null || sellerPrivateKeyAsHex != null),
+ "either buyerPrivateKeyAsHex or sellerPrivateKeyAsHex must not be null");
byte[] buyerPubKey = ECKey.fromPublicOnly(Utils.HEX.decode(buyerPubKeyAsHex)).getPubKey();
byte[] sellerPubKey = ECKey.fromPublicOnly(Utils.HEX.decode(sellerPubKeyAsHex)).getPubKey();
- final byte[] arbitratorPubKey = ECKey.fromPublicOnly(Utils.HEX.decode(arbitratorPubKeyAsHex)).getPubKey();
+ byte[] arbitratorPubKey = ECKey.fromPublicOnly(Utils.HEX.decode(arbitratorPubKeyAsHex)).getPubKey();
- Script p2SHMultiSigOutputScript = getP2SHMultiSigOutputScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
+ Script p2SHMultiSigOutputScript = get2of3MultiSigOutputScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
Coin msOutput = buyerPayoutAmount.add(sellerPayoutAmount).add(arbitratorPayoutAmount).add(txFee);
TransactionOutput p2SHMultiSigOutput = new TransactionOutput(params, null, msOutput, p2SHMultiSigOutputScript.getProgram());
@@ -1102,15 +1049,18 @@ public class TradeWalletService {
Sha256Hash spendTxHash = Sha256Hash.wrap(depositTxHex);
payoutTx.addInput(new TransactionInput(params, depositTx, p2SHMultiSigOutputScript.getProgram(), new TransactionOutPoint(params, 0, spendTxHash), msOutput));
- if (buyerPayoutAmount.isGreaterThan(Coin.ZERO))
+ if (buyerPayoutAmount.isGreaterThan(Coin.ZERO)) {
payoutTx.addOutput(buyerPayoutAmount, Address.fromBase58(params, buyerAddressString));
- if (sellerPayoutAmount.isGreaterThan(Coin.ZERO))
+ }
+ if (sellerPayoutAmount.isGreaterThan(Coin.ZERO)) {
payoutTx.addOutput(sellerPayoutAmount, Address.fromBase58(params, sellerAddressString));
- if (arbitratorPayoutAmount.isGreaterThan(Coin.ZERO))
+ }
+ if (arbitratorPayoutAmount.isGreaterThan(Coin.ZERO)) {
payoutTx.addOutput(arbitratorPayoutAmount, Address.fromBase58(params, arbitratorAddressString));
+ }
// take care of sorting!
- Script redeemScript = getMultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
+ Script redeemScript = get2of3MultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey);
Sha256Hash sigHash = payoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false);
ECKey.ECDSASignature tradersSignature;
@@ -1124,24 +1074,79 @@ public class TradeWalletService {
checkNotNull(sellerPrivateKey, "sellerPrivateKey must not be null");
tradersSignature = sellerPrivateKey.sign(sigHash, aesKey).toCanonicalised();
}
- final ECKey key = ECKey.fromPrivate(Utils.HEX.decode(arbitratorPrivateKeyAsHex));
+ ECKey key = ECKey.fromPrivate(Utils.HEX.decode(arbitratorPrivateKeyAsHex));
checkNotNull(key, "key must not be null");
ECKey.ECDSASignature arbitratorSignature = key.sign(sigHash, aesKey).toCanonicalised();
-
TransactionSignature tradersTxSig = new TransactionSignature(tradersSignature, Transaction.SigHash.ALL, false);
TransactionSignature arbitratorTxSig = new TransactionSignature(arbitratorSignature, Transaction.SigHash.ALL, false);
// Take care of order of signatures. See comment below at getMultiSigRedeemScript (sort order needed here: arbitrator, seller, buyer)
Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(arbitratorTxSig, tradersTxSig), redeemScript);
+
TransactionInput input = payoutTx.getInput(0);
input.setScriptSig(inputScript);
-
WalletService.printTx("payoutTx", payoutTx);
-
WalletService.verifyTransaction(payoutTx);
WalletService.checkWalletConsistency(wallet);
-
broadcastTx(payoutTx, callback, 20);
+ return payoutTx;
+ }
+ //todo add window tool for usage
+ public Transaction emergencySignAndPublishPayoutTxFrom2of2MultiSig(String depositTxHex,
+ Coin buyerPayoutAmount,
+ Coin sellerPayoutAmount,
+ Coin txFee,
+ String buyerAddressString,
+ String sellerAddressString,
+ String buyerPrivateKeyAsHex,
+ String sellerPrivateKeyAsHex,
+ String buyerPubKeyAsHex,
+ String sellerPubKeyAsHex,
+ TxBroadcaster.Callback callback)
+ throws AddressFormatException, TransactionVerificationException, WalletException {
+ byte[] buyerPubKey = ECKey.fromPublicOnly(Utils.HEX.decode(buyerPubKeyAsHex)).getPubKey();
+ byte[] sellerPubKey = ECKey.fromPublicOnly(Utils.HEX.decode(sellerPubKeyAsHex)).getPubKey();
+
+ Script p2SHMultiSigOutputScript = get2of2MultiSigOutputScript(buyerPubKey, sellerPubKey);
+
+ Coin msOutput = buyerPayoutAmount.add(sellerPayoutAmount).add(txFee);
+ TransactionOutput p2SHMultiSigOutput = new TransactionOutput(params, null, msOutput, p2SHMultiSigOutputScript.getProgram());
+ Transaction depositTx = new Transaction(params);
+ depositTx.addOutput(p2SHMultiSigOutput);
+
+ Transaction payoutTx = new Transaction(params);
+ Sha256Hash spendTxHash = Sha256Hash.wrap(depositTxHex);
+ payoutTx.addInput(new TransactionInput(params, depositTx, p2SHMultiSigOutputScript.getProgram(), new TransactionOutPoint(params, 0, spendTxHash), msOutput));
+
+ if (buyerPayoutAmount.isGreaterThan(Coin.ZERO)) {
+ payoutTx.addOutput(buyerPayoutAmount, Address.fromBase58(params, buyerAddressString));
+ }
+ if (sellerPayoutAmount.isGreaterThan(Coin.ZERO)) {
+ payoutTx.addOutput(sellerPayoutAmount, Address.fromBase58(params, sellerAddressString));
+ }
+
+ // take care of sorting!
+ Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey);
+ Sha256Hash sigHash = payoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false);
+
+ ECKey buyerPrivateKey = ECKey.fromPrivate(Utils.HEX.decode(buyerPrivateKeyAsHex));
+ checkNotNull(buyerPrivateKey, "key must not be null");
+ ECKey.ECDSASignature buyerECDSASignature = buyerPrivateKey.sign(sigHash, aesKey).toCanonicalised();
+
+ ECKey sellerPrivateKey = ECKey.fromPrivate(Utils.HEX.decode(sellerPrivateKeyAsHex));
+ checkNotNull(sellerPrivateKey, "key must not be null");
+ ECKey.ECDSASignature sellerECDSASignature = sellerPrivateKey.sign(sigHash, aesKey).toCanonicalised();
+
+ TransactionSignature buyerTxSig = new TransactionSignature(buyerECDSASignature, Transaction.SigHash.ALL, false);
+ TransactionSignature sellerTxSig = new TransactionSignature(sellerECDSASignature, Transaction.SigHash.ALL, false);
+ Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig), redeemScript);
+
+ TransactionInput input = payoutTx.getInput(0);
+ input.setScriptSig(inputScript);
+ WalletService.printTx("payoutTx", payoutTx);
+ WalletService.verifyTransaction(payoutTx);
+ WalletService.checkWalletConsistency(wallet);
+ broadcastTx(payoutTx, callback, 20);
return payoutTx;
}
@@ -1165,36 +1170,6 @@ public class TradeWalletService {
// Misc
///////////////////////////////////////////////////////////////////////////////////////////
- /**
- * @param transaction The transaction to be added to the wallet
- * @return The transaction we added to the wallet, which is different as the one we passed as argument!
- * @throws VerificationException
- */
- public Transaction addTxToWallet(Transaction transaction) throws VerificationException {
- // We need to recreate the transaction otherwise we get a null pointer...
- Transaction result = new Transaction(params, transaction.bitcoinSerialize());
- result.getConfidence(Context.get()).setSource(TransactionConfidence.Source.SELF);
-
- if (wallet != null)
- wallet.receivePending(result, null, true);
- return result;
- }
-
- /**
- * @param serializedTransaction The serialized transaction to be added to the wallet
- * @return The transaction we added to the wallet, which is different as the one we passed as argument!
- * @throws VerificationException
- */
- public Transaction addTxToWallet(byte[] serializedTransaction) throws VerificationException {
- // We need to recreate the tx otherwise we get a null pointer...
- Transaction transaction = new Transaction(params, serializedTransaction);
- transaction.getConfidence(Context.get()).setSource(TransactionConfidence.Source.NETWORK);
-
- if (wallet != null)
- wallet.receivePending(transaction, null, true);
- return transaction;
- }
-
/**
* @param txId The transaction ID of the transaction we want to lookup
* @return Returns local existing wallet transaction
@@ -1219,31 +1194,31 @@ public class TradeWalletService {
// Private methods
///////////////////////////////////////////////////////////////////////////////////////////
- @NotNull
private RawTransactionInput getRawInputFromTransactionInput(@NotNull TransactionInput input) {
checkNotNull(input.getConnectedOutput(), "input.getConnectedOutput() must not be null");
- checkNotNull(input.getConnectedOutput().getParentTransaction(), "input.getConnectedOutput().getParentTransaction() must not be null");
+ checkNotNull(input.getConnectedOutput().getParentTransaction(),
+ "input.getConnectedOutput().getParentTransaction() must not be null");
checkNotNull(input.getValue(), "input.getValue() must not be null");
- return new RawTransactionInput(input.getOutpoint().getIndex(), input.getConnectedOutput().getParentTransaction().bitcoinSerialize(), input.getValue().value);
+ return new RawTransactionInput(input.getOutpoint().getIndex(),
+ input.getConnectedOutput().getParentTransaction().bitcoinSerialize(),
+ input.getValue().value);
}
- private byte[] getScriptProgram(Transaction makersDepositTx, int i) throws TransactionVerificationException {
- byte[] scriptProgram = makersDepositTx.getInputs().get(i).getScriptSig().getProgram();
- if (scriptProgram.length == 0)
+ private byte[] getMakersScriptSigProgram(TransactionInput transactionInput) throws TransactionVerificationException {
+ byte[] scriptProgram = transactionInput.getScriptSig().getProgram();
+ if (scriptProgram.length == 0) {
throw new TransactionVerificationException("Inputs from maker not signed.");
+ }
return scriptProgram;
}
- @NotNull
private TransactionInput getTransactionInput(Transaction depositTx,
byte[] scriptProgram,
RawTransactionInput rawTransactionInput) {
- return new TransactionInput(params,
- depositTx,
- scriptProgram,
- new TransactionOutPoint(params, rawTransactionInput.index, new Transaction(params, rawTransactionInput.parentTransaction)),
+ return new TransactionInput(params, depositTx, scriptProgram, new TransactionOutPoint(params,
+ rawTransactionInput.index, new Transaction(params, rawTransactionInput.parentTransaction)),
Coin.valueOf(rawTransactionInput.value));
}
@@ -1257,7 +1232,7 @@ public class TradeWalletService {
// Furthermore the executed list is reversed to the provided.
// Best practice is to provide the list sorted by the least probable successful candidates first (arbitrator is first -> will be last in execution loop, so
// avoiding unneeded expensive ECKey.verify calls)
- private Script getMultiSigRedeemScript(byte[] buyerPubKey, byte[] sellerPubKey, byte[] arbitratorPubKey) {
+ private Script get2of3MultiSigRedeemScript(byte[] buyerPubKey, byte[] sellerPubKey, byte[] arbitratorPubKey) {
ECKey buyerKey = ECKey.fromPublicOnly(buyerPubKey);
ECKey sellerKey = ECKey.fromPublicOnly(sellerPubKey);
ECKey arbitratorKey = ECKey.fromPublicOnly(arbitratorPubKey);
@@ -1266,8 +1241,20 @@ public class TradeWalletService {
return ScriptBuilder.createMultiSigOutputScript(2, keys);
}
- private Script getP2SHMultiSigOutputScript(byte[] buyerPubKey, byte[] sellerPubKey, byte[] arbitratorPubKey) {
- return ScriptBuilder.createP2SHOutputScript(getMultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey));
+ private Script get2of2MultiSigRedeemScript(byte[] buyerPubKey, byte[] sellerPubKey) {
+ ECKey buyerKey = ECKey.fromPublicOnly(buyerPubKey);
+ ECKey sellerKey = ECKey.fromPublicOnly(sellerPubKey);
+ // Take care of sorting! Need to reverse to the order we use normally (buyer, seller)
+ List keys = ImmutableList.of(sellerKey, buyerKey);
+ return ScriptBuilder.createMultiSigOutputScript(2, keys);
+ }
+
+ private Script get2of3MultiSigOutputScript(byte[] buyerPubKey, byte[] sellerPubKey, byte[] arbitratorPubKey) {
+ return ScriptBuilder.createP2SHOutputScript(get2of3MultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey));
+ }
+
+ private Script get2of2MultiSigOutputScript(byte[] buyerPubKey, byte[] sellerPubKey) {
+ return ScriptBuilder.createP2SHOutputScript(get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey));
}
private Transaction createPayoutTx(Transaction depositTx,
@@ -1288,9 +1275,11 @@ public class TradeWalletService {
Script scriptPubKey = input.getConnectedOutput().getScriptPubKey();
checkNotNull(wallet);
ECKey sigKey = input.getOutpoint().getConnectedKey(wallet);
- checkNotNull(sigKey, "signInput: sigKey must not be null. input.getOutpoint()=" + input.getOutpoint().toString());
- if (sigKey.isEncrypted())
+ checkNotNull(sigKey, "signInput: sigKey must not be null. input.getOutpoint()=" +
+ input.getOutpoint().toString());
+ if (sigKey.isEncrypted()) {
checkNotNull(aesKey);
+ }
Sha256Hash hash = transaction.hashForSignature(inputIndex, scriptPubKey, Transaction.SigHash.ALL, false);
ECKey.ECDSASignature signature = sigKey.sign(hash, aesKey);
TransactionSignature txSig = new TransactionSignature(signature, Transaction.SigHash.ALL, false);
@@ -1305,8 +1294,7 @@ public class TradeWalletService {
private void addAvailableInputsAndChangeOutputs(Transaction transaction,
Address address,
- Address changeAddress,
- Coin txFee) throws WalletException {
+ Address changeAddress) throws WalletException {
SendRequest sendRequest = null;
try {
// Lets let the framework do the work to find the right inputs
@@ -1314,7 +1302,7 @@ public class TradeWalletService {
sendRequest.shuffleOutputs = false;
sendRequest.aesKey = aesKey;
// We use a fixed fee
- sendRequest.fee = txFee;
+ sendRequest.fee = Coin.ZERO;
sendRequest.feePerKb = Coin.ZERO;
sendRequest.ensureMinRequiredFee = false;
// we allow spending of unconfirmed tx (double spend risk is low and usability would suffer if we need to wait for 1 confirmation)
@@ -1327,10 +1315,18 @@ public class TradeWalletService {
checkNotNull(wallet, "wallet must not be null");
wallet.completeTx(sendRequest);
} catch (Throwable t) {
- if (sendRequest != null && sendRequest.tx != null)
- log.warn("addAvailableInputsAndChangeOutputs: sendRequest.tx={}, sendRequest.tx.getOutputs()={}", sendRequest.tx, sendRequest.tx.getOutputs());
+ if (sendRequest != null && sendRequest.tx != null) {
+ log.warn("addAvailableInputsAndChangeOutputs: sendRequest.tx={}, sendRequest.tx.getOutputs()={}",
+ sendRequest.tx, sendRequest.tx.getOutputs());
+ }
throw new WalletException(t);
}
}
+
+ private void applyLockTime(long lockTime, Transaction tx) {
+ checkArgument(!tx.getInputs().isEmpty(), "The tx must have inputs. tx={}", tx);
+ tx.getInputs().forEach(input -> input.setSequenceNumber(TransactionInput.NO_SEQUENCE - 1));
+ tx.setLockTime(lockTime);
+ }
}
diff --git a/core/src/main/java/bisq/core/btc/wallet/TxBroadcaster.java b/core/src/main/java/bisq/core/btc/wallet/TxBroadcaster.java
index 0576024a73..23d38dd13c 100644
--- a/core/src/main/java/bisq/core/btc/wallet/TxBroadcaster.java
+++ b/core/src/main/java/bisq/core/btc/wallet/TxBroadcaster.java
@@ -104,12 +104,12 @@ public class TxBroadcaster {
}
// We decided the least risky scenario is to commit the tx to the wallet and broadcast it later.
- // If it's a bsq tx WalletManager.publishAndCommitBsqTx() should have commited the tx to both bsq and btc
+ // If it's a bsq tx WalletManager.publishAndCommitBsqTx() should have committed the tx to both bsq and btc
// wallets so the next line causes no effect.
// If it's a btc tx, the next line adds the tx to the wallet.
wallet.maybeCommitTx(tx);
- Futures.addCallback(peerGroup.broadcastTransaction(tx).future(), new FutureCallback() {
+ Futures.addCallback(peerGroup.broadcastTransaction(tx).future(), new FutureCallback<>() {
@Override
public void onSuccess(@Nullable Transaction result) {
// We expect that there is still a timeout in our map, otherwise the timeout got triggered
@@ -119,7 +119,7 @@ public class TxBroadcaster {
// before the caller is finished.
UserThread.execute(() -> callback.onSuccess(tx));
} else {
- log.warn("We got an onSuccess callback for a broadcast which already triggered the timeout.", txId);
+ log.warn("We got an onSuccess callback for a broadcast which already triggered the timeout. txId={}", txId);
}
}
diff --git a/core/src/main/java/bisq/core/btc/wallet/WalletService.java b/core/src/main/java/bisq/core/btc/wallet/WalletService.java
index 62822c4a0a..d04567d5f1 100644
--- a/core/src/main/java/bisq/core/btc/wallet/WalletService.java
+++ b/core/src/main/java/bisq/core/btc/wallet/WalletService.java
@@ -34,6 +34,7 @@ import org.bitcoinj.core.Address;
import org.bitcoinj.core.AddressFormatException;
import org.bitcoinj.core.BlockChain;
import org.bitcoinj.core.Coin;
+import org.bitcoinj.core.Context;
import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.InsufficientMoneyException;
import org.bitcoinj.core.NetworkParameters;
@@ -43,6 +44,7 @@ import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionConfidence;
import org.bitcoinj.core.TransactionInput;
import org.bitcoinj.core.TransactionOutput;
+import org.bitcoinj.core.VerificationException;
import org.bitcoinj.core.listeners.NewBestBlockListener;
import org.bitcoinj.crypto.DeterministicKey;
import org.bitcoinj.crypto.KeyCrypter;
@@ -102,6 +104,7 @@ public abstract class WalletService {
protected final CopyOnWriteArraySet addressConfidenceListeners = new CopyOnWriteArraySet<>();
protected final CopyOnWriteArraySet txConfidenceListeners = new CopyOnWriteArraySet<>();
protected final CopyOnWriteArraySet balanceListeners = new CopyOnWriteArraySet<>();
+ @Getter
protected Wallet wallet;
@Getter
protected KeyParameter aesKey;
@@ -223,7 +226,9 @@ public abstract class WalletService {
}
}
- public static void checkScriptSig(Transaction transaction, TransactionInput input, int inputIndex) throws TransactionVerificationException {
+ public static void checkScriptSig(Transaction transaction,
+ TransactionInput input,
+ int inputIndex) throws TransactionVerificationException {
try {
checkNotNull(input.getConnectedOutput(), "input.getConnectedOutput() must not be null");
input.getScriptSig().correctlySpends(transaction, inputIndex, input.getConnectedOutput().getScriptPubKey(), Script.ALL_VERIFY_FLAGS);
@@ -245,7 +250,11 @@ public abstract class WalletService {
// Sign tx
///////////////////////////////////////////////////////////////////////////////////////////
- public static void signTransactionInput(Wallet wallet, KeyParameter aesKey, Transaction tx, TransactionInput txIn, int index) {
+ public static void signTransactionInput(Wallet wallet,
+ KeyParameter aesKey,
+ Transaction tx,
+ TransactionInput txIn,
+ int index) {
KeyBag maybeDecryptingKeyBag = new DecryptingKeyBag(wallet, aesKey);
if (txIn.getConnectedOutput() != null) {
try {
@@ -475,7 +484,10 @@ public abstract class WalletService {
// Empty complete Wallet
///////////////////////////////////////////////////////////////////////////////////////////
- public void emptyWallet(String toAddress, KeyParameter aesKey, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler)
+ public void emptyWallet(String toAddress,
+ KeyParameter aesKey,
+ ResultHandler resultHandler,
+ ErrorMessageHandler errorMessageHandler)
throws InsufficientMoneyException, AddressFormatException {
SendRequest sendRequest = SendRequest.emptyWallet(Address.fromBase58(params, toAddress));
sendRequest.fee = Coin.ZERO;
@@ -675,6 +687,45 @@ public abstract class WalletService {
}
+ /**
+ * @param serializedTransaction The serialized transaction to be added to the wallet
+ * @return The transaction we added to the wallet, which is different as the one we passed as argument!
+ * @throws VerificationException
+ */
+ public static Transaction maybeAddTxToWallet(byte[] serializedTransaction,
+ Wallet wallet,
+ TransactionConfidence.Source source) throws VerificationException {
+ Transaction tx = new Transaction(wallet.getParams(), serializedTransaction);
+ Transaction walletTransaction = wallet.getTransaction(tx.getHash());
+
+ if (walletTransaction == null) {
+ // We need to recreate the transaction otherwise we get a null pointer...
+ tx.getConfidence(Context.get()).setSource(source);
+ //wallet.maybeCommitTx(tx);
+ wallet.receivePending(tx, null, true);
+ return tx;
+ } else {
+ return walletTransaction;
+ }
+ }
+
+ public static Transaction maybeAddNetworkTxToWallet(byte[] serializedTransaction,
+ Wallet wallet) throws VerificationException {
+ return maybeAddTxToWallet(serializedTransaction, wallet, TransactionConfidence.Source.NETWORK);
+ }
+
+ public static Transaction maybeAddSelfTxToWallet(Transaction transaction,
+ Wallet wallet) throws VerificationException {
+ return maybeAddTxToWallet(transaction, wallet, TransactionConfidence.Source.SELF);
+ }
+
+ public static Transaction maybeAddTxToWallet(Transaction transaction,
+ Wallet wallet,
+ TransactionConfidence.Source source) throws VerificationException {
+ return maybeAddTxToWallet(transaction.bitcoinSerialize(), wallet, source);
+ }
+
+
///////////////////////////////////////////////////////////////////////////////////////////
// bisqWalletEventListener
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/core/src/main/java/bisq/core/dao/governance/asset/AssetService.java b/core/src/main/java/bisq/core/dao/governance/asset/AssetService.java
index 7b9390da6c..c765697a70 100644
--- a/core/src/main/java/bisq/core/dao/governance/asset/AssetService.java
+++ b/core/src/main/java/bisq/core/dao/governance/asset/AssetService.java
@@ -322,11 +322,11 @@ public class AssetService implements DaoSetupService, DaoStateListener {
checkArgument(listingFee % 100 == 0, "Fee must be a multiple of 1 BSQ (100 satoshi).");
try {
// We create a prepared Bsq Tx for the listing fee.
- final Transaction preparedBurnFeeTx = bsqWalletService.getPreparedBurnFeeTx(Coin.valueOf(listingFee));
+ Transaction preparedBurnFeeTx = bsqWalletService.getPreparedBurnFeeTxForAssetListing(Coin.valueOf(listingFee));
byte[] hash = AssetConsensus.getHash(statefulAsset);
byte[] opReturnData = AssetConsensus.getOpReturnData(hash);
// We add the BTC inputs for the miner fee.
- final Transaction txWithBtcFee = btcWalletService.completePreparedBurnBsqTx(preparedBurnFeeTx, opReturnData);
+ Transaction txWithBtcFee = btcWalletService.completePreparedBurnBsqTx(preparedBurnFeeTx, opReturnData);
// We sign the BSQ inputs of the final tx.
Transaction transaction = bsqWalletService.signTx(txWithBtcFee);
log.info("Asset listing fee tx: " + transaction);
diff --git a/core/src/main/java/bisq/core/dao/governance/param/Param.java b/core/src/main/java/bisq/core/dao/governance/param/Param.java
index 9d7fb1568b..f17a0894b9 100644
--- a/core/src/main/java/bisq/core/dao/governance/param/Param.java
+++ b/core/src/main/java/bisq/core/dao/governance/param/Param.java
@@ -107,9 +107,9 @@ public enum Param {
// but can be also a burner address if we prefer to burn the BTC
@SuppressWarnings("SpellCheckingInspection")
RECIPIENT_BTC_ADDRESS(BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? "1BVxNn3T12veSK6DgqwU4Hdn7QHcDDRag7" : // mainnet
- BisqEnvironment.getBaseCurrencyNetwork().isDaoBetaNet() ? "1BVxNn3T12veSK6DgqwU4Hdn7QHcDDRag7" : // mainnet
+ BisqEnvironment.getBaseCurrencyNetwork().isDaoBetaNet() ? "1BVxNn3T12veSK6DgqwU4Hdn7QHcDDRag7" : // daoBetaNet
BisqEnvironment.getBaseCurrencyNetwork().isTestnet() ? "2N4mVTpUZAnhm9phnxB7VrHB4aBhnWrcUrV" : // testnet
- "mquz1zFmhs7iy8qJTkhY7C9bhJ5S3g8Xim", // regtest or DAO testnet (regtest)
+ "2MzBNTJDjjXgViKBGnatDU3yWkJ8pJkEg9w", // regtest or DAO testnet (regtest)
ParamType.ADDRESS),
// Fee for activating an asset or re-listing after deactivation due lack of trade activity. Fee per day of trial period without activity checks.
diff --git a/core/src/main/java/bisq/core/dao/governance/proofofburn/ProofOfBurnService.java b/core/src/main/java/bisq/core/dao/governance/proofofburn/ProofOfBurnService.java
index e347656a59..cca3185a50 100644
--- a/core/src/main/java/bisq/core/dao/governance/proofofburn/ProofOfBurnService.java
+++ b/core/src/main/java/bisq/core/dao/governance/proofofburn/ProofOfBurnService.java
@@ -134,11 +134,11 @@ public class ProofOfBurnService implements DaoSetupService, DaoStateListener {
public Transaction burn(String preImageAsString, long amount) throws InsufficientMoneyException, TxException {
try {
// We create a prepared Bsq Tx for the burn amount
- final Transaction preparedBurnFeeTx = bsqWalletService.getPreparedBurnFeeTx(Coin.valueOf(amount));
+ Transaction preparedBurnFeeTx = bsqWalletService.getPreparedProofOfBurnTx(Coin.valueOf(amount));
byte[] hash = getHashFromPreImage(preImageAsString);
byte[] opReturnData = ProofOfBurnConsensus.getOpReturnData(hash);
// We add the BTC inputs for the miner fee.
- final Transaction txWithBtcFee = btcWalletService.completePreparedBurnBsqTx(preparedBurnFeeTx, opReturnData);
+ Transaction txWithBtcFee = btcWalletService.completePreparedBurnBsqTx(preparedBurnFeeTx, opReturnData);
// We sign the BSQ inputs of the final tx.
Transaction transaction = bsqWalletService.signTx(txWithBtcFee);
log.info("Proof of burn tx: " + transaction);
diff --git a/core/src/main/java/bisq/core/dao/governance/proposal/BaseProposalFactory.java b/core/src/main/java/bisq/core/dao/governance/proposal/BaseProposalFactory.java
index 4c3cb5f78f..abb58e32c2 100644
--- a/core/src/main/java/bisq/core/dao/governance/proposal/BaseProposalFactory.java
+++ b/core/src/main/java/bisq/core/dao/governance/proposal/BaseProposalFactory.java
@@ -87,8 +87,9 @@ public abstract class BaseProposalFactory {
try {
Coin fee = ProposalConsensus.getFee(daoStateService, daoStateService.getChainHeight());
// We create a prepared Bsq Tx for the proposal fee.
- boolean requireChangeOutput = proposal instanceof IssuanceProposal;
- Transaction preparedBurnFeeTx = bsqWalletService.getPreparedProposalTx(fee, requireChangeOutput);
+ Transaction preparedBurnFeeTx = proposal instanceof IssuanceProposal ?
+ bsqWalletService.getPreparedIssuanceTx(fee) :
+ bsqWalletService.getPreparedProposalTx(fee);
// payload does not have txId at that moment
byte[] hashOfPayload = ProposalConsensus.getHashOfPayload(proposal);
diff --git a/core/src/main/java/bisq/core/dao/node/parser/TxOutputParser.java b/core/src/main/java/bisq/core/dao/node/parser/TxOutputParser.java
index e520e19101..0a9d09bf34 100644
--- a/core/src/main/java/bisq/core/dao/node/parser/TxOutputParser.java
+++ b/core/src/main/java/bisq/core/dao/node/parser/TxOutputParser.java
@@ -17,7 +17,9 @@
package bisq.core.dao.node.parser;
+import bisq.core.app.BisqEnvironment;
import bisq.core.dao.governance.bond.BondConsensus;
+import bisq.core.dao.governance.param.Param;
import bisq.core.dao.state.DaoStateService;
import bisq.core.dao.state.model.blockchain.OpReturnType;
import bisq.core.dao.state.model.blockchain.TxOutput;
@@ -38,11 +40,57 @@ import static com.google.common.base.Preconditions.checkNotNull;
/**
* Checks if an output is a BSQ output and apply state change.
+ *
+ * With block 602500 (about 4 weeks after v1.2.0 release) we enforce a new rule which represents a
+ * hard fork. Not updated nodes would see an out of sync dao state hash if a relevant transaction would
+ * happen again.
+ * Further (highly unlikely) consequences could be:
+ * If the BSQ output would be sent to a BSQ address the old client would accept that even it is
+ * invalid according to the new rules. But sending such a output would require a manually crafted tx
+ * (not possible in the UI). Worst case a not updated user would buy invalid BSQ but that is not possible as we
+ * enforce update to 1.2.0 for trading a few days after release as that release introduced the new trade protocol
+ * and protection tool. Only of both both traders would have deactivated filter messages they could trade.
+ *
+ * Problem description:
+ * We did not apply the check to not allow BSQ outputs after we had detected a BTC output.
+ * The supported BSQ transactions did not support such cases anyway but we missed an edge case:
+ * A trade fee tx in case when the BTC input matches exactly the BTC output
+ * (or BTC change was <= the miner fee) and the BSQ fee was > the miner fee. Then we
+ * create a change output after the BTC output (using an address from the BTC wallet) and as
+ * available BSQ was >= as spent BSQ it was considered a valid BSQ output.
+ * There have been observed 5 such transactions where 4 got spent later to a BTC address and by that burned
+ * the pending BSQ (spending amount was higher than sending amount). One was still unspent.
+ * The BSQ was sitting in the BTC wallet so not even visible as BSQ to the user.
+ * If the user would have crafted a custom BSQ tx he could have avoided that the full trade fee was burned.
+ *
+ * Not an universal rule:
+ * We cannot enforce the rule that no BSQ output is permitted to all possible transactions because there can be cases
+ * where we need to permit this case.
+ * For instance in case we confiscate a lockupTx we have usually 2 BSQ outputs: The first one is the bond which
+ * should be confiscated and the second one is the BSQ change output.
+ * At confiscating we set the first to TxOutputType.BTC_OUTPUT but we do not want to confiscate
+ * the second BSQ change output as well. So we do not apply the rule that no BSQ is allowed once a BTC output is
+ * found. Theoretically other transactions could be confiscated as well and all BSQ tx which allow > 1 BSQ outputs
+ * would have the same issue as well if the first output gets confiscated.
+ * We also don't enforce the rule for irregular or invalid txs which are usually set and detected at the end of
+ * the tx parsing which is done in the TxParser. Blind vote and LockupTx with invalid OpReturn would be such cases
+ * where we don't want to invalidate the change output (See comments in TxParser).
+ *
+ * Most transactions created in Bisq (Proposal, blind vote and lockup,...) have only 1 or 2 BSQ
+ * outputs but we do not enforce a limit of max. 2 transactions in the parser.
+ * We leave for now that flexibility but it should not be considered as a rule. We might strengthen
+ * it any time if we find a reason for that (e.g. attack risk) and add checks that no more
+ * BSQ outputs are permitted for those txs.
+ * Some transactions like issuance, vote reveal and unlock have exactly 1 BSQ output and that rule
+ * is enforced.
*/
@Slf4j
-public class TxOutputParser {
- private final DaoStateService daoStateService;
+class TxOutputParser {
+ private static int ACTIVATE_HARD_FORK_1_HEIGHT_MAINNET = 605000;
+ private static int ACTIVATE_HARD_FORK_1_HEIGHT_TESTNET = 1583054;
+ private static int ACTIVATE_HARD_FORK_1_HEIGHT_REGTEST = 1;
+ private final DaoStateService daoStateService;
// Setters
@Getter
@Setter
@@ -66,10 +114,12 @@ public class TxOutputParser {
private Optional optionalVoteRevealUnlockStakeOutput = Optional.empty();
@Getter
private Optional optionalLockupOutput = Optional.empty();
+ private Optional optionalOpReturnIndex = Optional.empty();
// Private
private int lockTime;
private final List utxoCandidates = new ArrayList<>();
+ private boolean prohibitMoreBsqOutputs = false;
///////////////////////////////////////////////////////////////////////////////////////////
@@ -93,6 +143,8 @@ public class TxOutputParser {
optionalOpReturnType = getMappedOpReturnType(txOutputType);
+ optionalOpReturnType.ifPresent(e -> optionalOpReturnIndex = Optional.of(tempTxOutput.getIndex()));
+
// If we have a LOCKUP opReturn output we save the lockTime to apply it later to the LOCKUP output.
// We keep that data in that other output as it makes parsing of the UNLOCK tx easier.
optionalOpReturnType.filter(opReturnType -> opReturnType == OpReturnType.LOCKUP)
@@ -100,14 +152,14 @@ public class TxOutputParser {
}
void processTxOutput(TempTxOutput tempTxOutput) {
- if (!daoStateService.isConfiscatedOutput(tempTxOutput.getKey())) {
- // We don not expect here an opReturn output as we do not get called on the last output. Any opReturn at
- // another output index is invalid.
- if (tempTxOutput.isOpReturnOutput()) {
- tempTxOutput.setTxOutputType(TxOutputType.INVALID_OUTPUT);
- return;
- }
+ // We don not expect here an opReturn output as we do not get called on the last output. Any opReturn at
+ // another output index is invalid.
+ if (tempTxOutput.isOpReturnOutput()) {
+ tempTxOutput.setTxOutputType(TxOutputType.INVALID_OUTPUT);
+ return;
+ }
+ if (!daoStateService.isConfiscatedOutput(tempTxOutput.getKey())) {
long txOutputValue = tempTxOutput.getValue();
int index = tempTxOutput.getIndex();
if (isUnlockBondTx(tempTxOutput.getValue(), index)) {
@@ -118,8 +170,18 @@ public class TxOutputParser {
} else if (isBtcOutputOfBurnFeeTx(tempTxOutput)) {
// In case we have the opReturn for a burn fee tx all outputs after 1st output are considered BTC
handleBtcOutput(tempTxOutput, index);
+ } else if (isHardForkActivated(tempTxOutput) && isIssuanceCandidateTxOutput(tempTxOutput)) {
+ // After the hard fork activation we fix a bug with a transaction which would have interpreted the
+ // issuance output as BSQ if the availableInputValue was >= issuance amount.
+ // Such a tx was never created but as we don't know if it will happen before activation date we cannot
+ // enforce the bug fix which represents a rule change before the activation date.
+ handleIssuanceCandidateOutput(tempTxOutput);
} else if (availableInputValue > 0 && availableInputValue >= txOutputValue) {
- handleBsqOutput(tempTxOutput, index, txOutputValue);
+ if (isHardForkActivated(tempTxOutput) && prohibitMoreBsqOutputs) {
+ handleBtcOutput(tempTxOutput, index);
+ } else {
+ handleBsqOutput(tempTxOutput, index, txOutputValue);
+ }
} else {
handleBtcOutput(tempTxOutput, index);
}
@@ -127,6 +189,9 @@ public class TxOutputParser {
log.warn("TxOutput {} is confiscated ", tempTxOutput.getKey());
// We only burn that output
availableInputValue -= tempTxOutput.getValue();
+
+ // We must not set prohibitMoreBsqOutputs at confiscation transactions as optional
+ // BSQ change output (output 2) must not be confiscated.
tempTxOutput.setTxOutputType(TxOutputType.BTC_OUTPUT);
}
}
@@ -139,6 +204,7 @@ public class TxOutputParser {
* This sets all outputs to BTC_OUTPUT and doesn't add any txOutputs to the unspentTxOutput map in daoStateService
*/
void invalidateUTXOCandidates() {
+ // We do not need to apply prohibitMoreBsqOutputs as all spendable outputs are set to BTC_OUTPUT anyway.
utxoCandidates.forEach(output -> output.setTxOutputType(TxOutputType.BTC_OUTPUT));
}
@@ -171,17 +237,108 @@ public class TxOutputParser {
utxoCandidates.add(txOutput);
bsqOutputFound = true;
+
+ // We do not permit more BSQ outputs after the unlock txo as we don't expect additional BSQ outputs.
+ prohibitMoreBsqOutputs = true;
}
private boolean isBtcOutputOfBurnFeeTx(TempTxOutput tempTxOutput) {
- // If we get a asset listing or proof of burn tx we have only 1 BSQ output and if the
- // burned amount is larger than the miner fee we might have a BTC output for receiving the burned funds.
- // If the burned funds are less than the miner fee a BTC input is used for miner fee and a BTC change output for
- // the remaining funds. In any case only the first output is BSQ all the others are BTC.
- return optionalOpReturnType.isPresent() &&
- (optionalOpReturnType.get() == OpReturnType.ASSET_LISTING_FEE ||
- optionalOpReturnType.get() == OpReturnType.PROOF_OF_BURN) &&
- tempTxOutput.getIndex() >= 1;
+ if (optionalOpReturnType.isPresent()) {
+ int index = tempTxOutput.getIndex();
+ switch (optionalOpReturnType.get()) {
+ case UNDEFINED:
+ break;
+ case PROPOSAL:
+ if (isHardForkActivated(tempTxOutput)) {
+ // We enforce a mandatory BSQ change output.
+ // We need that as similar to ASSET_LISTING_FEE and PROOF_OF_BURN
+ // we could not distinguish between 2 structurally same transactions otherwise (only way here
+ // would be to check the proposal fee as that is known from the params).
+ return index >= 1;
+ }
+ break;
+ case COMPENSATION_REQUEST:
+ break;
+ case REIMBURSEMENT_REQUEST:
+ break;
+ case BLIND_VOTE:
+ if (isHardForkActivated(tempTxOutput)) {
+ // After the hard fork activation we fix a bug with a transaction which would have interpreted the
+ // burned vote fee output as BSQ if the vote fee was >= miner fee.
+ // Such a tx was never created but as we don't know if it will happen before activation date we cannot
+ // enforce the bug fix which represents a rule change before the activation date.
+
+ // If it is the vote stake output we return false.
+ if (index == 0) {
+ return false;
+ }
+
+ // There must be a vote fee left
+ if (availableInputValue <= 0) {
+ return false;
+ }
+
+ // Burned BSQ output is last output before opReturn.
+ // We could have also a BSQ change output as last output before opReturn but that will
+ // be detected at blindVoteFee check.
+ // We always have the BSQ change before the burned BSQ output if both are present.
+ checkArgument(optionalOpReturnIndex.isPresent());
+ if (index != optionalOpReturnIndex.get() - 1) {
+ return false;
+ }
+
+ // Without checking the fee we would not be able to distinguish between 2 structurally same transactions, one
+ // where the output is burned BSQ and one where it is a BSQ change output.
+ long blindVoteFee = daoStateService.getParamValueAsCoin(Param.BLIND_VOTE_FEE, tempTxOutput.getBlockHeight()).value;
+ return availableInputValue == blindVoteFee;
+ }
+ case VOTE_REVEAL:
+ break;
+ case LOCKUP:
+ break;
+ case ASSET_LISTING_FEE:
+ case PROOF_OF_BURN:
+ // Asset listing fee and proof of burn tx are structurally the same.
+
+ // We need to require one BSQ change output as we could otherwise not be able to distinguish between 2
+ // structurally same transactions where only the BSQ fee is different. In case of asset listing fee and proof of
+ // burn it is a user input, so it is not know to the parser, instead we derive the burned fee from the parser.
+ // In case of proposal fee we could derive it from the params.
+
+ // Case 1: 10 BSQ fee to burn
+ // In: 17 BSQ
+ // Out: BSQ change 7 BSQ -> valid BSQ
+ // Out: OpReturn
+ // Miner fee: 1000 sat (10 BSQ burned)
+
+
+ // Case 2: 17 BSQ fee to burn
+ // In: 17 BSQ
+ // Out: burned BSQ change 7 BSQ -> BTC (7 BSQ burned)
+ // Out: OpReturn
+ // Miner fee: 1000 sat (10 BSQ burned)
+ return index >= 1;
+ }
+ }
+ return false;
+ }
+
+ private boolean isIssuanceCandidateTxOutput(TempTxOutput tempTxOutput) {
+ // If we have BSQ left as fee and we are at the second output we interpret it as a compensation request output.
+ return availableInputValue > 0 &&
+ tempTxOutput.getIndex() == 1 &&
+ optionalOpReturnType.isPresent() &&
+ (optionalOpReturnType.get() == OpReturnType.COMPENSATION_REQUEST ||
+ optionalOpReturnType.get() == OpReturnType.REIMBURSEMENT_REQUEST);
+ }
+
+ private void handleIssuanceCandidateOutput(TempTxOutput tempTxOutput) {
+ // We do not permit more BSQ outputs after the issuance candidate.
+ prohibitMoreBsqOutputs = true;
+
+ // We store the candidate but we don't apply the TxOutputType yet as we need to verify the fee after all
+ // outputs are parsed and check the phase. The TxParser will do that....
+ optionalIssuanceCandidate = Optional.of(tempTxOutput);
}
private void handleBsqOutput(TempTxOutput txOutput, int index, long txOutputValue) {
@@ -201,6 +358,9 @@ public class TxOutputParser {
} else if (isFirstOutput && opReturnTypeCandidate == OpReturnType.VOTE_REVEAL) {
txOutputType = TxOutputType.VOTE_REVEAL_UNLOCK_STAKE_OUTPUT;
optionalVoteRevealUnlockStakeOutput = Optional.of(txOutput);
+
+ // We do not permit more BSQ outputs after the VOTE_REVEAL_UNLOCK_STAKE_OUTPUT.
+ prohibitMoreBsqOutputs = true;
} else if (isFirstOutput && opReturnTypeCandidate == OpReturnType.LOCKUP) {
txOutputType = TxOutputType.LOCKUP_OUTPUT;
@@ -219,20 +379,43 @@ public class TxOutputParser {
}
private void handleBtcOutput(TempTxOutput txOutput, int index) {
- // If we have BSQ left as fee and we are at the second output it might be a compensation request output.
- // We store the candidate but we don't apply the TxOutputType yet as we need to verify the fee after all
- // outputs are parsed and check the phase. The TxParser will do that....
- if (availableInputValue > 0 &&
- index == 1 &&
- optionalOpReturnType.isPresent() &&
- (optionalOpReturnType.get() == OpReturnType.COMPENSATION_REQUEST ||
- optionalOpReturnType.get() == OpReturnType.REIMBURSEMENT_REQUEST)) {
- optionalIssuanceCandidate = Optional.of(txOutput);
- } else {
+ if (isHardForkActivated(txOutput)) {
txOutput.setTxOutputType(TxOutputType.BTC_OUTPUT);
+
+ // For regular transactions we don't permit BSQ outputs after a BTC output was detected.
+ prohibitMoreBsqOutputs = true;
+ } else {
+ // If we have BSQ left as fee and we are at the second output it might be a compensation request output.
+ // We store the candidate but we don't apply the TxOutputType yet as we need to verify the fee after all
+ // outputs are parsed and check the phase. The TxParser will do that....
+ if (availableInputValue > 0 &&
+ index == 1 &&
+ optionalOpReturnType.isPresent() &&
+ (optionalOpReturnType.get() == OpReturnType.COMPENSATION_REQUEST ||
+ optionalOpReturnType.get() == OpReturnType.REIMBURSEMENT_REQUEST)) {
+ optionalIssuanceCandidate = Optional.of(txOutput);
+
+ // We do not permit more BSQ outputs after the issuance candidate.
+ prohibitMoreBsqOutputs = true;
+ } else {
+ txOutput.setTxOutputType(TxOutputType.BTC_OUTPUT);
+
+ // For regular transactions we don't permit BSQ outputs after a BTC output was detected.
+ prohibitMoreBsqOutputs = true;
+ }
}
}
+ private boolean isHardForkActivated(TempTxOutput tempTxOutput) {
+ return tempTxOutput.getBlockHeight() >= getActivateHardFork1Height();
+ }
+
+ private int getActivateHardFork1Height() {
+ return BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? ACTIVATE_HARD_FORK_1_HEIGHT_MAINNET :
+ BisqEnvironment.getBaseCurrencyNetwork().isTestnet() ? ACTIVATE_HARD_FORK_1_HEIGHT_TESTNET :
+ ACTIVATE_HARD_FORK_1_HEIGHT_REGTEST;
+ }
+
///////////////////////////////////////////////////////////////////////////////////////////
// Static
diff --git a/core/src/main/java/bisq/core/dao/node/parser/TxParser.java b/core/src/main/java/bisq/core/dao/node/parser/TxParser.java
index 42be945a63..1b518de77d 100644
--- a/core/src/main/java/bisq/core/dao/node/parser/TxParser.java
+++ b/core/src/main/java/bisq/core/dao/node/parser/TxParser.java
@@ -217,19 +217,33 @@ public class TxParser {
// We need to check if any tempTxOutput is available and if so and the OpReturn data is invalid we
// set the output to a BTC output. We must not use `if else` cases here!
if (opReturnType != OpReturnType.COMPENSATION_REQUEST && opReturnType != OpReturnType.REIMBURSEMENT_REQUEST) {
+ // We applied already the check to not permit further BSQ outputs after the issuanceCandidate in the
+ // txOutputParser so we don't need to do any additional check here when we change to BTC_OUTPUT.
txOutputParser.getOptionalIssuanceCandidate().ifPresent(tempTxOutput -> tempTxOutput.setTxOutputType(TxOutputType.BTC_OUTPUT));
}
if (opReturnType != OpReturnType.BLIND_VOTE) {
- txOutputParser.getOptionalBlindVoteLockStakeOutput().ifPresent(tempTxOutput -> tempTxOutput.setTxOutputType(TxOutputType.BTC_OUTPUT));
+ txOutputParser.getOptionalBlindVoteLockStakeOutput().ifPresent(tempTxOutput -> {
+ // We cannot apply the rule to not allow BSQ outputs after a BTC output as the 2nd output is an
+ // optional BSQ change output and we don't want to burn that in case the opReturn is invalid.
+ tempTxOutput.setTxOutputType(TxOutputType.BTC_OUTPUT);
+ });
}
if (opReturnType != OpReturnType.VOTE_REVEAL) {
- txOutputParser.getOptionalVoteRevealUnlockStakeOutput().ifPresent(tempTxOutput -> tempTxOutput.setTxOutputType(TxOutputType.BTC_OUTPUT));
+ txOutputParser.getOptionalVoteRevealUnlockStakeOutput().ifPresent(tempTxOutput -> {
+ // We do not apply the rule to not allow BSQ outputs after a BTC output here because we expect only
+ // one BSQ output anyway.
+ tempTxOutput.setTxOutputType(TxOutputType.BTC_OUTPUT);
+ });
}
if (opReturnType != OpReturnType.LOCKUP) {
- txOutputParser.getOptionalLockupOutput().ifPresent(tempTxOutput -> tempTxOutput.setTxOutputType(TxOutputType.BTC_OUTPUT));
+ txOutputParser.getOptionalLockupOutput().ifPresent(tempTxOutput -> {
+ // We cannot apply the rule to not allow BSQ outputs after a BTC output as the 2nd output is an
+ // optional BSQ change output and we don't want to burn that in case the opReturn is invalid.
+ tempTxOutput.setTxOutputType(TxOutputType.BTC_OUTPUT);
+ });
}
}
@@ -259,12 +273,14 @@ public class TxParser {
}
} else {
// This could be a valid compensation request that failed to be included in a block during the
- // correct phase due to no fault of the user. Better not burn the change as long as the BSQ inputs
+ // correct phase due to no fault of the user. We must not burn the change as long as the BSQ inputs
// cover the value of the outputs.
// We tolerate such an incorrect tx and do not burn the BSQ
tempTx.setTxType(TxType.IRREGULAR);
// Make sure the optionalIssuanceCandidate is set to BTC
+ // We applied already the check to not permit further BSQ outputs after the issuanceCandidate in the
+ // txOutputParser so we don't need to do any additional check here when we change to BTC_OUTPUT.
optionalIssuanceCandidate.ifPresent(tempTxOutput -> tempTxOutput.setTxOutputType(TxOutputType.BTC_OUTPUT));
// Empty Optional case is a possible valid case where a random tx matches our opReturn rules but it is not a
// valid BSQ tx.
diff --git a/core/src/main/java/bisq/core/filter/Filter.java b/core/src/main/java/bisq/core/filter/Filter.java
index 8d92fa1783..43d366991a 100644
--- a/core/src/main/java/bisq/core/filter/Filter.java
+++ b/core/src/main/java/bisq/core/filter/Filter.java
@@ -98,6 +98,10 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
@Nullable
private final List mediators;
+ // added in v1.2.0
+ @Nullable
+ private final List refundAgents;
+
public Filter(List bannedOfferIds,
List bannedNodeAddress,
List bannedPaymentAccounts,
@@ -111,7 +115,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
boolean disableDao,
@Nullable String disableDaoBelowVersion,
@Nullable String disableTradeBelowVersion,
- @Nullable List mediators) {
+ @Nullable List mediators,
+ @Nullable List refundAgents) {
this.bannedOfferIds = bannedOfferIds;
this.bannedNodeAddress = bannedNodeAddress;
this.bannedPaymentAccounts = bannedPaymentAccounts;
@@ -126,6 +131,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
this.disableDaoBelowVersion = disableDaoBelowVersion;
this.disableTradeBelowVersion = disableTradeBelowVersion;
this.mediators = mediators;
+ this.refundAgents = refundAgents;
}
@@ -150,7 +156,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
String signatureAsBase64,
byte[] ownerPubKeyBytes,
@Nullable Map extraDataMap,
- @Nullable List mediators) {
+ @Nullable List mediators,
+ @Nullable List refundAgents) {
this(bannedOfferIds,
bannedNodeAddress,
bannedPaymentAccounts,
@@ -164,7 +171,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
disableDao,
disableDaoBelowVersion,
disableTradeBelowVersion,
- mediators);
+ mediators,
+ refundAgents);
this.signatureAsBase64 = signatureAsBase64;
this.ownerPubKeyBytes = ownerPubKeyBytes;
this.extraDataMap = ExtraDataMapValidator.getValidatedExtraDataMap(extraDataMap);
@@ -198,6 +206,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
Optional.ofNullable(disableTradeBelowVersion).ifPresent(builder::setDisableTradeBelowVersion);
Optional.ofNullable(extraDataMap).ifPresent(builder::putAllExtraData);
Optional.ofNullable(mediators).ifPresent(builder::addAllMediators);
+ Optional.ofNullable(refundAgents).ifPresent(builder::addAllRefundAgents);
return protobuf.StoragePayload.newBuilder().setFilter(builder).build();
}
@@ -221,7 +230,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
proto.getSignatureAsBase64(),
proto.getOwnerPubKeyBytes().toByteArray(),
CollectionUtils.isEmpty(proto.getExtraDataMap()) ? null : proto.getExtraDataMap(),
- CollectionUtils.isEmpty(proto.getMediatorsList()) ? null : new ArrayList<>(proto.getMediatorsList()));
+ CollectionUtils.isEmpty(proto.getMediatorsList()) ? null : new ArrayList<>(proto.getMediatorsList()),
+ CollectionUtils.isEmpty(proto.getRefundAgentsList()) ? null : new ArrayList<>(proto.getRefundAgentsList()));
}
@@ -240,4 +250,26 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
ownerPubKeyBytes = Sig.getPublicKeyBytes(this.ownerPubKey);
}
+
+ @Override
+ public String toString() {
+ return "Filter{" +
+ "\n bannedOfferIds=" + bannedOfferIds +
+ ",\n bannedNodeAddress=" + bannedNodeAddress +
+ ",\n bannedPaymentAccounts=" + bannedPaymentAccounts +
+ ",\n bannedCurrencies=" + bannedCurrencies +
+ ",\n bannedPaymentMethods=" + bannedPaymentMethods +
+ ",\n arbitrators=" + arbitrators +
+ ",\n seedNodes=" + seedNodes +
+ ",\n priceRelayNodes=" + priceRelayNodes +
+ ",\n preventPublicBtcNetwork=" + preventPublicBtcNetwork +
+ ",\n btcNodes=" + btcNodes +
+ ",\n extraDataMap=" + extraDataMap +
+ ",\n disableDao=" + disableDao +
+ ",\n disableDaoBelowVersion='" + disableDaoBelowVersion + '\'' +
+ ",\n disableTradeBelowVersion='" + disableTradeBelowVersion + '\'' +
+ ",\n mediators=" + mediators +
+ ",\n refundAgents=" + refundAgents +
+ "\n}";
+ }
}
diff --git a/core/src/main/java/bisq/core/filter/FilterManager.java b/core/src/main/java/bisq/core/filter/FilterManager.java
index a29b43ce13..5104929f8f 100644
--- a/core/src/main/java/bisq/core/filter/FilterManager.java
+++ b/core/src/main/java/bisq/core/filter/FilterManager.java
@@ -297,7 +297,7 @@ public class FilterManager {
ECKey.fromPublicOnly(HEX.decode(pubKeyAsHex)).verifyMessage(getHexFromData(filter), filter.getSignatureAsBase64());
return true;
} catch (SignatureException e) {
- log.warn("verifySignature failed");
+ log.warn("verifySignature failed. filter={}", filter);
return false;
}
}
diff --git a/core/src/main/java/bisq/core/offer/AvailabilityResult.java b/core/src/main/java/bisq/core/offer/AvailabilityResult.java
index 9589568703..2d3d749ff2 100644
--- a/core/src/main/java/bisq/core/offer/AvailabilityResult.java
+++ b/core/src/main/java/bisq/core/offer/AvailabilityResult.java
@@ -26,5 +26,6 @@ public enum AvailabilityResult {
NO_ARBITRATORS,
NO_MEDIATORS,
USER_IGNORED,
- MISSING_MANDATORY_CAPABILITY
+ MISSING_MANDATORY_CAPABILITY,
+ NO_REFUND_AGENTS
}
diff --git a/core/src/main/java/bisq/core/offer/OfferBookService.java b/core/src/main/java/bisq/core/offer/OfferBookService.java
index d99955d532..5ebe152453 100644
--- a/core/src/main/java/bisq/core/offer/OfferBookService.java
+++ b/core/src/main/java/bisq/core/offer/OfferBookService.java
@@ -28,7 +28,6 @@ import bisq.network.p2p.storage.HashMapChangedListener;
import bisq.network.p2p.storage.payload.ProtectedStorageEntry;
import bisq.common.UserThread;
-import bisq.common.app.Capability;
import bisq.common.handlers.ErrorMessageHandler;
import bisq.common.handlers.ResultHandler;
import bisq.common.storage.JsonFileManager;
@@ -93,10 +92,8 @@ public class OfferBookService {
if (data.getProtectedStoragePayload() instanceof OfferPayload) {
OfferPayload offerPayload = (OfferPayload) data.getProtectedStoragePayload();
Offer offer = new Offer(offerPayload);
- if (showOffer(offer)) {
- offer.setPriceFeedService(priceFeedService);
- listener.onAdded(offer);
- }
+ offer.setPriceFeedService(priceFeedService);
+ listener.onAdded(offer);
}
});
}
@@ -135,11 +132,6 @@ public class OfferBookService {
}
}
- private boolean showOffer(Offer offer) {
- return !OfferRestrictions.requiresUpdate() ||
- OfferRestrictions.hasOfferMandatoryCapability(offer, Capability.MEDIATION);
- }
-
///////////////////////////////////////////////////////////////////////////////////////////
// API
@@ -208,7 +200,6 @@ public class OfferBookService {
offer.setPriceFeedService(priceFeedService);
return offer;
})
- .filter(this::showOffer)
.collect(Collectors.toList());
}
diff --git a/core/src/main/java/bisq/core/offer/OfferRestrictions.java b/core/src/main/java/bisq/core/offer/OfferRestrictions.java
index d7b64580bd..856b7a6e20 100644
--- a/core/src/main/java/bisq/core/offer/OfferRestrictions.java
+++ b/core/src/main/java/bisq/core/offer/OfferRestrictions.java
@@ -17,9 +17,6 @@
package bisq.core.offer;
-import bisq.core.payment.payload.PaymentMethod;
-import bisq.core.trade.Trade;
-
import bisq.common.app.Capabilities;
import bisq.common.app.Capability;
import bisq.common.util.Utilities;
@@ -41,38 +38,6 @@ public class OfferRestrictions {
public static Coin TOLERATED_SMALL_TRADE_AMOUNT = Coin.parseCoin("0.01");
- public static boolean isOfferRisky(Offer offer) {
- return offer != null &&
- offer.isBuyOffer() &&
- PaymentMethod.hasChargebackRisk(offer.getPaymentMethod(), offer.getCurrencyCode()) &&
- isMinTradeAmountRisky(offer);
- }
-
- public static boolean isSellOfferRisky(Offer offer) {
- return offer != null &&
- PaymentMethod.hasChargebackRisk(offer.getPaymentMethod(), offer.getCurrencyCode()) &&
- isMinTradeAmountRisky(offer);
- }
-
- public static boolean isTradeRisky(Trade trade) {
- if (trade == null)
- return false;
-
- Offer offer = trade.getOffer();
- return offer != null &&
- PaymentMethod.hasChargebackRisk(offer.getPaymentMethod(), offer.getCurrencyCode()) &&
- trade.getTradeAmount() != null &&
- isAmountRisky(trade.getTradeAmount());
- }
-
- public static boolean isMinTradeAmountRisky(Offer offer) {
- return isAmountRisky(offer.getMinAmount());
- }
-
- private static boolean isAmountRisky(Coin amount) {
- return amount.isGreaterThan(TOLERATED_SMALL_TRADE_AMOUNT);
- }
-
static boolean hasOfferMandatoryCapability(Offer offer, Capability mandatoryCapability) {
Map extraDataMap = offer.getOfferPayload().getExtraDataMap();
if (extraDataMap != null && extraDataMap.containsKey(OfferPayload.CAPABILITIES)) {
diff --git a/core/src/main/java/bisq/core/offer/OfferUtil.java b/core/src/main/java/bisq/core/offer/OfferUtil.java
index bffe39c889..a8c9406d68 100644
--- a/core/src/main/java/bisq/core/offer/OfferUtil.java
+++ b/core/src/main/java/bisq/core/offer/OfferUtil.java
@@ -32,7 +32,6 @@ import bisq.core.provider.price.MarketPrice;
import bisq.core.provider.price.PriceFeedService;
import bisq.core.trade.statistics.ReferralIdService;
import bisq.core.user.Preferences;
-import bisq.core.util.BSFormatter;
import bisq.core.util.BsqFormatter;
import bisq.core.util.CoinUtil;
@@ -326,7 +325,8 @@ public class OfferUtil {
public static Map getExtraDataMap(AccountAgeWitnessService accountAgeWitnessService,
ReferralIdService referralIdService,
PaymentAccount paymentAccount,
- String currencyCode) {
+ String currencyCode,
+ Preferences preferences) {
Map extraDataMap = new HashMap<>();
if (CurrencyUtil.isFiatCurrency(currencyCode)) {
String myWitnessHashAsHex = accountAgeWitnessService.getMyWitnessHashAsHex(paymentAccount.getPaymentAccountPayload());
diff --git a/core/src/main/java/bisq/core/offer/OpenOffer.java b/core/src/main/java/bisq/core/offer/OpenOffer.java
index 2193b30752..ced8cce983 100644
--- a/core/src/main/java/bisq/core/offer/OpenOffer.java
+++ b/core/src/main/java/bisq/core/offer/OpenOffer.java
@@ -65,6 +65,12 @@ public final class OpenOffer implements Tradable {
@Nullable
private NodeAddress mediatorNodeAddress;
+ // Added v1.2.0
+ @Getter
+ @Setter
+ @Nullable
+ private NodeAddress refundAgentNodeAddress;
+
transient private Storage> storage;
public OpenOffer(Offer offer, Storage> storage) {
@@ -80,11 +86,13 @@ public final class OpenOffer implements Tradable {
private OpenOffer(Offer offer,
State state,
@Nullable NodeAddress arbitratorNodeAddress,
- @Nullable NodeAddress mediatorNodeAddress) {
+ @Nullable NodeAddress mediatorNodeAddress,
+ @Nullable NodeAddress refundAgentNodeAddress) {
this.offer = offer;
this.state = state;
this.arbitratorNodeAddress = arbitratorNodeAddress;
this.mediatorNodeAddress = mediatorNodeAddress;
+ this.refundAgentNodeAddress = refundAgentNodeAddress;
if (this.state == State.RESERVED)
setState(State.AVAILABLE);
@@ -98,6 +106,7 @@ public final class OpenOffer implements Tradable {
Optional.ofNullable(arbitratorNodeAddress).ifPresent(nodeAddress -> builder.setArbitratorNodeAddress(nodeAddress.toProtoMessage()));
Optional.ofNullable(mediatorNodeAddress).ifPresent(nodeAddress -> builder.setMediatorNodeAddress(nodeAddress.toProtoMessage()));
+ Optional.ofNullable(refundAgentNodeAddress).ifPresent(nodeAddress -> builder.setRefundAgentNodeAddress(nodeAddress.toProtoMessage()));
return protobuf.Tradable.newBuilder().setOpenOffer(builder).build();
}
@@ -106,7 +115,8 @@ public final class OpenOffer implements Tradable {
return new OpenOffer(Offer.fromProto(proto.getOffer()),
ProtoUtil.enumFromProto(OpenOffer.State.class, proto.getState().name()),
proto.hasArbitratorNodeAddress() ? NodeAddress.fromProto(proto.getArbitratorNodeAddress()) : null,
- proto.hasMediatorNodeAddress() ? NodeAddress.fromProto(proto.getMediatorNodeAddress()) : null);
+ proto.hasMediatorNodeAddress() ? NodeAddress.fromProto(proto.getMediatorNodeAddress()) : null,
+ proto.hasRefundAgentNodeAddress() ? NodeAddress.fromProto(proto.getRefundAgentNodeAddress()) : null);
}
@@ -175,6 +185,7 @@ public final class OpenOffer implements Tradable {
",\n state=" + state +
",\n arbitratorNodeAddress=" + arbitratorNodeAddress +
",\n mediatorNodeAddress=" + mediatorNodeAddress +
+ ",\n refundAgentNodeAddress=" + refundAgentNodeAddress +
"\n}";
}
}
diff --git a/core/src/main/java/bisq/core/offer/OpenOfferManager.java b/core/src/main/java/bisq/core/offer/OpenOfferManager.java
index 6754512c6e..1212a7313e 100644
--- a/core/src/main/java/bisq/core/offer/OpenOfferManager.java
+++ b/core/src/main/java/bisq/core/offer/OpenOfferManager.java
@@ -20,6 +20,7 @@ package bisq.core.offer;
import bisq.core.btc.wallet.BsqWalletService;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.btc.wallet.TradeWalletService;
+import bisq.core.dao.DaoFacade;
import bisq.core.exceptions.TradePriceOutOfToleranceException;
import bisq.core.offer.availability.DisputeAgentSelection;
import bisq.core.offer.messages.OfferAvailabilityRequest;
@@ -29,6 +30,7 @@ import bisq.core.offer.placeoffer.PlaceOfferProtocol;
import bisq.core.provider.price.PriceFeedService;
import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager;
import bisq.core.support.dispute.mediation.mediator.MediatorManager;
+import bisq.core.support.dispute.refund.refundagent.RefundAgentManager;
import bisq.core.trade.TradableList;
import bisq.core.trade.closed.ClosedTradableManager;
import bisq.core.trade.handlers.TransactionResultHandler;
@@ -51,6 +53,7 @@ import bisq.common.Timer;
import bisq.common.UserThread;
import bisq.common.app.Capabilities;
import bisq.common.app.Capability;
+import bisq.common.app.Version;
import bisq.common.crypto.KeyRing;
import bisq.common.crypto.PubKeyRing;
import bisq.common.handlers.ErrorMessageHandler;
@@ -104,6 +107,8 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
private final TradeStatisticsManager tradeStatisticsManager;
private final ArbitratorManager arbitratorManager;
private final MediatorManager mediatorManager;
+ private final RefundAgentManager refundAgentManager;
+ private final DaoFacade daoFacade;
private final Storage> openOfferTradableListStorage;
private final Map offersToBeEdited = new HashMap<>();
private boolean stopped;
@@ -129,6 +134,8 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
TradeStatisticsManager tradeStatisticsManager,
ArbitratorManager arbitratorManager,
MediatorManager mediatorManager,
+ RefundAgentManager refundAgentManager,
+ DaoFacade daoFacade,
Storage> storage) {
this.keyRing = keyRing;
this.user = user;
@@ -143,6 +150,8 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
this.tradeStatisticsManager = tradeStatisticsManager;
this.arbitratorManager = arbitratorManager;
this.mediatorManager = mediatorManager;
+ this.refundAgentManager = refundAgentManager;
+ this.daoFacade = daoFacade;
openOfferTradableListStorage = storage;
@@ -339,6 +348,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
offerBookService,
arbitratorManager,
tradeStatisticsManager,
+ daoFacade,
user);
PlaceOfferProtocol placeOfferProtocol = new PlaceOfferProtocol(
model,
@@ -577,6 +587,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
AvailabilityResult availabilityResult;
NodeAddress arbitratorNodeAddress = null;
NodeAddress mediatorNodeAddress = null;
+ NodeAddress refundAgentNodeAddress = null;
if (openOfferOptional.isPresent()) {
OpenOffer openOffer = openOfferOptional.get();
if (openOffer.getState() == OpenOffer.State.AVAILABLE) {
@@ -584,41 +595,26 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
if (preferences.getIgnoreTradersList().stream().noneMatch(fullAddress -> fullAddress.equals(peer.getFullAddress()))) {
availabilityResult = AvailabilityResult.AVAILABLE;
- List acceptedArbitrators = user.getAcceptedArbitratorAddresses();
- if (acceptedArbitrators != null && !acceptedArbitrators.isEmpty()) {
- arbitratorNodeAddress = DisputeAgentSelection.getLeastUsedArbitrator(tradeStatisticsManager, arbitratorManager).getNodeAddress();
- openOffer.setArbitratorNodeAddress(arbitratorNodeAddress);
+ mediatorNodeAddress = DisputeAgentSelection.getLeastUsedMediator(tradeStatisticsManager, mediatorManager).getNodeAddress();
+ openOffer.setMediatorNodeAddress(mediatorNodeAddress);
- mediatorNodeAddress = DisputeAgentSelection.getLeastUsedMediator(tradeStatisticsManager, mediatorManager).getNodeAddress();
- openOffer.setMediatorNodeAddress(mediatorNodeAddress);
- Capabilities supportedCapabilities = request.getSupportedCapabilities();
- if (!OfferRestrictions.requiresUpdate() ||
- (supportedCapabilities != null &&
- Capabilities.hasMandatoryCapability(supportedCapabilities, Capability.MEDIATION))) {
- try {
- // Check also tradePrice to avoid failures after taker fee is paid caused by a too big difference
- // in trade price between the peers. Also here poor connectivity might cause market price API connection
- // losses and therefore an outdated market price.
- offer.checkTradePriceTolerance(request.getTakersTradePrice());
- } catch (TradePriceOutOfToleranceException e) {
- log.warn("Trade price check failed because takers price is outside out tolerance.");
- availabilityResult = AvailabilityResult.PRICE_OUT_OF_TOLERANCE;
- } catch (MarketPriceNotAvailableException e) {
- log.warn(e.getMessage());
- availabilityResult = AvailabilityResult.MARKET_PRICE_NOT_AVAILABLE;
- } catch (Throwable e) {
- log.warn("Trade price check failed. " + e.getMessage());
- availabilityResult = AvailabilityResult.UNKNOWN_FAILURE;
- }
- } else {
- log.warn("Taker has not mandatory capability MEDIATION");
- // Because an old peer has not AvailabilityResult.MISSING_MANDATORY_CAPABILITY and we
- // have not set the UNDEFINED fallback in AvailabilityResult the user will get a null value.
- availabilityResult = AvailabilityResult.MISSING_MANDATORY_CAPABILITY;
- }
- } else {
- log.warn("acceptedArbitrators is null or empty: acceptedArbitrators=" + acceptedArbitrators);
- availabilityResult = AvailabilityResult.NO_ARBITRATORS;
+ refundAgentNodeAddress = DisputeAgentSelection.getLeastUsedRefundAgent(tradeStatisticsManager, refundAgentManager).getNodeAddress();
+ openOffer.setRefundAgentNodeAddress(refundAgentNodeAddress);
+
+ try {
+ // Check also tradePrice to avoid failures after taker fee is paid caused by a too big difference
+ // in trade price between the peers. Also here poor connectivity might cause market price API connection
+ // losses and therefore an outdated market price.
+ offer.checkTradePriceTolerance(request.getTakersTradePrice());
+ } catch (TradePriceOutOfToleranceException e) {
+ log.warn("Trade price check failed because takers price is outside out tolerance.");
+ availabilityResult = AvailabilityResult.PRICE_OUT_OF_TOLERANCE;
+ } catch (MarketPriceNotAvailableException e) {
+ log.warn(e.getMessage());
+ availabilityResult = AvailabilityResult.MARKET_PRICE_NOT_AVAILABLE;
+ } catch (Throwable e) {
+ log.warn("Trade price check failed. " + e.getMessage());
+ availabilityResult = AvailabilityResult.UNKNOWN_FAILURE;
}
} else {
availabilityResult = AvailabilityResult.USER_IGNORED;
@@ -634,7 +630,8 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
OfferAvailabilityResponse offerAvailabilityResponse = new OfferAvailabilityResponse(request.offerId,
availabilityResult,
arbitratorNodeAddress,
- mediatorNodeAddress);
+ mediatorNodeAddress,
+ refundAgentNodeAddress);
log.info("Send {} with offerId {} and uid {} to peer {}",
offerAvailabilityResponse.getClass().getSimpleName(), offerAvailabilityResponse.getOfferId(),
offerAvailabilityResponse.getUid(), peer);
@@ -715,14 +712,17 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
private void maybeUpdatePersistedOffers() {
// We need to clone to avoid ConcurrentModificationException
ArrayList openOffersClone = new ArrayList<>(openOffers.getList());
- openOffersClone.forEach(openOffer -> {
- Offer originalOffer = openOffer.getOffer();
+ openOffersClone.forEach(originalOpenOffer -> {
+ Offer originalOffer = originalOpenOffer.getOffer();
OfferPayload originalOfferPayload = originalOffer.getOfferPayload();
- // We added CAPABILITIES with entry for Capability.MEDIATION in v1.1.6 and want to rewrite a
- // persisted offer after the user has updated to 1.1.6 so their offer will be accepted by the network.
+ // We added CAPABILITIES with entry for Capability.MEDIATION in v1.1.6 and
+ // Capability.REFUND_AGENT in v1.2.0 and want to rewrite a
+ // persisted offer after the user has updated to 1.2.0 so their offer will be accepted by the network.
- if (!OfferRestrictions.hasOfferMandatoryCapability(originalOffer, Capability.MEDIATION)) {
+ if (originalOfferPayload.getProtocolVersion() < Version.TRADE_PROTOCOL_VERSION ||
+ !OfferRestrictions.hasOfferMandatoryCapability(originalOffer, Capability.MEDIATION) ||
+ !OfferRestrictions.hasOfferMandatoryCapability(originalOffer, Capability.REFUND_AGENT)) {
// We rewrite our offer with the additional capabilities entry
Map originalExtraDataMap = originalOfferPayload.getExtraDataMap();
@@ -735,6 +735,9 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
// We overwrite any entry with our current capabilities
updatedExtraDataMap.put(OfferPayload.CAPABILITIES, Capabilities.app.toStringList());
+ // We update the trade protocol version
+ int protocolVersion = Version.TRADE_PROTOCOL_VERSION;
+
OfferPayload updatedPayload = new OfferPayload(originalOfferPayload.getId(),
originalOfferPayload.getDate(),
originalOfferPayload.getOwnerNodeAddress(),
@@ -772,17 +775,17 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
originalOfferPayload.isPrivateOffer(),
originalOfferPayload.getHashOfChallenge(),
updatedExtraDataMap,
- originalOfferPayload.getProtocolVersion());
+ protocolVersion);
- // Save states from original data to use the for updated
+ // Save states from original data to use for the updated
Offer.State originalOfferState = originalOffer.getState();
- OpenOffer.State originalOpenOfferState = openOffer.getState();
+ OpenOffer.State originalOpenOfferState = originalOpenOffer.getState();
// remove old offer
originalOffer.setState(Offer.State.REMOVED);
- openOffer.setState(OpenOffer.State.CANCELED);
- openOffer.setStorage(openOfferTradableListStorage);
- openOffers.remove(openOffer);
+ originalOpenOffer.setState(OpenOffer.State.CANCELED);
+ originalOpenOffer.setStorage(openOfferTradableListStorage);
+ openOffers.remove(originalOpenOffer);
// Create new Offer
Offer updatedOffer = new Offer(updatedPayload);
@@ -794,7 +797,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
updatedOpenOffer.setStorage(openOfferTradableListStorage);
openOffers.add(updatedOpenOffer);
- log.info("Converted offer to support new Capability.MEDIATION capability. id={}", originalOffer.getId());
+ log.info("Converted offer to support new Capability.MEDIATION and Capability.REFUND_AGENT capability. id={}", originalOffer.getId());
}
});
}
diff --git a/core/src/main/java/bisq/core/offer/availability/DisputeAgentSelection.java b/core/src/main/java/bisq/core/offer/availability/DisputeAgentSelection.java
index bce44e6cbc..2639261d6f 100644
--- a/core/src/main/java/bisq/core/offer/availability/DisputeAgentSelection.java
+++ b/core/src/main/java/bisq/core/offer/availability/DisputeAgentSelection.java
@@ -57,6 +57,13 @@ public class DisputeAgentSelection {
TradeStatistics2.MEDIATOR_ADDRESS);
}
+ public static T getLeastUsedRefundAgent(TradeStatisticsManager tradeStatisticsManager,
+ DisputeAgentManager disputeAgentManager) {
+ return getLeastUsedDisputeAgent(tradeStatisticsManager,
+ disputeAgentManager,
+ TradeStatistics2.REFUND_AGENT_ADDRESS);
+ }
+
private static T getLeastUsedDisputeAgent(TradeStatisticsManager tradeStatisticsManager,
DisputeAgentManager disputeAgentManager,
String extraMapKey) {
diff --git a/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityModel.java b/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityModel.java
index 2b55c18813..aad97d33f4 100644
--- a/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityModel.java
+++ b/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityModel.java
@@ -60,6 +60,12 @@ public class OfferAvailabilityModel implements Model {
@Getter
private NodeAddress selectedMediator;
+ // Added in v1.2.0
+ @Nullable
+ @Setter
+ @Getter
+ private NodeAddress selectedRefundAgent;
+
public OfferAvailabilityModel(Offer offer,
PubKeyRing pubKeyRing,
diff --git a/core/src/main/java/bisq/core/offer/availability/tasks/ProcessOfferAvailabilityResponse.java b/core/src/main/java/bisq/core/offer/availability/tasks/ProcessOfferAvailabilityResponse.java
index 1690ddc34a..6862661b39 100644
--- a/core/src/main/java/bisq/core/offer/availability/tasks/ProcessOfferAvailabilityResponse.java
+++ b/core/src/main/java/bisq/core/offer/availability/tasks/ProcessOfferAvailabilityResponse.java
@@ -57,12 +57,16 @@ public class ProcessOfferAvailabilityResponse extends Task builder.addAllSupportedCapabilities(Capabilities.toIntList(supportedCapabilities)));
Optional.ofNullable(uid).ifPresent(e -> builder.setUid(uid));
Optional.ofNullable(mediator).ifPresent(e -> builder.setMediator(mediator.toProtoMessage()));
+ Optional.ofNullable(refundAgent).ifPresent(e -> builder.setRefundAgent(refundAgent.toProtoMessage()));
+ Optional.ofNullable(arbitrator).ifPresent(e -> builder.setArbitrator(arbitrator.toProtoMessage()));
return getNetworkEnvelopeBuilder()
.setOfferAvailabilityResponse(builder)
@@ -103,7 +112,8 @@ public final class OfferAvailabilityResponse extends OfferMessage implements Sup
Capabilities.fromIntList(proto.getSupportedCapabilitiesList()),
messageVersion,
proto.getUid().isEmpty() ? null : proto.getUid(),
- NodeAddress.fromProto(proto.getArbitrator()),
- proto.hasMediator() ? NodeAddress.fromProto(proto.getMediator()) : null);
+ proto.hasArbitrator() ? NodeAddress.fromProto(proto.getArbitrator()) : null,
+ proto.hasMediator() ? NodeAddress.fromProto(proto.getMediator()) : null,
+ proto.hasRefundAgent() ? NodeAddress.fromProto(proto.getRefundAgent()) : null);
}
}
diff --git a/core/src/main/java/bisq/core/offer/placeoffer/PlaceOfferModel.java b/core/src/main/java/bisq/core/offer/placeoffer/PlaceOfferModel.java
index e63e31ecdf..294f7cd19f 100644
--- a/core/src/main/java/bisq/core/offer/placeoffer/PlaceOfferModel.java
+++ b/core/src/main/java/bisq/core/offer/placeoffer/PlaceOfferModel.java
@@ -20,6 +20,7 @@ package bisq.core.offer.placeoffer;
import bisq.core.btc.wallet.BsqWalletService;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.btc.wallet.TradeWalletService;
+import bisq.core.dao.DaoFacade;
import bisq.core.offer.Offer;
import bisq.core.offer.OfferBookService;
import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager;
@@ -48,6 +49,7 @@ public class PlaceOfferModel implements Model {
private final OfferBookService offerBookService;
private final ArbitratorManager arbitratorManager;
private final TradeStatisticsManager tradeStatisticsManager;
+ private final DaoFacade daoFacade;
private final User user;
// Mutable
@@ -65,6 +67,7 @@ public class PlaceOfferModel implements Model {
OfferBookService offerBookService,
ArbitratorManager arbitratorManager,
TradeStatisticsManager tradeStatisticsManager,
+ DaoFacade daoFacade,
User user) {
this.offer = offer;
this.reservedFundsForOffer = reservedFundsForOffer;
@@ -75,6 +78,7 @@ public class PlaceOfferModel implements Model {
this.offerBookService = offerBookService;
this.arbitratorManager = arbitratorManager;
this.tradeStatisticsManager = tradeStatisticsManager;
+ this.daoFacade = daoFacade;
this.user = user;
}
diff --git a/core/src/main/java/bisq/core/offer/placeoffer/tasks/CreateMakerFeeTx.java b/core/src/main/java/bisq/core/offer/placeoffer/tasks/CreateMakerFeeTx.java
index f7e35d82a0..da2b60a0ac 100644
--- a/core/src/main/java/bisq/core/offer/placeoffer/tasks/CreateMakerFeeTx.java
+++ b/core/src/main/java/bisq/core/offer/placeoffer/tasks/CreateMakerFeeTx.java
@@ -25,11 +25,10 @@ import bisq.core.btc.wallet.TradeWalletService;
import bisq.core.btc.wallet.TxBroadcaster;
import bisq.core.btc.wallet.WalletService;
import bisq.core.dao.exceptions.DaoDisabledException;
+import bisq.core.dao.governance.param.Param;
import bisq.core.dao.state.model.blockchain.TxType;
import bisq.core.offer.Offer;
-import bisq.core.offer.availability.DisputeAgentSelection;
import bisq.core.offer.placeoffer.PlaceOfferModel;
-import bisq.core.support.dispute.arbitration.arbitrator.Arbitrator;
import bisq.common.UserThread;
import bisq.common.taskrunner.Task;
@@ -45,7 +44,6 @@ import javax.annotation.Nullable;
public class CreateMakerFeeTx extends Task {
private static final Logger log = LoggerFactory.getLogger(CreateMakerFeeTx.class);
- private Transaction tradeFeeTx = null;
@SuppressWarnings({"unused"})
public CreateMakerFeeTx(TaskRunner taskHandler, PlaceOfferModel model) {
@@ -62,17 +60,15 @@ public class CreateMakerFeeTx extends Task {
String id = offer.getId();
BtcWalletService walletService = model.getWalletService();
- Arbitrator arbitrator = DisputeAgentSelection.getLeastUsedArbitrator(model.getTradeStatisticsManager(),
- model.getArbitratorManager());
-
Address fundingAddress = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.OFFER_FUNDING).getAddress();
Address reservedForTradeAddress = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.RESERVED_FOR_TRADE).getAddress();
Address changeAddress = walletService.getFreshAddressEntry().getAddress();
- final TradeWalletService tradeWalletService = model.getTradeWalletService();
+ TradeWalletService tradeWalletService = model.getTradeWalletService();
+ String feeReceiver = model.getDaoFacade().getParamValue(Param.RECIPIENT_BTC_ADDRESS);
if (offer.isCurrencyForMakerFeeBtc()) {
- tradeFeeTx = tradeWalletService.createBtcTradingFeeTx(
+ tradeWalletService.createBtcTradingFeeTx(
fundingAddress,
reservedForTradeAddress,
changeAddress,
@@ -80,7 +76,7 @@ public class CreateMakerFeeTx extends Task {
model.isUseSavingsWallet(),
offer.getMakerFee(),
offer.getTxFee(),
- arbitrator.getBtcAddress(),
+ feeReceiver,
true,
new TxBroadcaster.Callback() {
@Override
@@ -113,7 +109,7 @@ public class CreateMakerFeeTx extends Task {
});
} else {
final BsqWalletService bsqWalletService = model.getBsqWalletService();
- Transaction preparedBurnFeeTx = model.getBsqWalletService().getPreparedBurnFeeTx(offer.getMakerFee());
+ Transaction preparedBurnFeeTx = model.getBsqWalletService().getPreparedTradeFeeTx(offer.getMakerFee());
Transaction txWithBsqFee = tradeWalletService.completeBsqTradingFeeTx(preparedBurnFeeTx,
fundingAddress,
reservedForTradeAddress,
diff --git a/core/src/main/java/bisq/core/payment/PaymentAccountUtil.java b/core/src/main/java/bisq/core/payment/PaymentAccountUtil.java
index b4bba4f4e7..fbc4d491bf 100644
--- a/core/src/main/java/bisq/core/payment/PaymentAccountUtil.java
+++ b/core/src/main/java/bisq/core/payment/PaymentAccountUtil.java
@@ -17,11 +17,9 @@
package bisq.core.payment;
-import bisq.core.account.witness.AccountAgeRestrictions;
import bisq.core.account.witness.AccountAgeWitnessService;
import bisq.core.locale.Country;
import bisq.core.offer.Offer;
-import bisq.core.offer.OfferRestrictions;
import bisq.core.payment.payload.PaymentMethod;
import javafx.collections.FXCollections;
@@ -41,57 +39,8 @@ import javax.annotation.Nullable;
@Slf4j
public class PaymentAccountUtil {
- public static boolean isRiskyBuyOfferWithImmatureAccountAge(Offer offer, AccountAgeWitnessService accountAgeWitnessService) {
- return OfferRestrictions.isOfferRisky(offer) &&
- AccountAgeRestrictions.isMakersAccountAgeImmature(accountAgeWitnessService, offer);
- }
-
- public static boolean isSellOfferAndAllTakerPaymentAccountsForOfferImmature(Offer offer,
- Collection takerPaymentAccounts,
- AccountAgeWitnessService accountAgeWitnessService) {
- if (offer.isBuyOffer()) {
- return false;
- }
-
- if (!OfferRestrictions.isSellOfferRisky(offer)) {
- return false;
- }
-
- for (PaymentAccount takerPaymentAccount : takerPaymentAccounts) {
- if (isTakerAccountForOfferMature(offer, takerPaymentAccount, accountAgeWitnessService))
- return false;
- }
- return true;
- }
-
- private static boolean isTakerAccountForOfferMature(Offer offer,
- PaymentAccount takerPaymentAccount,
- AccountAgeWitnessService accountAgeWitnessService) {
- return !PaymentMethod.hasChargebackRisk(offer.getPaymentMethod(), offer.getCurrencyCode()) ||
- !OfferRestrictions.isMinTradeAmountRisky(offer) ||
- (isTakerPaymentAccountValidForOffer(offer, takerPaymentAccount) &&
- !AccountAgeRestrictions.isMyAccountAgeImmature(accountAgeWitnessService, takerPaymentAccount));
- }
-
- public static boolean hasMakerAnyMatureAccountForBuyOffer(Collection makerPaymentAccounts,
- AccountAgeWitnessService accountAgeWitnessService) {
- for (PaymentAccount makerPaymentAccount : makerPaymentAccounts) {
- if (hasMyMatureAccountForBuyOffer(makerPaymentAccount, accountAgeWitnessService))
- return true;
- }
- return false;
- }
-
- private static boolean hasMyMatureAccountForBuyOffer(PaymentAccount myPaymentAccount,
- AccountAgeWitnessService accountAgeWitnessService) {
- if (myPaymentAccount.selectedTradeCurrency == null)
- return false;
- return !PaymentMethod.hasChargebackRisk(myPaymentAccount.getPaymentMethod(),
- myPaymentAccount.selectedTradeCurrency.getCode()) ||
- !AccountAgeRestrictions.isMyAccountAgeImmature(accountAgeWitnessService, myPaymentAccount);
- }
-
- public static boolean isAnyTakerPaymentAccountValidForOffer(Offer offer, Collection takerPaymentAccounts) {
+ public static boolean isAnyTakerPaymentAccountValidForOffer(Offer offer,
+ Collection takerPaymentAccounts) {
for (PaymentAccount takerPaymentAccount : takerPaymentAccounts) {
if (isTakerPaymentAccountValidForOffer(offer, takerPaymentAccount))
return true;
@@ -105,11 +54,21 @@ public class PaymentAccountUtil {
ObservableList result = FXCollections.observableArrayList();
result.addAll(paymentAccounts.stream()
.filter(paymentAccount -> isTakerPaymentAccountValidForOffer(offer, paymentAccount))
- .filter(paymentAccount -> offer.isBuyOffer() || isTakerAccountForOfferMature(offer, paymentAccount, accountAgeWitnessService))
+ .filter(paymentAccount -> isAmountValidForOffer(offer, paymentAccount, accountAgeWitnessService))
.collect(Collectors.toList()));
return result;
}
+ // Return true if paymentAccount can take this offer
+ public static boolean isAmountValidForOffer(Offer offer,
+ PaymentAccount paymentAccount,
+ AccountAgeWitnessService accountAgeWitnessService) {
+ boolean hasChargebackRisk = PaymentMethod.hasChargebackRisk(offer.getPaymentMethod(), offer.getCurrencyCode());
+ boolean hasValidAccountAgeWitness = accountAgeWitnessService.getMyTradeLimit(paymentAccount,
+ offer.getCurrencyCode(), offer.getMirroredDirection()) >= offer.getAmount().value;
+ return !hasChargebackRisk || hasValidAccountAgeWitness;
+ }
+
// TODO might be used to show more details if we get payment methods updates with diff. limits
public static String getInfoForMismatchingPaymentMethodLimits(Offer offer, PaymentAccount paymentAccount) {
// dont translate atm as it is not used so far in the UI just for logs
diff --git a/core/src/main/java/bisq/core/payment/PaymentAccounts.java b/core/src/main/java/bisq/core/payment/PaymentAccounts.java
index e6fe3a32bb..c27c883449 100644
--- a/core/src/main/java/bisq/core/payment/PaymentAccounts.java
+++ b/core/src/main/java/bisq/core/payment/PaymentAccounts.java
@@ -37,17 +37,17 @@ class PaymentAccounts {
private static final Logger log = LoggerFactory.getLogger(PaymentAccounts.class);
private final Set accounts;
- private final AccountAgeWitnessService service;
+ private final AccountAgeWitnessService accountAgeWitnessService;
private final BiFunction validator;
- PaymentAccounts(Set accounts, AccountAgeWitnessService service) {
- this(accounts, service, PaymentAccountUtil::isTakerPaymentAccountValidForOffer);
+ PaymentAccounts(Set accounts, AccountAgeWitnessService accountAgeWitnessService) {
+ this(accounts, accountAgeWitnessService, PaymentAccountUtil::isTakerPaymentAccountValidForOffer);
}
- PaymentAccounts(Set accounts, AccountAgeWitnessService service,
+ PaymentAccounts(Set accounts, AccountAgeWitnessService accountAgeWitnessService,
BiFunction validator) {
this.accounts = accounts;
- this.service = service;
+ this.accountAgeWitnessService = accountAgeWitnessService;
this.validator = validator;
}
@@ -61,7 +61,7 @@ class PaymentAccounts {
}
private List sortValidAccounts(Offer offer) {
- Comparator comparator = this::compareByAge;
+ Comparator comparator = this::compareByTradeLimit;
return accounts.stream()
.filter(account -> validator.apply(offer, account))
.sorted(comparator.reversed())
@@ -78,7 +78,7 @@ class PaymentAccounts {
StringBuilder message = new StringBuilder("Valid accounts: \n");
for (PaymentAccount account : accounts) {
String accountName = account.getAccountName();
- String witnessHex = service.getMyWitnessHashAsHex(account.getPaymentAccountPayload());
+ String witnessHex = accountAgeWitnessService.getMyWitnessHashAsHex(account.getPaymentAccountPayload());
message.append("name = ")
.append(accountName)
@@ -91,15 +91,24 @@ class PaymentAccounts {
}
}
- private int compareByAge(PaymentAccount left, PaymentAccount right) {
- AccountAgeWitness leftWitness = service.getMyWitness(left.getPaymentAccountPayload());
- AccountAgeWitness rightWitness = service.getMyWitness(right.getPaymentAccountPayload());
+ // Accounts ranked by trade limit
+ private int compareByTradeLimit(PaymentAccount left, PaymentAccount right) {
+ // Mature accounts count as infinite sign age
+ if (accountAgeWitnessService.myHasTradeLimitException(left)) {
+ return !accountAgeWitnessService.myHasTradeLimitException(right) ? 1 : 0;
+ }
+ if (accountAgeWitnessService.myHasTradeLimitException(right)) {
+ return -1;
+ }
+
+ AccountAgeWitness leftWitness = accountAgeWitnessService.getMyWitness(left.getPaymentAccountPayload());
+ AccountAgeWitness rightWitness = accountAgeWitnessService.getMyWitness(right.getPaymentAccountPayload());
Date now = new Date();
- long leftAge = service.getAccountAge(leftWitness, now);
- long rightAge = service.getAccountAge(rightWitness, now);
+ long leftSignAge = accountAgeWitnessService.getWitnessSignAge(leftWitness, now);
+ long rightSignAge = accountAgeWitnessService.getWitnessSignAge(rightWitness, now);
- return Long.compare(leftAge, rightAge);
+ return Long.compare(leftSignAge, rightSignAge);
}
}
diff --git a/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java b/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java
index 983d0177e6..d39787702a 100644
--- a/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java
+++ b/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java
@@ -19,6 +19,7 @@ package bisq.core.payment.payload;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.Res;
+import bisq.core.locale.TradeCurrency;
import bisq.core.payment.TradeLimits;
import bisq.common.proto.persistable.PersistablePayload;
@@ -322,6 +323,15 @@ public final class PaymentMethod implements PersistablePayload, Comparable {
return this.equals(BLOCK_CHAINS_INSTANT) || this.equals(BLOCK_CHAINS);
}
+ public static boolean hasChargebackRisk(PaymentMethod paymentMethod, List tradeCurrencies) {
+ return tradeCurrencies.stream()
+ .anyMatch(tradeCurrency -> hasChargebackRisk(paymentMethod, tradeCurrency.getCode()));
+ }
+
+ public static boolean hasChargebackRisk(PaymentMethod paymentMethod) {
+ return hasChargebackRisk(paymentMethod, CurrencyUtil.getMatureMarketCurrencies());
+ }
+
public static boolean hasChargebackRisk(PaymentMethod paymentMethod, String currencyCode) {
if (paymentMethod == null)
return false;
diff --git a/core/src/main/java/bisq/core/presentation/SupportTicketsPresentation.java b/core/src/main/java/bisq/core/presentation/SupportTicketsPresentation.java
index be98548140..8e1764f635 100644
--- a/core/src/main/java/bisq/core/presentation/SupportTicketsPresentation.java
+++ b/core/src/main/java/bisq/core/presentation/SupportTicketsPresentation.java
@@ -19,6 +19,7 @@ package bisq.core.presentation;
import bisq.core.support.dispute.arbitration.ArbitrationManager;
import bisq.core.support.dispute.mediation.MediationManager;
+import bisq.core.support.dispute.refund.RefundManager;
import javax.inject.Inject;
@@ -27,51 +28,39 @@ import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
-import java.util.concurrent.atomic.AtomicInteger;
-
import lombok.Getter;
public class SupportTicketsPresentation {
- @Getter
- private final StringProperty numOpenArbitrationTickets = new SimpleStringProperty();
- @Getter
- private final BooleanProperty showOpenArbitrationTicketsNotification = new SimpleBooleanProperty();
-
- @Getter
- private final StringProperty numOpenMediationTickets = new SimpleStringProperty();
- @Getter
- private final BooleanProperty showOpenMediationTicketsNotification = new SimpleBooleanProperty();
-
@Getter
private final StringProperty numOpenSupportTickets = new SimpleStringProperty();
@Getter
private final BooleanProperty showOpenSupportTicketsNotification = new SimpleBooleanProperty();
+
@org.jetbrains.annotations.NotNull
private final ArbitrationManager arbitrationManager;
@org.jetbrains.annotations.NotNull
private final MediationManager mediationManager;
+ @org.jetbrains.annotations.NotNull
+ private final RefundManager refundManager;
@Inject
- public SupportTicketsPresentation(ArbitrationManager arbitrationManager, MediationManager mediationManager) {
+ public SupportTicketsPresentation(ArbitrationManager arbitrationManager,
+ MediationManager mediationManager,
+ RefundManager refundManager) {
this.arbitrationManager = arbitrationManager;
this.mediationManager = mediationManager;
+ this.refundManager = refundManager;
arbitrationManager.getNumOpenDisputes().addListener((observable, oldValue, newValue) -> onChange());
mediationManager.getNumOpenDisputes().addListener((observable, oldValue, newValue) -> onChange());
+ refundManager.getNumOpenDisputes().addListener((observable, oldValue, newValue) -> onChange());
}
private void onChange() {
- AtomicInteger openArbitrationDisputes = new AtomicInteger(arbitrationManager.getNumOpenDisputes().get());
- int arbitrationTickets = openArbitrationDisputes.get();
- numOpenArbitrationTickets.set(String.valueOf(arbitrationTickets));
- showOpenArbitrationTicketsNotification.set(arbitrationTickets > 0);
+ int supportTickets = arbitrationManager.getNumOpenDisputes().get() +
+ mediationManager.getNumOpenDisputes().get() +
+ refundManager.getNumOpenDisputes().get();
- AtomicInteger openMediationDisputes = new AtomicInteger(mediationManager.getNumOpenDisputes().get());
- int mediationTickets = openMediationDisputes.get();
- numOpenMediationTickets.set(String.valueOf(mediationTickets));
- showOpenMediationTicketsNotification.set(mediationTickets > 0);
-
- int supportTickets = arbitrationTickets + mediationTickets;
numOpenSupportTickets.set(String.valueOf(supportTickets));
showOpenSupportTicketsNotification.set(supportTickets > 0);
}
diff --git a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java
index 9d84408420..91791a5ba3 100644
--- a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java
+++ b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java
@@ -44,14 +44,19 @@ import bisq.core.support.dispute.mediation.mediator.Mediator;
import bisq.core.support.dispute.messages.DisputeResultMessage;
import bisq.core.support.dispute.messages.OpenNewDisputeMessage;
import bisq.core.support.dispute.messages.PeerOpenedDisputeMessage;
+import bisq.core.support.dispute.refund.refundagent.RefundAgent;
import bisq.core.support.messages.ChatMessage;
import bisq.core.trade.messages.CounterCurrencyTransferStartedMessage;
-import bisq.core.trade.messages.DepositTxPublishedMessage;
+import bisq.core.trade.messages.DelayedPayoutTxSignatureRequest;
+import bisq.core.trade.messages.DelayedPayoutTxSignatureResponse;
+import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage;
+import bisq.core.trade.messages.DepositTxMessage;
+import bisq.core.trade.messages.InputsForDepositTxRequest;
+import bisq.core.trade.messages.InputsForDepositTxResponse;
import bisq.core.trade.messages.MediatedPayoutTxPublishedMessage;
import bisq.core.trade.messages.MediatedPayoutTxSignatureMessage;
-import bisq.core.trade.messages.PayDepositRequest;
import bisq.core.trade.messages.PayoutTxPublishedMessage;
-import bisq.core.trade.messages.PublishDepositTxRequest;
+import bisq.core.trade.messages.PeerPublishedDelayedPayoutTxMessage;
import bisq.core.trade.statistics.TradeStatistics;
import bisq.network.p2p.AckMessage;
@@ -89,7 +94,6 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
@Singleton
public class CoreNetworkProtoResolver extends CoreProtoResolver implements NetworkProtoResolver {
-
@Inject
public CoreNetworkProtoResolver() {
}
@@ -134,16 +138,28 @@ public class CoreNetworkProtoResolver extends CoreProtoResolver implements Netwo
case PREFIXED_SEALED_AND_SIGNED_MESSAGE:
return PrefixedSealedAndSignedMessage.fromProto(proto.getPrefixedSealedAndSignedMessage(), messageVersion);
- case PAY_DEPOSIT_REQUEST:
- return PayDepositRequest.fromProto(proto.getPayDepositRequest(), this, messageVersion);
- case DEPOSIT_TX_PUBLISHED_MESSAGE:
- return DepositTxPublishedMessage.fromProto(proto.getDepositTxPublishedMessage(), messageVersion);
- case PUBLISH_DEPOSIT_TX_REQUEST:
- return PublishDepositTxRequest.fromProto(proto.getPublishDepositTxRequest(), this, messageVersion);
+ // trade protocol messages
+ case INPUTS_FOR_DEPOSIT_TX_REQUEST:
+ return InputsForDepositTxRequest.fromProto(proto.getInputsForDepositTxRequest(), this, messageVersion);
+ case INPUTS_FOR_DEPOSIT_TX_RESPONSE:
+ return InputsForDepositTxResponse.fromProto(proto.getInputsForDepositTxResponse(), this, messageVersion);
+ case DEPOSIT_TX_MESSAGE:
+ return DepositTxMessage.fromProto(proto.getDepositTxMessage(), messageVersion);
+ case DELAYED_PAYOUT_TX_SIGNATURE_REQUEST:
+ return DelayedPayoutTxSignatureRequest.fromProto(proto.getDelayedPayoutTxSignatureRequest(), messageVersion);
+ case DELAYED_PAYOUT_TX_SIGNATURE_RESPONSE:
+ return DelayedPayoutTxSignatureResponse.fromProto(proto.getDelayedPayoutTxSignatureResponse(), messageVersion);
+ case DEPOSIT_TX_AND_DELAYED_PAYOUT_TX_MESSAGE:
+ return DepositTxAndDelayedPayoutTxMessage.fromProto(proto.getDepositTxAndDelayedPayoutTxMessage(), messageVersion);
+
case COUNTER_CURRENCY_TRANSFER_STARTED_MESSAGE:
return CounterCurrencyTransferStartedMessage.fromProto(proto.getCounterCurrencyTransferStartedMessage(), messageVersion);
+
case PAYOUT_TX_PUBLISHED_MESSAGE:
return PayoutTxPublishedMessage.fromProto(proto.getPayoutTxPublishedMessage(), messageVersion);
+ case PEER_PUBLISHED_DELAYED_PAYOUT_TX_MESSAGE:
+ return PeerPublishedDelayedPayoutTxMessage.fromProto(proto.getPeerPublishedDelayedPayoutTxMessage(), messageVersion);
+
case MEDIATED_PAYOUT_TX_SIGNATURE_MESSAGE:
return MediatedPayoutTxSignatureMessage.fromProto(proto.getMediatedPayoutTxSignatureMessage(), messageVersion);
case MEDIATED_PAYOUT_TX_PUBLISHED_MESSAGE:
@@ -236,6 +252,8 @@ public class CoreNetworkProtoResolver extends CoreProtoResolver implements Netwo
return Arbitrator.fromProto(proto.getArbitrator());
case MEDIATOR:
return Mediator.fromProto(proto.getMediator());
+ case REFUND_AGENT:
+ return RefundAgent.fromProto(proto.getRefundAgent());
case FILTER:
return Filter.fromProto(proto.getFilter());
case TRADE_STATISTICS:
diff --git a/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java b/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java
index 796572b0c3..321b236408 100644
--- a/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java
+++ b/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java
@@ -37,6 +37,7 @@ import bisq.core.payment.PaymentAccountList;
import bisq.core.proto.CoreProtoResolver;
import bisq.core.support.dispute.arbitration.ArbitrationDisputeList;
import bisq.core.support.dispute.mediation.MediationDisputeList;
+import bisq.core.support.dispute.refund.RefundDisputeList;
import bisq.core.trade.TradableList;
import bisq.core.trade.statistics.TradeStatistics2Store;
import bisq.core.user.PreferencesPayload;
@@ -110,6 +111,10 @@ public class CorePersistenceProtoResolver extends CoreProtoResolver implements P
return MediationDisputeList.fromProto(proto.getMediationDisputeList(),
this,
new Storage<>(storageDir, this, corruptedDatabaseFilesHandler));
+ case REFUND_DISPUTE_LIST:
+ return RefundDisputeList.fromProto(proto.getRefundDisputeList(),
+ this,
+ new Storage<>(storageDir, this, corruptedDatabaseFilesHandler));
case PREFERENCES_PAYLOAD:
return PreferencesPayload.fromProto(proto.getPreferencesPayload(), this);
case USER_PAYLOAD:
diff --git a/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java b/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java
index 757f1f09df..680c984d27 100644
--- a/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java
+++ b/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java
@@ -37,7 +37,9 @@ public class CoreNetworkCapabilities {
Capability.BLIND_VOTE,
Capability.DAO_STATE,
Capability.BUNDLE_OF_ENVELOPES,
- Capability.MEDIATION
+ Capability.MEDIATION,
+ Capability.SIGNED_ACCOUNT_AGE_WITNESS,
+ Capability.REFUND_AGENT
);
if (BisqEnvironment.isDaoActivated(bisqEnvironment)) {
diff --git a/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java b/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java
index 1a068e82a8..f5a0e39c6b 100644
--- a/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java
+++ b/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java
@@ -29,6 +29,7 @@ import bisq.core.dao.state.unconfirmed.UnconfirmedBsqChangeOutputListService;
import bisq.core.offer.OpenOfferManager;
import bisq.core.support.dispute.arbitration.ArbitrationDisputeListService;
import bisq.core.support.dispute.mediation.MediationDisputeListService;
+import bisq.core.support.dispute.refund.RefundDisputeListService;
import bisq.core.trade.TradeManager;
import bisq.core.trade.closed.ClosedTradableManager;
import bisq.core.trade.failed.FailedTradesManager;
@@ -63,6 +64,7 @@ public class CorePersistedDataHost {
persistedDataHosts.add(injector.getInstance(FailedTradesManager.class));
persistedDataHosts.add(injector.getInstance(ArbitrationDisputeListService.class));
persistedDataHosts.add(injector.getInstance(MediationDisputeListService.class));
+ persistedDataHosts.add(injector.getInstance(RefundDisputeListService.class));
persistedDataHosts.add(injector.getInstance(P2PService.class));
if (injector.getInstance(Key.get(Boolean.class, Names.named(DaoOptionKeys.DAO_ACTIVATED)))) {
diff --git a/core/src/main/java/bisq/core/support/SupportType.java b/core/src/main/java/bisq/core/support/SupportType.java
index 4d13c7848e..cd10cc024f 100644
--- a/core/src/main/java/bisq/core/support/SupportType.java
+++ b/core/src/main/java/bisq/core/support/SupportType.java
@@ -22,7 +22,8 @@ import bisq.common.proto.ProtoUtil;
public enum SupportType {
ARBITRATION, // Need to be at index 0 to be the fall back for old clients
MEDIATION,
- TRADE;
+ TRADE,
+ REFUND;
public static SupportType fromProto(
protobuf.SupportType type) {
diff --git a/core/src/main/java/bisq/core/support/dispute/Dispute.java b/core/src/main/java/bisq/core/support/dispute/Dispute.java
index 3348bbf963..d5f45a7a18 100644
--- a/core/src/main/java/bisq/core/support/dispute/Dispute.java
+++ b/core/src/main/java/bisq/core/support/dispute/Dispute.java
@@ -48,6 +48,7 @@ import java.util.stream.Collectors;
import lombok.EqualsAndHashCode;
import lombok.Getter;
+import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.Nullable;
@@ -80,7 +81,7 @@ public final class Dispute implements NetworkPayload {
private final String makerContractSignature;
@Nullable
private final String takerContractSignature;
- private final PubKeyRing agentPubKeyRing; // arbitrator or mediator
+ private final PubKeyRing agentPubKeyRing; // dispute agent
private final boolean isSupportTicket;
private final ObservableList chatMessages = FXCollections.observableArrayList();
private BooleanProperty isClosedProperty = new SimpleBooleanProperty();
@@ -92,6 +93,16 @@ public final class Dispute implements NetworkPayload {
transient private Storage extends DisputeList> storage;
+ // Added v1.2.0
+ private SupportType supportType;
+ // Only used at refundAgent so that he knows how the mediator resolved the case
+ @Setter
+ @Nullable
+ private String mediatorsDisputeResult;
+ @Setter
+ @Nullable
+ private String delayedPayoutTxId;
+
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
@@ -114,7 +125,8 @@ public final class Dispute implements NetworkPayload {
@Nullable String makerContractSignature,
@Nullable String takerContractSignature,
PubKeyRing agentPubKeyRing,
- boolean isSupportTicket) {
+ boolean isSupportTicket,
+ SupportType supportType) {
this(tradeId,
traderId,
disputeOpenerIsBuyer,
@@ -131,7 +143,8 @@ public final class Dispute implements NetworkPayload {
makerContractSignature,
takerContractSignature,
agentPubKeyRing,
- isSupportTicket);
+ isSupportTicket,
+ supportType);
this.storage = storage;
openingDate = new Date().getTime();
}
@@ -157,7 +170,8 @@ public final class Dispute implements NetworkPayload {
@Nullable String makerContractSignature,
@Nullable String takerContractSignature,
PubKeyRing agentPubKeyRing,
- boolean isSupportTicket) {
+ boolean isSupportTicket,
+ SupportType supportType) {
this.tradeId = tradeId;
this.traderId = traderId;
this.disputeOpenerIsBuyer = disputeOpenerIsBuyer;
@@ -175,6 +189,7 @@ public final class Dispute implements NetworkPayload {
this.takerContractSignature = takerContractSignature;
this.agentPubKeyRing = agentPubKeyRing;
this.isSupportTicket = isSupportTicket;
+ this.supportType = supportType;
id = tradeId + "_" + traderId;
}
@@ -210,11 +225,14 @@ public final class Dispute implements NetworkPayload {
Optional.ofNullable(makerContractSignature).ifPresent(builder::setMakerContractSignature);
Optional.ofNullable(takerContractSignature).ifPresent(builder::setTakerContractSignature);
Optional.ofNullable(disputeResultProperty.get()).ifPresent(result -> builder.setDisputeResult(disputeResultProperty.get().toProtoMessage()));
+ Optional.ofNullable(supportType).ifPresent(result -> builder.setSupportType(SupportType.toProtoMessage(supportType)));
+ Optional.ofNullable(mediatorsDisputeResult).ifPresent(result -> builder.setMediatorsDisputeResult(mediatorsDisputeResult));
+ Optional.ofNullable(delayedPayoutTxId).ifPresent(result -> builder.setDelayedPayoutTxId(delayedPayoutTxId));
return builder.build();
}
public static Dispute fromProto(protobuf.Dispute proto, CoreProtoResolver coreProtoResolver) {
- final Dispute dispute = new Dispute(proto.getTradeId(),
+ Dispute dispute = new Dispute(proto.getTradeId(),
proto.getTraderId(),
proto.getDisputeOpenerIsBuyer(),
proto.getDisputeOpenerIsMaker(),
@@ -230,7 +248,8 @@ public final class Dispute implements NetworkPayload {
ProtoUtil.stringOrNullFromProto(proto.getMakerContractSignature()),
ProtoUtil.stringOrNullFromProto(proto.getTakerContractSignature()),
PubKeyRing.fromProto(proto.getAgentPubKeyRing()),
- proto.getIsSupportTicket());
+ proto.getIsSupportTicket(),
+ SupportType.fromProto(proto.getSupportType()));
dispute.chatMessages.addAll(proto.getChatMessageList().stream()
.map(ChatMessage::fromPayloadProto)
@@ -241,6 +260,17 @@ public final class Dispute implements NetworkPayload {
if (proto.hasDisputeResult())
dispute.disputeResultProperty.set(DisputeResult.fromProto(proto.getDisputeResult()));
dispute.disputePayoutTxId = ProtoUtil.stringOrNullFromProto(proto.getDisputePayoutTxId());
+
+ String mediatorsDisputeResult = proto.getMediatorsDisputeResult();
+ if (!mediatorsDisputeResult.isEmpty()) {
+ dispute.setMediatorsDisputeResult(mediatorsDisputeResult);
+ }
+
+ String delayedPayoutTxId = proto.getDelayedPayoutTxId();
+ if (!delayedPayoutTxId.isEmpty()) {
+ dispute.setDelayedPayoutTxId(delayedPayoutTxId);
+ }
+
return dispute;
}
@@ -258,10 +288,6 @@ public final class Dispute implements NetworkPayload {
}
}
- public boolean isMediationDispute() {
- return !chatMessages.isEmpty() && chatMessages.get(0).getSupportType() == SupportType.MEDIATION;
- }
-
///////////////////////////////////////////////////////////////////////////////////////////
// Setters
@@ -293,6 +319,9 @@ public final class Dispute implements NetworkPayload {
storage.queueUpForSave();
}
+ public void setSupportType(SupportType supportType) {
+ this.supportType = supportType;
+ }
///////////////////////////////////////////////////////////////////////////////////////////
// Getters
@@ -322,34 +351,37 @@ public final class Dispute implements NetworkPayload {
return isClosedProperty.get();
}
+
@Override
public String toString() {
return "Dispute{" +
- "tradeId='" + tradeId + '\'' +
- ", id='" + id + '\'' +
- ", traderId=" + traderId +
- ", disputeOpenerIsBuyer=" + disputeOpenerIsBuyer +
- ", disputeOpenerIsMaker=" + disputeOpenerIsMaker +
- ", openingDate=" + openingDate +
- ", traderPubKeyRing=" + traderPubKeyRing +
- ", tradeDate=" + tradeDate +
- ", contract=" + contract +
- ", contractHash=" + Utilities.bytesAsHexString(contractHash) +
- ", depositTxSerialized=" + Utilities.bytesAsHexString(depositTxSerialized) +
- ", payoutTxSerialized not displayed for privacy reasons..." +
- ", depositTxId='" + depositTxId + '\'' +
- ", payoutTxId='" + payoutTxId + '\'' +
- ", contractAsJson='" + contractAsJson + '\'' +
- ", makerContractSignature='" + makerContractSignature + '\'' +
- ", takerContractSignature='" + takerContractSignature + '\'' +
- ", agentPubKeyRing=" + agentPubKeyRing +
- ", isSupportTicket=" + isSupportTicket +
- ", chatMessages=" + chatMessages +
- ", isClosed=" + isClosedProperty.get() +
- ", disputeResult=" + disputeResultProperty.get() +
- ", disputePayoutTxId='" + disputePayoutTxId + '\'' +
- ", isClosedProperty=" + isClosedProperty +
- ", disputeResultProperty=" + disputeResultProperty +
- '}';
+ "\n tradeId='" + tradeId + '\'' +
+ ",\n id='" + id + '\'' +
+ ",\n traderId=" + traderId +
+ ",\n disputeOpenerIsBuyer=" + disputeOpenerIsBuyer +
+ ",\n disputeOpenerIsMaker=" + disputeOpenerIsMaker +
+ ",\n traderPubKeyRing=" + traderPubKeyRing +
+ ",\n tradeDate=" + tradeDate +
+ ",\n contract=" + contract +
+ ",\n contractHash=" + Utilities.bytesAsHexString(contractHash) +
+ ",\n depositTxSerialized=" + Utilities.bytesAsHexString(depositTxSerialized) +
+ ",\n payoutTxSerialized=" + Utilities.bytesAsHexString(payoutTxSerialized) +
+ ",\n depositTxId='" + depositTxId + '\'' +
+ ",\n payoutTxId='" + payoutTxId + '\'' +
+ ",\n contractAsJson='" + contractAsJson + '\'' +
+ ",\n makerContractSignature='" + makerContractSignature + '\'' +
+ ",\n takerContractSignature='" + takerContractSignature + '\'' +
+ ",\n agentPubKeyRing=" + agentPubKeyRing +
+ ",\n isSupportTicket=" + isSupportTicket +
+ ",\n chatMessages=" + chatMessages +
+ ",\n isClosedProperty=" + isClosedProperty +
+ ",\n disputeResultProperty=" + disputeResultProperty +
+ ",\n disputePayoutTxId='" + disputePayoutTxId + '\'' +
+ ",\n openingDate=" + openingDate +
+ ",\n storage=" + storage +
+ ",\n supportType=" + supportType +
+ ",\n mediatorsDisputeResult='" + mediatorsDisputeResult + '\'' +
+ ",\n delayedPayoutTxId='" + delayedPayoutTxId + '\'' +
+ "\n}";
}
}
diff --git a/core/src/main/java/bisq/core/support/dispute/DisputeManager.java b/core/src/main/java/bisq/core/support/dispute/DisputeManager.java
index 7049dbcc43..1edb7cbc3b 100644
--- a/core/src/main/java/bisq/core/support/dispute/DisputeManager.java
+++ b/core/src/main/java/bisq/core/support/dispute/DisputeManager.java
@@ -55,12 +55,14 @@ import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
+import javax.annotation.Nullable;
+
import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
public abstract class DisputeManager> extends SupportManager {
protected final TradeWalletService tradeWalletService;
- protected final BtcWalletService walletService;
+ protected final BtcWalletService btcWalletService;
protected final TradeManager tradeManager;
protected final ClosedTradableManager closedTradableManager;
protected final OpenOfferManager openOfferManager;
@@ -74,7 +76,7 @@ public abstract class DisputeManager storedDisputeOptional = findDispute(dispute);
if (!storedDisputeOptional.isPresent()) {
- dispute.setStorage(disputeListService.getStorage());
disputeList.add(dispute);
errorMessage = sendPeerOpenedDisputeMessage(dispute, contractFromOpener, peersPubKeyRing);
} else {
@@ -270,15 +283,29 @@ public abstract class DisputeManager messages = openNewDisputeMessage.getDispute().getChatMessages();
+ ObservableList messages = dispute.getChatMessages();
if (!messages.isEmpty()) {
- ChatMessage msg = messages.get(0);
+ ChatMessage chatMessage = messages.get(0);
PubKeyRing sendersPubKeyRing = dispute.isDisputeOpenerIsBuyer() ? contractFromOpener.getBuyerPubKeyRing() : contractFromOpener.getSellerPubKeyRing();
- sendAckMessage(msg, sendersPubKeyRing, errorMessage == null, errorMessage);
+ sendAckMessage(chatMessage, sendersPubKeyRing, errorMessage == null, errorMessage);
+ }
+
+ // In case of refundAgent we add a message with the mediatorsDisputeSummary. Only visible for refundAgent.
+ if (dispute.getMediatorsDisputeResult() != null) {
+ String mediatorsDisputeResult = Res.get("support.mediatorsDisputeSummary", dispute.getMediatorsDisputeResult());
+ ChatMessage mediatorsDisputeResultMessage = new ChatMessage(
+ getSupportType(),
+ dispute.getTradeId(),
+ pubKeyRing.hashCode(),
+ false,
+ mediatorsDisputeResult,
+ p2PService.getAddress());
+ mediatorsDisputeResultMessage.setSystemMessage(true);
+ dispute.addAndPersistChatMessage(mediatorsDisputeResultMessage);
}
}
- // not dispute requester receives that from arbitrator
+ // not dispute requester receives that from dispute agent
protected void onPeerOpenedDisputeMessage(PeerOpenedDisputeMessage peerOpenedDisputeMessage) {
T disputeList = getDisputeList();
if (disputeList == null) {
@@ -345,17 +372,19 @@ public abstract class DisputeManager storedDisputeOptional = findDispute(dispute);
if (!storedDisputeOptional.isPresent() || reOpen) {
- String disputeInfo = getDisputeInfo(dispute.isMediationDispute());
+ String disputeInfo = getDisputeInfo(dispute);
+ String disputeMessage = getDisputeIntroForDisputeCreator(disputeInfo);
String sysMsg = dispute.isSupportTicket() ?
Res.get("support.youOpenedTicket", disputeInfo, Version.VERSION)
- : Res.get("support.youOpenedDispute", disputeInfo, Version.VERSION);
+ : disputeMessage;
+ String message = Res.get("support.systemMsg", sysMsg);
ChatMessage chatMessage = new ChatMessage(
getSupportType(),
dispute.getTradeId(),
pubKeyRing.hashCode(),
false,
- Res.get("support.systemMsg", sysMsg),
+ message,
p2PService.getAddress());
chatMessage.setSystemMessage(true);
dispute.addAndPersistChatMessage(chatMessage);
@@ -364,15 +393,22 @@ public abstract class DisputeManager storedDisputeOptional = findDispute(dispute);
if (!storedDisputeOptional.isPresent()) {
- String disputeInfo = getDisputeInfo(dispute.isMediationDispute());
+ String disputeInfo = getDisputeInfo(dispute);
+ String disputeMessage = getDisputeIntroForPeer(disputeInfo);
String sysMsg = dispute.isSupportTicket() ?
- Res.get("support.peerOpenedTicket", disputeInfo)
- : Res.get("support.peerOpenedDispute", disputeInfo);
+ Res.get("support.peerOpenedTicket", disputeInfo, Version.VERSION)
+ : disputeMessage;
ChatMessage chatMessage = new ChatMessage(
getSupportType(),
dispute.getTradeId(),
@@ -485,11 +525,12 @@ public abstract class DisputeManager e.getTradeId().equals(tradeId))
.findAny();
}
-
- private String getDisputeInfo(boolean isMediationDispute) {
- String role = isMediationDispute ? Res.get("shared.mediator").toLowerCase() :
- Res.get("shared.arbitrator2").toLowerCase();
- String link = isMediationDispute ? "https://docs.bisq.network/trading-rules.html#mediation" :
- "https://bisq.network/docs/exchange/arbitration-system";
- return Res.get("support.initialInfo", role, role, link);
- }
}
diff --git a/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationDisputeList.java b/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationDisputeList.java
index 5ce8f6b2c7..13f51fecae 100644
--- a/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationDisputeList.java
+++ b/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationDisputeList.java
@@ -18,6 +18,7 @@
package bisq.core.support.dispute.arbitration;
import bisq.core.proto.CoreProtoResolver;
+import bisq.core.support.SupportType;
import bisq.core.support.dispute.Dispute;
import bisq.core.support.dispute.DisputeList;
@@ -33,6 +34,8 @@ import java.util.stream.Collectors;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
+import static com.google.common.base.Preconditions.checkArgument;
+
@Slf4j
@ToString
/*
@@ -67,6 +70,9 @@ public final class ArbitrationDisputeList extends DisputeList checkArgument(dispute.getSupportType().equals(SupportType.ARBITRATION), "Support type has to be ARBITRATION"));
+
return protobuf.PersistableEnvelope.newBuilder().setArbitrationDisputeList(protobuf.ArbitrationDisputeList.newBuilder()
.addAllDispute(ProtoUtil.collectionToProto(new ArrayList<>(list)))).build();
}
@@ -77,7 +83,11 @@ public final class ArbitrationDisputeList extends DisputeList list = proto.getDisputeList().stream()
.map(disputeProto -> Dispute.fromProto(disputeProto, coreProtoResolver))
.collect(Collectors.toList());
- list.forEach(e -> e.setStorage(storage));
+
+ list.forEach(e -> {
+ checkArgument(e.getSupportType().equals(SupportType.ARBITRATION), "Support type has to be ARBITRATION");
+ e.setStorage(storage);
+ });
return new ArbitrationDisputeList(storage, list);
}
}
diff --git a/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationManager.java b/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationManager.java
index cbf859e2a2..233955cfbf 100644
--- a/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationManager.java
+++ b/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationManager.java
@@ -24,6 +24,8 @@ import bisq.core.btc.setup.WalletsSetup;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.btc.wallet.TradeWalletService;
import bisq.core.btc.wallet.TxBroadcaster;
+import bisq.core.btc.wallet.WalletService;
+import bisq.core.locale.Res;
import bisq.core.offer.OpenOffer;
import bisq.core.offer.OpenOfferManager;
import bisq.core.support.SupportType;
@@ -49,6 +51,7 @@ import bisq.network.p2p.SendMailboxMessageListener;
import bisq.common.Timer;
import bisq.common.UserThread;
+import bisq.common.app.Version;
import bisq.common.crypto.PubKeyRing;
import org.bitcoinj.core.AddressFormatException;
@@ -64,6 +67,8 @@ import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
+import javax.annotation.Nullable;
+
import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
@@ -120,9 +125,10 @@ public final class ArbitrationManager extends DisputeManager tradeManager.closeDisputedTrade(tradeId, Trade.DisputeState.DISPUTE_CLOSED));
}
+ @Override
+ protected String getDisputeInfo(Dispute dispute) {
+ String role = Res.get("shared.arbitrator").toLowerCase();
+ String link = "https://docs.bisq.network/trading-rules.html#legacy-arbitration"; //TODO needs to be created
+ return Res.get("support.initialInfo", role, role, link);
+ }
+
+ @Override
+ protected String getDisputeIntroForPeer(String disputeInfo) {
+ return Res.get("support.peerOpenedDispute", disputeInfo, Version.VERSION);
+ }
+
+ @Override
+ protected String getDisputeIntroForDisputeCreator(String disputeInfo) {
+ return Res.get("support.youOpenedDispute", disputeInfo, Version.VERSION);
+ }
///////////////////////////////////////////////////////////////////////////////////////////
// Message handler
@@ -152,7 +174,7 @@ public final class ArbitrationManager extends DisputeManager {
- // The date when mediation is activated
- private static final Date MEDIATION_ACTIVATED_DATE = Utilities.getUTCDate(2019, GregorianCalendar.SEPTEMBER, 26);
-
- public static boolean isMediationActivated() {
- return new Date().after(MEDIATION_ACTIVATED_DATE);
- }
-
-
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
///////////////////////////////////////////////////////////////////////////////////////////
@@ -141,6 +134,22 @@ public final class MediationManager extends DisputeManager
});
}
+ @Override
+ protected String getDisputeInfo(Dispute dispute) {
+ String role = Res.get("shared.mediator").toLowerCase();
+ String link = "https://docs.bisq.network/trading-rules.html#mediation";
+ return Res.get("support.initialInfo", role, role, link);
+ }
+
+ @Override
+ protected String getDisputeIntroForPeer(String disputeInfo) {
+ return Res.get("support.peerOpenedDisputeForMediation", disputeInfo, Version.VERSION);
+ }
+
+ @Override
+ protected String getDisputeIntroForDisputeCreator(String disputeInfo) {
+ return Res.get("support.youOpenedDisputeForMediation", disputeInfo, Version.VERSION);
+ }
///////////////////////////////////////////////////////////////////////////////////////////
// Message handler
@@ -205,6 +214,7 @@ public final class MediationManager extends DisputeManager
// API
///////////////////////////////////////////////////////////////////////////////////////////
+ @Nullable
@Override
public NodeAddress getAgentNodeAddress(Dispute dispute) {
return dispute.getContract().getMediatorNodeAddress();
diff --git a/core/src/main/java/bisq/core/support/dispute/refund/RefundDisputeList.java b/core/src/main/java/bisq/core/support/dispute/refund/RefundDisputeList.java
new file mode 100644
index 0000000000..f344475560
--- /dev/null
+++ b/core/src/main/java/bisq/core/support/dispute/refund/RefundDisputeList.java
@@ -0,0 +1,93 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.support.dispute.refund;
+
+import bisq.core.proto.CoreProtoResolver;
+import bisq.core.support.SupportType;
+import bisq.core.support.dispute.Dispute;
+import bisq.core.support.dispute.DisputeList;
+
+import bisq.common.proto.ProtoUtil;
+import bisq.common.storage.Storage;
+
+import com.google.protobuf.Message;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import lombok.ToString;
+import lombok.extern.slf4j.Slf4j;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+@Slf4j
+@ToString
+/*
+ * Holds a List of refund dispute objects.
+ *
+ * Calls to the List are delegated because this class intercepts the add/remove calls so changes
+ * can be saved to disc.
+ */
+public final class RefundDisputeList extends DisputeList {
+
+ RefundDisputeList(Storage storage) {
+ super(storage);
+ }
+
+ @Override
+ public void readPersisted() {
+ // We need to use DisputeList as file name to not lose existing disputes which are stored in the DisputeList file
+ RefundDisputeList persisted = storage.initAndGetPersisted(this, "RefundDisputeList", 50);
+ if (persisted != null) {
+ list.addAll(persisted.getList());
+ }
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // PROTO BUFFER
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ private RefundDisputeList(Storage storage, List list) {
+ super(storage, list);
+ }
+
+ @Override
+ public Message toProtoMessage() {
+
+ list.forEach(dispute -> checkArgument(dispute.getSupportType().equals(SupportType.REFUND), "Support type has to be REFUND"));
+
+ return protobuf.PersistableEnvelope.newBuilder().setRefundDisputeList(protobuf.RefundDisputeList.newBuilder()
+ .addAllDispute(ProtoUtil.collectionToProto(new ArrayList<>(list)))).build();
+ }
+
+ public static RefundDisputeList fromProto(protobuf.RefundDisputeList proto,
+ CoreProtoResolver coreProtoResolver,
+ Storage storage) {
+ List list = proto.getDisputeList().stream()
+ .map(disputeProto -> Dispute.fromProto(disputeProto, coreProtoResolver))
+ .collect(Collectors.toList());
+
+ list.forEach(e -> {
+ checkArgument(e.getSupportType().equals(SupportType.REFUND), "Support type has to be REFUND");
+ e.setStorage(storage);
+ });
+ return new RefundDisputeList(storage, list);
+ }
+}
diff --git a/core/src/main/java/bisq/core/support/dispute/refund/RefundDisputeListService.java b/core/src/main/java/bisq/core/support/dispute/refund/RefundDisputeListService.java
new file mode 100644
index 0000000000..afdac5c9f3
--- /dev/null
+++ b/core/src/main/java/bisq/core/support/dispute/refund/RefundDisputeListService.java
@@ -0,0 +1,48 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.support.dispute.refund;
+
+import bisq.core.support.dispute.DisputeListService;
+
+import bisq.common.storage.Storage;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+@Singleton
+public final class RefundDisputeListService extends DisputeListService {
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Constructor
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ @Inject
+ public RefundDisputeListService(Storage storage) {
+ super(storage);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Implement template methods
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ @Override
+ protected RefundDisputeList getConcreteDisputeList() {
+ return new RefundDisputeList(storage);
+ }
+}
diff --git a/core/src/main/java/bisq/core/support/dispute/refund/RefundManager.java b/core/src/main/java/bisq/core/support/dispute/refund/RefundManager.java
new file mode 100644
index 0000000000..139832a1c1
--- /dev/null
+++ b/core/src/main/java/bisq/core/support/dispute/refund/RefundManager.java
@@ -0,0 +1,219 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.support.dispute.refund;
+
+import bisq.core.btc.setup.WalletsSetup;
+import bisq.core.btc.wallet.BtcWalletService;
+import bisq.core.btc.wallet.TradeWalletService;
+import bisq.core.locale.Res;
+import bisq.core.offer.OpenOffer;
+import bisq.core.offer.OpenOfferManager;
+import bisq.core.support.SupportType;
+import bisq.core.support.dispute.Dispute;
+import bisq.core.support.dispute.DisputeManager;
+import bisq.core.support.dispute.DisputeResult;
+import bisq.core.support.dispute.messages.DisputeResultMessage;
+import bisq.core.support.dispute.messages.OpenNewDisputeMessage;
+import bisq.core.support.dispute.messages.PeerOpenedDisputeMessage;
+import bisq.core.support.messages.ChatMessage;
+import bisq.core.support.messages.SupportMessage;
+import bisq.core.trade.Trade;
+import bisq.core.trade.TradeManager;
+import bisq.core.trade.closed.ClosedTradableManager;
+
+import bisq.network.p2p.AckMessageSourceType;
+import bisq.network.p2p.NodeAddress;
+import bisq.network.p2p.P2PService;
+
+import bisq.common.Timer;
+import bisq.common.UserThread;
+import bisq.common.app.Version;
+import bisq.common.crypto.PubKeyRing;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import java.util.Optional;
+
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.Nullable;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+@Singleton
+public final class RefundManager extends DisputeManager {
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Constructor
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ @Inject
+ public RefundManager(P2PService p2PService,
+ TradeWalletService tradeWalletService,
+ BtcWalletService walletService,
+ WalletsSetup walletsSetup,
+ TradeManager tradeManager,
+ ClosedTradableManager closedTradableManager,
+ OpenOfferManager openOfferManager,
+ PubKeyRing pubKeyRing,
+ RefundDisputeListService refundDisputeListService) {
+ super(p2PService, tradeWalletService, walletService, walletsSetup, tradeManager, closedTradableManager,
+ openOfferManager, pubKeyRing, refundDisputeListService);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Implement template methods
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ @Override
+ public SupportType getSupportType() {
+ return SupportType.REFUND;
+ }
+
+ @Override
+ public void dispatchMessage(SupportMessage message) {
+ if (canProcessMessage(message)) {
+ log.info("Received {} with tradeId {} and uid {}",
+ message.getClass().getSimpleName(), message.getTradeId(), message.getUid());
+
+ if (message instanceof OpenNewDisputeMessage) {
+ onOpenNewDisputeMessage((OpenNewDisputeMessage) message);
+ } else if (message instanceof PeerOpenedDisputeMessage) {
+ onPeerOpenedDisputeMessage((PeerOpenedDisputeMessage) message);
+ } else if (message instanceof ChatMessage) {
+ onChatMessage((ChatMessage) message);
+ } else if (message instanceof DisputeResultMessage) {
+ onDisputeResultMessage((DisputeResultMessage) message);
+ } else {
+ log.warn("Unsupported message at dispatchMessage. message={}", message);
+ }
+ }
+ }
+
+ @Override
+ protected Trade.DisputeState getDisputeState_StartedByPeer() {
+ return Trade.DisputeState.REFUND_REQUEST_STARTED_BY_PEER;
+ }
+
+ @Override
+ protected AckMessageSourceType getAckMessageSourceType() {
+ return AckMessageSourceType.REFUND_MESSAGE;
+ }
+
+ @Override
+ public void cleanupDisputes() {
+ disputeListService.cleanupDisputes(tradeId -> tradeManager.closeDisputedTrade(tradeId, Trade.DisputeState.REFUND_REQUEST_CLOSED));
+ }
+
+ @Override
+ protected String getDisputeInfo(Dispute dispute) {
+ String role = Res.get("shared.refundAgent").toLowerCase();
+ String link = "https://docs.bisq.network/trading-rules.html#arbitration";
+ return Res.get("support.initialInfo", role, role, link);
+ }
+
+ @Override
+ protected String getDisputeIntroForPeer(String disputeInfo) {
+ return Res.get("support.peerOpenedDispute", disputeInfo, Version.VERSION);
+ }
+
+ @Override
+ protected String getDisputeIntroForDisputeCreator(String disputeInfo) {
+ return Res.get("support.youOpenedDispute", disputeInfo, Version.VERSION);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Message handler
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ @Override
+ // We get that message at both peers. The dispute object is in context of the trader
+ public void onDisputeResultMessage(DisputeResultMessage disputeResultMessage) {
+ DisputeResult disputeResult = disputeResultMessage.getDisputeResult();
+ String tradeId = disputeResult.getTradeId();
+ ChatMessage chatMessage = disputeResult.getChatMessage();
+ checkNotNull(chatMessage, "chatMessage must not be null");
+ Optional disputeOptional = findDispute(disputeResult);
+ String uid = disputeResultMessage.getUid();
+ if (!disputeOptional.isPresent()) {
+ log.warn("We got a dispute result msg but we don't have a matching dispute. " +
+ "That might happen when we get the disputeResultMessage before the dispute was created. " +
+ "We try again after 2 sec. to apply the disputeResultMessage. TradeId = " + tradeId);
+ if (!delayMsgMap.containsKey(uid)) {
+ // We delay 2 sec. to be sure the comm. msg gets added first
+ Timer timer = UserThread.runAfter(() -> onDisputeResultMessage(disputeResultMessage), 2);
+ delayMsgMap.put(uid, timer);
+ } else {
+ log.warn("We got a dispute result msg after we already repeated to apply the message after a delay. " +
+ "That should never happen. TradeId = " + tradeId);
+ }
+ return;
+ }
+
+ Dispute dispute = disputeOptional.get();
+ cleanupRetryMap(uid);
+ if (!dispute.getChatMessages().contains(chatMessage)) {
+ dispute.addAndPersistChatMessage(chatMessage);
+ } else {
+ log.warn("We got a dispute mail msg what we have already stored. TradeId = " + chatMessage.getTradeId());
+ }
+ dispute.setIsClosed(true);
+
+ if (dispute.disputeResultProperty().get() != null) {
+ log.warn("We got already a dispute result. That should only happen if a dispute needs to be closed " +
+ "again because the first close did not succeed. TradeId = " + tradeId);
+ }
+
+ dispute.setDisputeResult(disputeResult);
+
+ Optional tradeOptional = tradeManager.getTradeById(tradeId);
+ if (tradeOptional.isPresent()) {
+ Trade trade = tradeOptional.get();
+ if (trade.getDisputeState() == Trade.DisputeState.REFUND_REQUESTED ||
+ trade.getDisputeState() == Trade.DisputeState.REFUND_REQUEST_STARTED_BY_PEER) {
+ trade.setDisputeState(Trade.DisputeState.REFUND_REQUEST_CLOSED);
+ }
+ } else {
+ Optional openOfferOptional = openOfferManager.getOpenOfferById(tradeId);
+ openOfferOptional.ifPresent(openOffer -> openOfferManager.closeOpenOffer(openOffer.getOffer()));
+ }
+ sendAckMessage(chatMessage, dispute.getAgentPubKeyRing(), true, null);
+
+ // set state after payout as we call swapTradeEntryToAvailableEntry
+ if (tradeManager.getTradeById(tradeId).isPresent()) {
+ tradeManager.closeDisputedTrade(tradeId, Trade.DisputeState.REFUND_REQUEST_CLOSED);
+ } else {
+ Optional openOfferOptional = openOfferManager.getOpenOfferById(tradeId);
+ openOfferOptional.ifPresent(openOffer -> openOfferManager.closeOpenOffer(openOffer.getOffer()));
+ }
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // API
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ @Nullable
+ @Override
+ public NodeAddress getAgentNodeAddress(Dispute dispute) {
+ return dispute.getContract().getRefundAgentNodeAddress();
+ }
+}
diff --git a/core/src/main/java/bisq/core/support/dispute/refund/RefundResultState.java b/core/src/main/java/bisq/core/support/dispute/refund/RefundResultState.java
new file mode 100644
index 0000000000..1664b733bc
--- /dev/null
+++ b/core/src/main/java/bisq/core/support/dispute/refund/RefundResultState.java
@@ -0,0 +1,33 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.support.dispute.refund;
+
+import bisq.common.proto.ProtoUtil;
+
+// todo
+public enum RefundResultState {
+ UNDEFINED_REFUND_RESULT;
+
+ public static RefundResultState fromProto(protobuf.RefundResultState refundResultState) {
+ return ProtoUtil.enumFromProto(RefundResultState.class, refundResultState.name());
+ }
+
+ public static protobuf.RefundResultState toProtoMessage(RefundResultState refundResultState) {
+ return protobuf.RefundResultState.valueOf(refundResultState.name());
+ }
+}
diff --git a/core/src/main/java/bisq/core/support/dispute/refund/RefundSession.java b/core/src/main/java/bisq/core/support/dispute/refund/RefundSession.java
new file mode 100644
index 0000000000..b5e9d7e5cc
--- /dev/null
+++ b/core/src/main/java/bisq/core/support/dispute/refund/RefundSession.java
@@ -0,0 +1,33 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.support.dispute.refund;
+
+import bisq.core.support.dispute.Dispute;
+import bisq.core.support.dispute.DisputeSession;
+
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.Nullable;
+
+@Slf4j
+public class RefundSession extends DisputeSession {
+
+ public RefundSession(@Nullable Dispute dispute, boolean isTrader) {
+ super(dispute, isTrader);
+ }
+}
diff --git a/core/src/main/java/bisq/core/support/dispute/refund/refundagent/RefundAgent.java b/core/src/main/java/bisq/core/support/dispute/refund/refundagent/RefundAgent.java
new file mode 100644
index 0000000000..268506d06d
--- /dev/null
+++ b/core/src/main/java/bisq/core/support/dispute/refund/refundagent/RefundAgent.java
@@ -0,0 +1,117 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.support.dispute.refund.refundagent;
+
+import bisq.core.support.dispute.agent.DisputeAgent;
+
+import bisq.network.p2p.NodeAddress;
+import bisq.network.p2p.storage.payload.CapabilityRequiringPayload;
+
+import bisq.common.app.Capabilities;
+import bisq.common.app.Capability;
+import bisq.common.crypto.PubKeyRing;
+import bisq.common.proto.ProtoUtil;
+
+import com.google.protobuf.ByteString;
+
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.Nullable;
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Getter
+public final class RefundAgent extends DisputeAgent implements CapabilityRequiringPayload {
+
+ public RefundAgent(NodeAddress nodeAddress,
+ PubKeyRing pubKeyRing,
+ List languageCodes,
+ long registrationDate,
+ byte[] registrationPubKey,
+ String registrationSignature,
+ @Nullable String emailAddress,
+ @Nullable String info,
+ @Nullable Map extraDataMap) {
+
+ super(nodeAddress,
+ pubKeyRing,
+ languageCodes,
+ registrationDate,
+ registrationPubKey,
+ registrationSignature,
+ emailAddress,
+ info,
+ extraDataMap);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // PROTO BUFFER
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ @Override
+ public protobuf.StoragePayload toProtoMessage() {
+ protobuf.RefundAgent.Builder builder = protobuf.RefundAgent.newBuilder()
+ .setNodeAddress(nodeAddress.toProtoMessage())
+ .setPubKeyRing(pubKeyRing.toProtoMessage())
+ .addAllLanguageCodes(languageCodes)
+ .setRegistrationDate(registrationDate)
+ .setRegistrationPubKey(ByteString.copyFrom(registrationPubKey))
+ .setRegistrationSignature(registrationSignature);
+ Optional.ofNullable(emailAddress).ifPresent(builder::setEmailAddress);
+ Optional.ofNullable(info).ifPresent(builder::setInfo);
+ Optional.ofNullable(extraDataMap).ifPresent(builder::putAllExtraData);
+ return protobuf.StoragePayload.newBuilder().setRefundAgent(builder).build();
+ }
+
+ public static RefundAgent fromProto(protobuf.RefundAgent proto) {
+ return new RefundAgent(NodeAddress.fromProto(proto.getNodeAddress()),
+ PubKeyRing.fromProto(proto.getPubKeyRing()),
+ new ArrayList<>(proto.getLanguageCodesList()),
+ proto.getRegistrationDate(),
+ proto.getRegistrationPubKey().toByteArray(),
+ proto.getRegistrationSignature(),
+ ProtoUtil.stringOrNullFromProto(proto.getEmailAddress()),
+ ProtoUtil.stringOrNullFromProto(proto.getInfo()),
+ CollectionUtils.isEmpty(proto.getExtraDataMap()) ? null : proto.getExtraDataMap());
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // API
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+
+ @Override
+ public String toString() {
+ return "RefundAgent{} " + super.toString();
+ }
+
+ @Override
+ public Capabilities getRequiredCapabilities() {
+ return new Capabilities(Capability.REFUND_AGENT);
+ }
+}
diff --git a/core/src/main/java/bisq/core/support/dispute/refund/refundagent/RefundAgentManager.java b/core/src/main/java/bisq/core/support/dispute/refund/refundagent/RefundAgentManager.java
new file mode 100644
index 0000000000..d13560f3df
--- /dev/null
+++ b/core/src/main/java/bisq/core/support/dispute/refund/refundagent/RefundAgentManager.java
@@ -0,0 +1,105 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.support.dispute.refund.refundagent;
+
+import bisq.core.app.AppOptionKeys;
+import bisq.core.filter.FilterManager;
+import bisq.core.support.dispute.agent.DisputeAgentManager;
+import bisq.core.user.User;
+
+import bisq.network.p2p.storage.payload.ProtectedStorageEntry;
+
+import bisq.common.crypto.KeyRing;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+
+import java.util.List;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Singleton
+public class RefundAgentManager extends DisputeAgentManager {
+
+ @Inject
+ public RefundAgentManager(KeyRing keyRing,
+ RefundAgentService refundAgentService,
+ User user,
+ FilterManager filterManager,
+ @Named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS) boolean useDevPrivilegeKeys) {
+ super(keyRing, refundAgentService, user, filterManager, useDevPrivilegeKeys);
+ }
+
+ @Override
+ protected List getPubKeyList() {
+ return List.of("02a25798e256b800d7ea71c31098ac9a47cb20892176afdfeb051f5ded382d44af",
+ "0360455d3cffe00ef73cc1284c84eedacc8c5c3374c43f4aac8ffb95f5130b9ef5",
+ "03b0513afbb531bc4551b379eba027feddd33c92b5990fd477b0fa6eff90a5b7db",
+ "03533fd75fda29c351298e50b8ea696656dcb8ce4e263d10618c6901a50450bf0e",
+ "028124436482aa4c61a4bc4097d60c80b09f4285413be3b023a37a0164cbd5d818",
+ "0384fcf883116d8e9469720ed7808cc4141f6dc6a5ed23d76dd48f2f5f255590d7",
+ "029bd318ecee4e212ff06a4396770d600d72e9e0c6532142a428bdb401491e9721",
+ "02e375b4b24d0a858953f7f94666667554d41f78000b9c8a301294223688b29011",
+ "0232c088ae7c070de89d2b6c8d485b34bf0e3b2a964a2c6622f39ca501260c23f7",
+ "033e047f74f2aa1ce41e8c85731f97ab83d448d65dc8518ab3df4474a5d53a3d19",
+ "02f52a8cf373c8cbddb318e523b7f111168bf753fdfb6f8aa81f88c950ede3a5ce",
+ "039784029922c54bcd0f0e7f14530f586053a5f4e596e86b3474cd7404657088ae",
+ "037969f9d5ab2cc609104c6e61323df55428f8f108c11aab7c7b5f953081d39304",
+ "031bd37475b8c5615ac46d6816e791c59d806d72a0bc6739ae94e5fe4545c7f8a6",
+ "021bb92c636feacf5b082313eb071a63dfcd26501a48b3cd248e35438e5afb7daf");
+
+
+ }
+
+ @Override
+ protected boolean isExpectedInstance(ProtectedStorageEntry data) {
+ return data.getProtectedStoragePayload() instanceof RefundAgent;
+ }
+
+ @Override
+ protected void addAcceptedDisputeAgentToUser(RefundAgent disputeAgent) {
+ user.addAcceptedRefundAgent(disputeAgent);
+ }
+
+ @Override
+ protected void removeAcceptedDisputeAgentFromUser(ProtectedStorageEntry data) {
+ user.removeAcceptedRefundAgent((RefundAgent) data.getProtectedStoragePayload());
+ }
+
+ @Override
+ protected List getAcceptedDisputeAgentsFromUser() {
+ return user.getAcceptedRefundAgents();
+ }
+
+ @Override
+ protected void clearAcceptedDisputeAgentsAtUser() {
+ user.clearAcceptedRefundAgents();
+ }
+
+ @Override
+ protected RefundAgent getRegisteredDisputeAgentFromUser() {
+ return user.getRegisteredRefundAgent();
+ }
+
+ @Override
+ protected void setRegisteredDisputeAgentAtUser(RefundAgent disputeAgent) {
+ user.setRegisteredRefundAgent(disputeAgent);
+ }
+}
diff --git a/core/src/main/java/bisq/core/support/dispute/refund/refundagent/RefundAgentService.java b/core/src/main/java/bisq/core/support/dispute/refund/refundagent/RefundAgentService.java
new file mode 100644
index 0000000000..ab67223e98
--- /dev/null
+++ b/core/src/main/java/bisq/core/support/dispute/refund/refundagent/RefundAgentService.java
@@ -0,0 +1,61 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.support.dispute.refund.refundagent;
+
+import bisq.core.filter.FilterManager;
+import bisq.core.support.dispute.agent.DisputeAgentService;
+
+import bisq.network.p2p.NodeAddress;
+import bisq.network.p2p.P2PService;
+
+import com.google.inject.Singleton;
+
+import javax.inject.Inject;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Singleton
+public class RefundAgentService extends DisputeAgentService {
+ @Inject
+ public RefundAgentService(P2PService p2PService, FilterManager filterManager) {
+ super(p2PService, filterManager);
+ }
+
+ @Override
+ protected Set getDisputeAgentSet(List bannedDisputeAgents) {
+ return p2PService.getDataMap().values().stream()
+ .filter(data -> data.getProtectedStoragePayload() instanceof RefundAgent)
+ .map(data -> (RefundAgent) data.getProtectedStoragePayload())
+ .filter(a -> bannedDisputeAgents == null ||
+ !bannedDisputeAgents.contains(a.getNodeAddress().getFullAddress()))
+ .collect(Collectors.toSet());
+ }
+
+ @Override
+ protected List getDisputeAgentsFromFilter() {
+ return filterManager.getFilter() != null ? filterManager.getFilter().getRefundAgents() : new ArrayList<>();
+ }
+
+ public Map getRefundAgents() {
+ return super.getDisputeAgents();
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/BuyerAsMakerTrade.java b/core/src/main/java/bisq/core/trade/BuyerAsMakerTrade.java
index 17eeca7a7a..e6cecc1e4f 100644
--- a/core/src/main/java/bisq/core/trade/BuyerAsMakerTrade.java
+++ b/core/src/main/java/bisq/core/trade/BuyerAsMakerTrade.java
@@ -20,7 +20,7 @@ package bisq.core.trade;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.offer.Offer;
import bisq.core.proto.CoreProtoResolver;
-import bisq.core.trade.messages.TradeMessage;
+import bisq.core.trade.messages.InputsForDepositTxRequest;
import bisq.core.trade.protocol.BuyerAsMakerProtocol;
import bisq.core.trade.protocol.MakerProtocol;
@@ -48,6 +48,7 @@ public final class BuyerAsMakerTrade extends BuyerTrade implements MakerTrade {
boolean isCurrencyForTakerFeeBtc,
@Nullable NodeAddress arbitratorNodeAddress,
@Nullable NodeAddress mediatorNodeAddress,
+ @Nullable NodeAddress refundAgentNodeAddress,
Storage extends TradableList> storage,
BtcWalletService btcWalletService) {
super(offer,
@@ -56,6 +57,7 @@ public final class BuyerAsMakerTrade extends BuyerTrade implements MakerTrade {
isCurrencyForTakerFeeBtc,
arbitratorNodeAddress,
mediatorNodeAddress,
+ refundAgentNodeAddress,
storage,
btcWalletService);
}
@@ -84,6 +86,7 @@ public final class BuyerAsMakerTrade extends BuyerTrade implements MakerTrade {
proto.getIsCurrencyForTakerFeeBtc(),
proto.hasArbitratorNodeAddress() ? NodeAddress.fromProto(proto.getArbitratorNodeAddress()) : null,
proto.hasMediatorNodeAddress() ? NodeAddress.fromProto(proto.getMediatorNodeAddress()) : null,
+ proto.hasRefundAgentNodeAddress() ? NodeAddress.fromProto(proto.getRefundAgentNodeAddress()) : null,
storage,
btcWalletService);
@@ -107,7 +110,7 @@ public final class BuyerAsMakerTrade extends BuyerTrade implements MakerTrade {
}
@Override
- public void handleTakeOfferRequest(TradeMessage message,
+ public void handleTakeOfferRequest(InputsForDepositTxRequest message,
NodeAddress taker,
ErrorMessageHandler errorMessageHandler) {
((MakerProtocol) tradeProtocol).handleTakeOfferRequest(message, taker, errorMessageHandler);
diff --git a/core/src/main/java/bisq/core/trade/BuyerAsTakerTrade.java b/core/src/main/java/bisq/core/trade/BuyerAsTakerTrade.java
index c4c2c1e776..d9b5f86c29 100644
--- a/core/src/main/java/bisq/core/trade/BuyerAsTakerTrade.java
+++ b/core/src/main/java/bisq/core/trade/BuyerAsTakerTrade.java
@@ -51,6 +51,7 @@ public final class BuyerAsTakerTrade extends BuyerTrade implements TakerTrade {
NodeAddress tradingPeerNodeAddress,
@Nullable NodeAddress arbitratorNodeAddress,
@Nullable NodeAddress mediatorNodeAddress,
+ @Nullable NodeAddress refundAgentNodeAddress,
Storage extends TradableList> storage,
BtcWalletService btcWalletService) {
super(offer,
@@ -62,6 +63,7 @@ public final class BuyerAsTakerTrade extends BuyerTrade implements TakerTrade {
tradingPeerNodeAddress,
arbitratorNodeAddress,
mediatorNodeAddress,
+ refundAgentNodeAddress,
storage,
btcWalletService);
}
@@ -94,6 +96,7 @@ public final class BuyerAsTakerTrade extends BuyerTrade implements TakerTrade {
proto.hasTradingPeerNodeAddress() ? NodeAddress.fromProto(proto.getTradingPeerNodeAddress()) : null,
proto.hasArbitratorNodeAddress() ? NodeAddress.fromProto(proto.getArbitratorNodeAddress()) : null,
proto.hasMediatorNodeAddress() ? NodeAddress.fromProto(proto.getMediatorNodeAddress()) : null,
+ proto.hasRefundAgentNodeAddress() ? NodeAddress.fromProto(proto.getRefundAgentNodeAddress()) : null,
storage,
btcWalletService),
proto,
diff --git a/core/src/main/java/bisq/core/trade/BuyerTrade.java b/core/src/main/java/bisq/core/trade/BuyerTrade.java
index 4c534b30f0..4112252e6d 100644
--- a/core/src/main/java/bisq/core/trade/BuyerTrade.java
+++ b/core/src/main/java/bisq/core/trade/BuyerTrade.java
@@ -47,6 +47,7 @@ public abstract class BuyerTrade extends Trade {
NodeAddress tradingPeerNodeAddress,
@Nullable NodeAddress arbitratorNodeAddress,
@Nullable NodeAddress mediatorNodeAddress,
+ @Nullable NodeAddress refundAgentNodeAddress,
Storage extends TradableList> storage,
BtcWalletService btcWalletService) {
super(offer,
@@ -58,6 +59,7 @@ public abstract class BuyerTrade extends Trade {
tradingPeerNodeAddress,
arbitratorNodeAddress,
mediatorNodeAddress,
+ refundAgentNodeAddress,
storage,
btcWalletService);
}
@@ -68,6 +70,7 @@ public abstract class BuyerTrade extends Trade {
boolean isCurrencyForTakerFeeBtc,
@Nullable NodeAddress arbitratorNodeAddress,
@Nullable NodeAddress mediatorNodeAddress,
+ @Nullable NodeAddress refundAgentNodeAddress,
Storage extends TradableList> storage,
BtcWalletService btcWalletService) {
super(offer,
@@ -76,6 +79,7 @@ public abstract class BuyerTrade extends Trade {
isCurrencyForTakerFeeBtc,
arbitratorNodeAddress,
mediatorNodeAddress,
+ refundAgentNodeAddress,
storage,
btcWalletService);
}
diff --git a/core/src/main/java/bisq/core/trade/Contract.java b/core/src/main/java/bisq/core/trade/Contract.java
index 6ec2e57394..65a8b00d9f 100644
--- a/core/src/main/java/bisq/core/trade/Contract.java
+++ b/core/src/main/java/bisq/core/trade/Contract.java
@@ -55,7 +55,6 @@ public final class Contract implements NetworkPayload {
private final String takerFeeTxID;
private final NodeAddress buyerNodeAddress;
private final NodeAddress sellerNodeAddress;
- private final NodeAddress arbitratorNodeAddress;
private final NodeAddress mediatorNodeAddress;
private final boolean isBuyerMakerAndSellerTaker;
private final String makerAccountId;
@@ -73,13 +72,16 @@ public final class Contract implements NetworkPayload {
@JsonExclude
private final byte[] takerMultiSigPubKey;
+ // Added in v1.2.0
+ private long lockTime;
+ private final NodeAddress refundAgentNodeAddress;
+
public Contract(OfferPayload offerPayload,
long tradeAmount,
long tradePrice,
String takerFeeTxID,
NodeAddress buyerNodeAddress,
NodeAddress sellerNodeAddress,
- NodeAddress arbitratorNodeAddress,
NodeAddress mediatorNodeAddress,
boolean isBuyerMakerAndSellerTaker,
String makerAccountId,
@@ -91,14 +93,15 @@ public final class Contract implements NetworkPayload {
String makerPayoutAddressString,
String takerPayoutAddressString,
byte[] makerMultiSigPubKey,
- byte[] takerMultiSigPubKey) {
+ byte[] takerMultiSigPubKey,
+ long lockTime,
+ NodeAddress refundAgentNodeAddress) {
this.offerPayload = offerPayload;
this.tradeAmount = tradeAmount;
this.tradePrice = tradePrice;
this.takerFeeTxID = takerFeeTxID;
this.buyerNodeAddress = buyerNodeAddress;
this.sellerNodeAddress = sellerNodeAddress;
- this.arbitratorNodeAddress = arbitratorNodeAddress;
this.mediatorNodeAddress = mediatorNodeAddress;
this.isBuyerMakerAndSellerTaker = isBuyerMakerAndSellerTaker;
this.makerAccountId = makerAccountId;
@@ -111,6 +114,8 @@ public final class Contract implements NetworkPayload {
this.takerPayoutAddressString = takerPayoutAddressString;
this.makerMultiSigPubKey = makerMultiSigPubKey;
this.takerMultiSigPubKey = takerMultiSigPubKey;
+ this.lockTime = lockTime;
+ this.refundAgentNodeAddress = refundAgentNodeAddress;
String makerPaymentMethodId = makerPaymentAccountPayload.getPaymentMethodId();
String takerPaymentMethodId = takerPaymentAccountPayload.getPaymentMethodId();
@@ -128,7 +133,6 @@ public final class Contract implements NetworkPayload {
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
- @Nullable
public static Contract fromProto(protobuf.Contract proto, CoreProtoResolver coreProtoResolver) {
return new Contract(OfferPayload.fromProto(proto.getOfferPayload()),
proto.getTradeAmount(),
@@ -136,7 +140,6 @@ public final class Contract implements NetworkPayload {
proto.getTakerFeeTxId(),
NodeAddress.fromProto(proto.getBuyerNodeAddress()),
NodeAddress.fromProto(proto.getSellerNodeAddress()),
- NodeAddress.fromProto(proto.getArbitratorNodeAddress()),
NodeAddress.fromProto(proto.getMediatorNodeAddress()),
proto.getIsBuyerMakerAndSellerTaker(),
proto.getMakerAccountId(),
@@ -148,7 +151,9 @@ public final class Contract implements NetworkPayload {
proto.getMakerPayoutAddressString(),
proto.getTakerPayoutAddressString(),
proto.getMakerMultiSigPubKey().toByteArray(),
- proto.getTakerMultiSigPubKey().toByteArray());
+ proto.getTakerMultiSigPubKey().toByteArray(),
+ proto.getLockTime(),
+ NodeAddress.fromProto(proto.getRefundAgentNodeAddress()));
}
@Override
@@ -160,7 +165,6 @@ public final class Contract implements NetworkPayload {
.setTakerFeeTxId(takerFeeTxID)
.setBuyerNodeAddress(buyerNodeAddress.toProtoMessage())
.setSellerNodeAddress(sellerNodeAddress.toProtoMessage())
- .setArbitratorNodeAddress(arbitratorNodeAddress.toProtoMessage())
.setMediatorNodeAddress(mediatorNodeAddress.toProtoMessage())
.setIsBuyerMakerAndSellerTaker(isBuyerMakerAndSellerTaker)
.setMakerAccountId(makerAccountId)
@@ -173,6 +177,8 @@ public final class Contract implements NetworkPayload {
.setTakerPayoutAddressString(takerPayoutAddressString)
.setMakerMultiSigPubKey(ByteString.copyFrom(makerMultiSigPubKey))
.setTakerMultiSigPubKey(ByteString.copyFrom(takerMultiSigPubKey))
+ .setLockTime(lockTime)
+ .setRefundAgentNodeAddress(refundAgentNodeAddress.toProtoMessage())
.build();
}
@@ -289,8 +295,8 @@ public final class Contract implements NetworkPayload {
",\n takerFeeTxID='" + takerFeeTxID + '\'' +
",\n buyerNodeAddress=" + buyerNodeAddress +
",\n sellerNodeAddress=" + sellerNodeAddress +
- ",\n arbitratorNodeAddress=" + arbitratorNodeAddress +
",\n mediatorNodeAddress=" + mediatorNodeAddress +
+ ",\n refundAgentNodeAddress=" + refundAgentNodeAddress +
",\n isBuyerMakerAndSellerTaker=" + isBuyerMakerAndSellerTaker +
",\n makerAccountId='" + makerAccountId + '\'' +
",\n takerAccountId='" + takerAccountId + '\'' +
@@ -304,6 +310,7 @@ public final class Contract implements NetworkPayload {
",\n takerMultiSigPubKey=" + Utilities.bytesAsHexString(takerMultiSigPubKey) +
",\n buyerMultiSigPubKey=" + Utilities.bytesAsHexString(getBuyerMultiSigPubKey()) +
",\n sellerMultiSigPubKey=" + Utilities.bytesAsHexString(getSellerMultiSigPubKey()) +
+ ",\n lockTime=" + lockTime +
"\n}";
}
}
diff --git a/core/src/main/java/bisq/core/trade/MakerTrade.java b/core/src/main/java/bisq/core/trade/MakerTrade.java
index ffb5b67289..5a2fd7dd8d 100644
--- a/core/src/main/java/bisq/core/trade/MakerTrade.java
+++ b/core/src/main/java/bisq/core/trade/MakerTrade.java
@@ -17,12 +17,12 @@
package bisq.core.trade;
-import bisq.core.trade.messages.TradeMessage;
+import bisq.core.trade.messages.InputsForDepositTxRequest;
import bisq.network.p2p.NodeAddress;
import bisq.common.handlers.ErrorMessageHandler;
public interface MakerTrade {
- void handleTakeOfferRequest(TradeMessage message, NodeAddress peerNodeAddress, ErrorMessageHandler errorMessageHandler);
+ void handleTakeOfferRequest(InputsForDepositTxRequest message, NodeAddress peerNodeAddress, ErrorMessageHandler errorMessageHandler);
}
diff --git a/core/src/main/java/bisq/core/trade/SellerAsMakerTrade.java b/core/src/main/java/bisq/core/trade/SellerAsMakerTrade.java
index 08fb2f46ca..5e9b5883f9 100644
--- a/core/src/main/java/bisq/core/trade/SellerAsMakerTrade.java
+++ b/core/src/main/java/bisq/core/trade/SellerAsMakerTrade.java
@@ -20,7 +20,7 @@ package bisq.core.trade;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.offer.Offer;
import bisq.core.proto.CoreProtoResolver;
-import bisq.core.trade.messages.TradeMessage;
+import bisq.core.trade.messages.InputsForDepositTxRequest;
import bisq.core.trade.protocol.MakerProtocol;
import bisq.core.trade.protocol.SellerAsMakerProtocol;
@@ -48,9 +48,18 @@ public final class SellerAsMakerTrade extends SellerTrade implements MakerTrade
boolean isCurrencyForTakerFeeBtc,
@Nullable NodeAddress arbitratorNodeAddress,
@Nullable NodeAddress mediatorNodeAddress,
+ @Nullable NodeAddress refundAgentNodeAddress,
Storage extends TradableList> storage,
BtcWalletService btcWalletService) {
- super(offer, txFee, takerFee, isCurrencyForTakerFeeBtc, arbitratorNodeAddress, mediatorNodeAddress, storage, btcWalletService);
+ super(offer,
+ txFee,
+ takerFee,
+ isCurrencyForTakerFeeBtc,
+ arbitratorNodeAddress,
+ mediatorNodeAddress,
+ refundAgentNodeAddress,
+ storage,
+ btcWalletService);
}
@@ -78,6 +87,7 @@ public final class SellerAsMakerTrade extends SellerTrade implements MakerTrade
proto.getIsCurrencyForTakerFeeBtc(),
proto.hasArbitratorNodeAddress() ? NodeAddress.fromProto(proto.getArbitratorNodeAddress()) : null,
proto.hasMediatorNodeAddress() ? NodeAddress.fromProto(proto.getMediatorNodeAddress()) : null,
+ proto.hasRefundAgentNodeAddress() ? NodeAddress.fromProto(proto.getRefundAgentNodeAddress()) : null,
storage,
btcWalletService);
@@ -101,7 +111,7 @@ public final class SellerAsMakerTrade extends SellerTrade implements MakerTrade
}
@Override
- public void handleTakeOfferRequest(TradeMessage message, NodeAddress taker, ErrorMessageHandler errorMessageHandler) {
+ public void handleTakeOfferRequest(InputsForDepositTxRequest message, NodeAddress taker, ErrorMessageHandler errorMessageHandler) {
((MakerProtocol) tradeProtocol).handleTakeOfferRequest(message, taker, errorMessageHandler);
}
}
diff --git a/core/src/main/java/bisq/core/trade/SellerAsTakerTrade.java b/core/src/main/java/bisq/core/trade/SellerAsTakerTrade.java
index 0d4aeb6b84..79debd8137 100644
--- a/core/src/main/java/bisq/core/trade/SellerAsTakerTrade.java
+++ b/core/src/main/java/bisq/core/trade/SellerAsTakerTrade.java
@@ -51,6 +51,7 @@ public final class SellerAsTakerTrade extends SellerTrade implements TakerTrade
NodeAddress tradingPeerNodeAddress,
@Nullable NodeAddress arbitratorNodeAddress,
@Nullable NodeAddress mediatorNodeAddress,
+ @Nullable NodeAddress refundAgentNodeAddress,
Storage extends TradableList> storage,
BtcWalletService btcWalletService) {
super(offer,
@@ -62,6 +63,7 @@ public final class SellerAsTakerTrade extends SellerTrade implements TakerTrade
tradingPeerNodeAddress,
arbitratorNodeAddress,
mediatorNodeAddress,
+ refundAgentNodeAddress,
storage,
btcWalletService);
}
@@ -94,6 +96,7 @@ public final class SellerAsTakerTrade extends SellerTrade implements TakerTrade
proto.hasTradingPeerNodeAddress() ? NodeAddress.fromProto(proto.getTradingPeerNodeAddress()) : null,
proto.hasArbitratorNodeAddress() ? NodeAddress.fromProto(proto.getArbitratorNodeAddress()) : null,
proto.hasMediatorNodeAddress() ? NodeAddress.fromProto(proto.getMediatorNodeAddress()) : null,
+ proto.hasRefundAgentNodeAddress() ? NodeAddress.fromProto(proto.getRefundAgentNodeAddress()) : null,
storage,
btcWalletService),
proto,
diff --git a/core/src/main/java/bisq/core/trade/SellerTrade.java b/core/src/main/java/bisq/core/trade/SellerTrade.java
index 629dc5adb5..68eed3a1e0 100644
--- a/core/src/main/java/bisq/core/trade/SellerTrade.java
+++ b/core/src/main/java/bisq/core/trade/SellerTrade.java
@@ -46,6 +46,7 @@ public abstract class SellerTrade extends Trade {
NodeAddress tradingPeerNodeAddress,
@Nullable NodeAddress arbitratorNodeAddress,
@Nullable NodeAddress mediatorNodeAddress,
+ @Nullable NodeAddress refundAgentNodeAddress,
Storage extends TradableList> storage,
BtcWalletService btcWalletService) {
super(offer,
@@ -57,6 +58,7 @@ public abstract class SellerTrade extends Trade {
tradingPeerNodeAddress,
arbitratorNodeAddress,
mediatorNodeAddress,
+ refundAgentNodeAddress,
storage,
btcWalletService);
}
@@ -67,6 +69,7 @@ public abstract class SellerTrade extends Trade {
boolean isCurrencyForTakerFeeBtc,
@Nullable NodeAddress arbitratorNodeAddress,
@Nullable NodeAddress mediatorNodeAddress,
+ @Nullable NodeAddress refundAgentNodeAddress,
Storage extends TradableList> storage,
BtcWalletService btcWalletService) {
super(offer,
@@ -75,6 +78,7 @@ public abstract class SellerTrade extends Trade {
isCurrencyForTakerFeeBtc,
arbitratorNodeAddress,
mediatorNodeAddress,
+ refundAgentNodeAddress,
storage,
btcWalletService);
}
diff --git a/core/src/main/java/bisq/core/trade/Trade.java b/core/src/main/java/bisq/core/trade/Trade.java
index a86ea93fa7..7006fba886 100644
--- a/core/src/main/java/bisq/core/trade/Trade.java
+++ b/core/src/main/java/bisq/core/trade/Trade.java
@@ -21,6 +21,7 @@ import bisq.core.account.witness.AccountAgeWitnessService;
import bisq.core.btc.wallet.BsqWalletService;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.btc.wallet.TradeWalletService;
+import bisq.core.dao.DaoFacade;
import bisq.core.filter.FilterManager;
import bisq.core.locale.CurrencyUtil;
import bisq.core.monetary.Price;
@@ -34,6 +35,8 @@ import bisq.core.support.dispute.arbitration.arbitrator.Arbitrator;
import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager;
import bisq.core.support.dispute.mediation.MediationResultState;
import bisq.core.support.dispute.mediation.mediator.MediatorManager;
+import bisq.core.support.dispute.refund.RefundResultState;
+import bisq.core.support.dispute.refund.refundagent.RefundAgentManager;
import bisq.core.support.messages.ChatMessage;
import bisq.core.trade.protocol.ProcessModel;
import bisq.core.trade.protocol.TradeProtocol;
@@ -114,7 +117,7 @@ public abstract class Trade implements Tradable, Model {
// maker perspective
MAKER_SENT_PUBLISH_DEPOSIT_TX_REQUEST(Phase.TAKER_FEE_PUBLISHED),
MAKER_SAW_ARRIVED_PUBLISH_DEPOSIT_TX_REQUEST(Phase.TAKER_FEE_PUBLISHED),
- MAKER_STORED_IN_MAILBOX_PUBLISH_DEPOSIT_TX_REQUEST(Phase.TAKER_FEE_PUBLISHED),
+ MAKER_STORED_IN_MAILBOX_PUBLISH_DEPOSIT_TX_REQUEST(Phase.TAKER_FEE_PUBLISHED), //todo remove
MAKER_SEND_FAILED_PUBLISH_DEPOSIT_TX_REQUEST(Phase.TAKER_FEE_PUBLISHED),
// taker perspective
@@ -122,21 +125,21 @@ public abstract class Trade implements Tradable, Model {
// #################### Phase DEPOSIT_PAID
- TAKER_PUBLISHED_DEPOSIT_TX(Phase.DEPOSIT_PUBLISHED),
+ SELLER_PUBLISHED_DEPOSIT_TX(Phase.DEPOSIT_PUBLISHED),
// DEPOSIT_TX_PUBLISHED_MSG
- // taker perspective
- TAKER_SENT_DEPOSIT_TX_PUBLISHED_MSG(Phase.DEPOSIT_PUBLISHED),
- TAKER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG(Phase.DEPOSIT_PUBLISHED),
- TAKER_STORED_IN_MAILBOX_DEPOSIT_TX_PUBLISHED_MSG(Phase.DEPOSIT_PUBLISHED),
- TAKER_SEND_FAILED_DEPOSIT_TX_PUBLISHED_MSG(Phase.DEPOSIT_PUBLISHED),
+ // seller perspective
+ SELLER_SENT_DEPOSIT_TX_PUBLISHED_MSG(Phase.DEPOSIT_PUBLISHED),
+ SELLER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG(Phase.DEPOSIT_PUBLISHED),
+ SELLER_STORED_IN_MAILBOX_DEPOSIT_TX_PUBLISHED_MSG(Phase.DEPOSIT_PUBLISHED),
+ SELLER_SEND_FAILED_DEPOSIT_TX_PUBLISHED_MSG(Phase.DEPOSIT_PUBLISHED),
- // maker perspective
- MAKER_RECEIVED_DEPOSIT_TX_PUBLISHED_MSG(Phase.DEPOSIT_PUBLISHED),
+ // buyer perspective
+ BUYER_RECEIVED_DEPOSIT_TX_PUBLISHED_MSG(Phase.DEPOSIT_PUBLISHED),
- // Alternatively the maker could have seen the deposit tx earlier before he received the DEPOSIT_TX_PUBLISHED_MSG
- MAKER_SAW_DEPOSIT_TX_IN_NETWORK(Phase.DEPOSIT_PUBLISHED),
+ // Alternatively the buyer could have seen the deposit tx earlier before he received the DEPOSIT_TX_PUBLISHED_MSG
+ BUYER_SAW_DEPOSIT_TX_IN_NETWORK(Phase.DEPOSIT_PUBLISHED),
// #################### Phase DEPOSIT_CONFIRMED
@@ -221,7 +224,12 @@ public abstract class Trade implements Tradable, Model {
// mediation
MEDIATION_REQUESTED,
MEDIATION_STARTED_BY_PEER,
- MEDIATION_CLOSED;
+ MEDIATION_CLOSED,
+
+ // refund
+ REFUND_REQUESTED,
+ REFUND_REQUEST_STARTED_BY_PEER,
+ REFUND_REQUEST_CLOSED;
public static Trade.DisputeState fromProto(protobuf.Trade.DisputeState disputeState) {
return ProtoUtil.enumFromProto(Trade.DisputeState.class, disputeState.name());
@@ -368,9 +376,14 @@ public abstract class Trade implements Tradable, Model {
@Getter
transient protected TradeProtocol tradeProtocol;
@Nullable
- transient private Transaction payoutTx;
- @Nullable
transient private Transaction depositTx;
+
+ // Added in v1.2.0
+ @Nullable
+ transient private Transaction delayedPayoutTx;
+
+ @Nullable
+ transient private Transaction payoutTx;
@Nullable
transient private Coin tradeAmount;
@@ -378,12 +391,33 @@ public abstract class Trade implements Tradable, Model {
transient private ObjectProperty tradeVolumeProperty;
final transient private Set decryptedMessageWithPubKeySet = new HashSet<>();
- //Added in v1.1.6
+ // Added in v1.1.6
@Getter
@Nullable
private MediationResultState mediationResultState = MediationResultState.UNDEFINED_MEDIATION_RESULT;
transient final private ObjectProperty mediationResultStateProperty = new SimpleObjectProperty<>(mediationResultState);
+ // Added in v1.2.0
+ @Getter
+ @Setter
+ private long lockTime;
+ @Nullable
+ @Getter
+ @Setter
+ private byte[] delayedPayoutTxBytes;
+ @Nullable
+ @Getter
+ @Setter
+ private NodeAddress refundAgentNodeAddress;
+ @Nullable
+ @Getter
+ @Setter
+ private PubKeyRing refundAgentPubKeyRing;
+ @Getter
+ @Nullable
+ private RefundResultState refundResultState = RefundResultState.UNDEFINED_REFUND_RESULT;
+ transient final private ObjectProperty refundResultStateProperty = new SimpleObjectProperty<>(refundResultState);
+
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor, initialization
@@ -396,6 +430,7 @@ public abstract class Trade implements Tradable, Model {
boolean isCurrencyForTakerFeeBtc,
@Nullable NodeAddress arbitratorNodeAddress,
@Nullable NodeAddress mediatorNodeAddress,
+ @Nullable NodeAddress refundAgentNodeAddress,
Storage extends TradableList> storage,
BtcWalletService btcWalletService) {
this.offer = offer;
@@ -406,6 +441,7 @@ public abstract class Trade implements Tradable, Model {
this.btcWalletService = btcWalletService;
this.arbitratorNodeAddress = arbitratorNodeAddress;
this.mediatorNodeAddress = mediatorNodeAddress;
+ this.refundAgentNodeAddress = refundAgentNodeAddress;
txFeeAsLong = txFee.value;
takerFeeAsLong = takerFee.value;
@@ -425,6 +461,7 @@ public abstract class Trade implements Tradable, Model {
NodeAddress tradingPeerNodeAddress,
@Nullable NodeAddress arbitratorNodeAddress,
@Nullable NodeAddress mediatorNodeAddress,
+ @Nullable NodeAddress refundAgentNodeAddress,
Storage extends TradableList> storage,
BtcWalletService btcWalletService) {
@@ -434,6 +471,7 @@ public abstract class Trade implements Tradable, Model {
isCurrencyForTakerFeeBtc,
arbitratorNodeAddress,
mediatorNodeAddress,
+ refundAgentNodeAddress,
storage,
btcWalletService);
this.tradePrice = tradePrice;
@@ -463,7 +501,8 @@ public abstract class Trade implements Tradable, Model {
.setTradePeriodState(Trade.TradePeriodState.toProtoMessage(tradePeriodState))
.addAllChatMessage(chatMessages.stream()
.map(msg -> msg.toProtoNetworkEnvelope().getChatMessage())
- .collect(Collectors.toList()));
+ .collect(Collectors.toList()))
+ .setLockTime(lockTime);
Optional.ofNullable(takerFeeTxId).ifPresent(builder::setTakerFeeTxId);
Optional.ofNullable(depositTxId).ifPresent(builder::setDepositTxId);
@@ -476,13 +515,17 @@ public abstract class Trade implements Tradable, Model {
Optional.ofNullable(makerContractSignature).ifPresent(builder::setMakerContractSignature);
Optional.ofNullable(arbitratorNodeAddress).ifPresent(e -> builder.setArbitratorNodeAddress(arbitratorNodeAddress.toProtoMessage()));
Optional.ofNullable(mediatorNodeAddress).ifPresent(e -> builder.setMediatorNodeAddress(mediatorNodeAddress.toProtoMessage()));
+ Optional.ofNullable(refundAgentNodeAddress).ifPresent(e -> builder.setRefundAgentNodeAddress(refundAgentNodeAddress.toProtoMessage()));
Optional.ofNullable(arbitratorBtcPubKey).ifPresent(e -> builder.setArbitratorBtcPubKey(ByteString.copyFrom(arbitratorBtcPubKey)));
Optional.ofNullable(takerPaymentAccountId).ifPresent(builder::setTakerPaymentAccountId);
Optional.ofNullable(errorMessage).ifPresent(builder::setErrorMessage);
Optional.ofNullable(arbitratorPubKeyRing).ifPresent(e -> builder.setArbitratorPubKeyRing(arbitratorPubKeyRing.toProtoMessage()));
Optional.ofNullable(mediatorPubKeyRing).ifPresent(e -> builder.setMediatorPubKeyRing(mediatorPubKeyRing.toProtoMessage()));
+ Optional.ofNullable(refundAgentPubKeyRing).ifPresent(e -> builder.setRefundAgentPubKeyRing(refundAgentPubKeyRing.toProtoMessage()));
Optional.ofNullable(counterCurrencyTxId).ifPresent(e -> builder.setCounterCurrencyTxId(counterCurrencyTxId));
Optional.ofNullable(mediationResultState).ifPresent(e -> builder.setMediationResultState(MediationResultState.toProtoMessage(mediationResultState)));
+ Optional.ofNullable(refundResultState).ifPresent(e -> builder.setRefundResultState(RefundResultState.toProtoMessage(refundResultState)));
+ Optional.ofNullable(delayedPayoutTxBytes).ifPresent(e -> builder.setDelayedPayoutTxBytes(ByteString.copyFrom(delayedPayoutTxBytes)));
return builder.build();
}
@@ -502,13 +545,18 @@ public abstract class Trade implements Tradable, Model {
trade.setMakerContractSignature(ProtoUtil.stringOrNullFromProto(proto.getMakerContractSignature()));
trade.setArbitratorNodeAddress(proto.hasArbitratorNodeAddress() ? NodeAddress.fromProto(proto.getArbitratorNodeAddress()) : null);
trade.setMediatorNodeAddress(proto.hasMediatorNodeAddress() ? NodeAddress.fromProto(proto.getMediatorNodeAddress()) : null);
+ trade.setRefundAgentNodeAddress(proto.hasRefundAgentNodeAddress() ? NodeAddress.fromProto(proto.getRefundAgentNodeAddress()) : null);
trade.setArbitratorBtcPubKey(ProtoUtil.byteArrayOrNullFromProto(proto.getArbitratorBtcPubKey()));
trade.setTakerPaymentAccountId(ProtoUtil.stringOrNullFromProto(proto.getTakerPaymentAccountId()));
trade.setErrorMessage(ProtoUtil.stringOrNullFromProto(proto.getErrorMessage()));
trade.setArbitratorPubKeyRing(proto.hasArbitratorPubKeyRing() ? PubKeyRing.fromProto(proto.getArbitratorPubKeyRing()) : null);
trade.setMediatorPubKeyRing(proto.hasMediatorPubKeyRing() ? PubKeyRing.fromProto(proto.getMediatorPubKeyRing()) : null);
+ trade.setRefundAgentPubKeyRing(proto.hasRefundAgentPubKeyRing() ? PubKeyRing.fromProto(proto.getRefundAgentPubKeyRing()) : null);
trade.setCounterCurrencyTxId(proto.getCounterCurrencyTxId().isEmpty() ? null : proto.getCounterCurrencyTxId());
trade.setMediationResultState(MediationResultState.fromProto(proto.getMediationResultState()));
+ trade.setRefundResultState(RefundResultState.fromProto(proto.getRefundResultState()));
+ trade.setDelayedPayoutTxBytes(ProtoUtil.byteArrayOrNullFromProto(proto.getDelayedPayoutTxBytes()));
+ trade.setLockTime(proto.getLockTime());
trade.chatMessages.addAll(proto.getChatMessageList().stream()
.map(ChatMessage::fromPayloadProto)
@@ -531,6 +579,7 @@ public abstract class Trade implements Tradable, Model {
BtcWalletService btcWalletService,
BsqWalletService bsqWalletService,
TradeWalletService tradeWalletService,
+ DaoFacade daoFacade,
TradeManager tradeManager,
OpenOfferManager openOfferManager,
ReferralIdService referralIdService,
@@ -540,6 +589,7 @@ public abstract class Trade implements Tradable, Model {
TradeStatisticsManager tradeStatisticsManager,
ArbitratorManager arbitratorManager,
MediatorManager mediatorManager,
+ RefundAgentManager refundAgentManager,
KeyRing keyRing,
boolean useSavingsWallet,
Coin fundsNeededForTrade) {
@@ -550,6 +600,7 @@ public abstract class Trade implements Tradable, Model {
btcWalletService,
bsqWalletService,
tradeWalletService,
+ daoFacade,
referralIdService,
user,
filterManager,
@@ -557,6 +608,7 @@ public abstract class Trade implements Tradable, Model {
tradeStatisticsManager,
arbitratorManager,
mediatorManager,
+ refundAgentManager,
keyRing,
useSavingsWallet,
fundsNeededForTrade);
@@ -572,6 +624,11 @@ public abstract class Trade implements Tradable, Model {
persist();
});
+ refundAgentManager.getDisputeAgentByNodeAddress(refundAgentNodeAddress).ifPresent(refundAgent -> {
+ refundAgentPubKeyRing = refundAgent.getPubKeyRing();
+ persist();
+ });
+
createTradeProtocol();
// If we have already received a msg we apply it.
@@ -590,11 +647,10 @@ public abstract class Trade implements Tradable, Model {
// The deserialized tx has not actual confidence data, so we need to get the fresh one from the wallet.
void updateDepositTxFromWallet() {
if (getDepositTx() != null)
- setDepositTx(processModel.getTradeWalletService().getWalletTx(getDepositTx().getHash()));
+ applyDepositTx(processModel.getTradeWalletService().getWalletTx(getDepositTx().getHash()));
}
- public void setDepositTx(Transaction tx) {
- log.debug("setDepositTx " + tx);
+ public void applyDepositTx(Transaction tx) {
this.depositTx = tx;
depositTxId = depositTx.getHashAsString();
setupConfidenceListener();
@@ -608,6 +664,25 @@ public abstract class Trade implements Tradable, Model {
return depositTx;
}
+ public void applyDelayedPayoutTx(Transaction delayedPayoutTx) {
+ this.delayedPayoutTx = delayedPayoutTx;
+ this.delayedPayoutTxBytes = delayedPayoutTx.bitcoinSerialize();
+ persist();
+ }
+
+ public void applyDelayedPayoutTxBytes(byte[] delayedPayoutTxBytes) {
+ this.delayedPayoutTxBytes = delayedPayoutTxBytes;
+ persist();
+ }
+
+ @Nullable
+ public Transaction getDelayedPayoutTx() {
+ if (delayedPayoutTx == null) {
+ delayedPayoutTx = delayedPayoutTxBytes != null ? processModel.getBtcWalletService().getTxFromSerializedTx(delayedPayoutTxBytes) : null;
+ }
+ return delayedPayoutTx;
+ }
+
// We don't need to persist the msg as if we dont apply it it will not be removed from the P2P network and we
// will received it again at next startup. Such might happen in edge cases when the user shuts down after we
// received the msb but before the init is called.
@@ -703,6 +778,14 @@ public abstract class Trade implements Tradable, Model {
persist();
}
+ public void setRefundResultState(RefundResultState refundResultState) {
+ boolean changed = this.refundResultState != refundResultState;
+ this.refundResultState = refundResultState;
+ refundResultStateProperty.set(refundResultState);
+ if (changed)
+ persist();
+ }
+
public void setTradePeriodState(TradePeriodState tradePeriodState) {
boolean changed = this.tradePeriodState != tradePeriodState;
@@ -821,7 +904,12 @@ public abstract class Trade implements Tradable, Model {
}
public boolean isFundsLockedIn() {
- return isDepositPublished() && !isPayoutPublished() && disputeState != DisputeState.DISPUTE_CLOSED;
+ return isDepositPublished() &&
+ !isPayoutPublished() &&
+ disputeState != DisputeState.DISPUTE_CLOSED &&
+ disputeState != DisputeState.REFUND_REQUESTED &&
+ disputeState != DisputeState.REFUND_REQUEST_STARTED_BY_PEER &&
+ disputeState != DisputeState.REFUND_REQUEST_CLOSED;
}
public boolean isDepositConfirmed() {
@@ -832,7 +920,6 @@ public abstract class Trade implements Tradable, Model {
return getState().getPhase().ordinal() >= Phase.FIAT_SENT.ordinal();
}
- @SuppressWarnings("BooleanMethodIsAlwaysInverted")
public boolean isFiatReceived() {
return getState().getPhase().ordinal() >= Phase.FIAT_RECEIVED.ordinal();
}
@@ -861,6 +948,10 @@ public abstract class Trade implements Tradable, Model {
return mediationResultStateProperty;
}
+ public ReadOnlyObjectProperty refundResultStateProperty() {
+ return refundResultStateProperty;
+ }
+
public ReadOnlyObjectProperty tradePeriodStateProperty() {
return tradePeriodStateProperty;
}
@@ -987,7 +1078,7 @@ public abstract class Trade implements Tradable, Model {
",\n isCurrencyForTakerFeeBtc=" + isCurrencyForTakerFeeBtc +
",\n txFeeAsLong=" + txFeeAsLong +
",\n takerFeeAsLong=" + takerFeeAsLong +
- ",\n takeOfferDate=" + getTakeOfferDate() +
+ ",\n takeOfferDate=" + takeOfferDate +
",\n processModel=" + processModel +
",\n takerFeeTxId='" + takerFeeTxId + '\'' +
",\n depositTxId='" + depositTxId + '\'' +
@@ -1004,10 +1095,14 @@ public abstract class Trade implements Tradable, Model {
",\n takerContractSignature='" + takerContractSignature + '\'' +
",\n makerContractSignature='" + makerContractSignature + '\'' +
",\n arbitratorNodeAddress=" + arbitratorNodeAddress +
- ",\n mediatorNodeAddress=" + mediatorNodeAddress +
",\n arbitratorBtcPubKey=" + Utilities.bytesAsHexString(arbitratorBtcPubKey) +
+ ",\n arbitratorPubKeyRing=" + arbitratorPubKeyRing +
+ ",\n mediatorNodeAddress=" + mediatorNodeAddress +
+ ",\n mediatorPubKeyRing=" + mediatorPubKeyRing +
",\n takerPaymentAccountId='" + takerPaymentAccountId + '\'' +
",\n errorMessage='" + errorMessage + '\'' +
+ ",\n counterCurrencyTxId='" + counterCurrencyTxId + '\'' +
+ ",\n chatMessages=" + chatMessages +
",\n txFee=" + txFee +
",\n takerFee=" + takerFee +
",\n storage=" + storage +
@@ -1018,15 +1113,21 @@ public abstract class Trade implements Tradable, Model {
",\n tradePeriodStateProperty=" + tradePeriodStateProperty +
",\n errorMessageProperty=" + errorMessageProperty +
",\n tradeProtocol=" + tradeProtocol +
- ",\n payoutTx=" + payoutTx +
",\n depositTx=" + depositTx +
+ ",\n delayedPayoutTx=" + delayedPayoutTx +
+ ",\n payoutTx=" + payoutTx +
",\n tradeAmount=" + tradeAmount +
",\n tradeAmountProperty=" + tradeAmountProperty +
",\n tradeVolumeProperty=" + tradeVolumeProperty +
",\n decryptedMessageWithPubKeySet=" + decryptedMessageWithPubKeySet +
- ",\n arbitratorPubKeyRing=" + arbitratorPubKeyRing +
- ",\n mediatorPubKeyRing=" + mediatorPubKeyRing +
- ",\n chatMessages=" + chatMessages +
+ ",\n mediationResultState=" + mediationResultState +
+ ",\n mediationResultStateProperty=" + mediationResultStateProperty +
+ ",\n lockTime=" + lockTime +
+ ",\n delayedPayoutTxBytes=" + Utilities.bytesAsHexString(delayedPayoutTxBytes) +
+ ",\n refundAgentNodeAddress=" + refundAgentNodeAddress +
+ ",\n refundAgentPubKeyRing=" + refundAgentPubKeyRing +
+ ",\n refundResultState=" + refundResultState +
+ ",\n refundResultStateProperty=" + refundResultStateProperty +
"\n}";
}
}
diff --git a/core/src/main/java/bisq/core/trade/TradeManager.java b/core/src/main/java/bisq/core/trade/TradeManager.java
index d3e5739888..1faf2d9a8a 100644
--- a/core/src/main/java/bisq/core/trade/TradeManager.java
+++ b/core/src/main/java/bisq/core/trade/TradeManager.java
@@ -19,10 +19,14 @@ package bisq.core.trade;
import bisq.core.account.witness.AccountAgeWitnessService;
import bisq.core.btc.exceptions.AddressEntryException;
+import bisq.core.btc.exceptions.TxBroadcastException;
import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.wallet.BsqWalletService;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.btc.wallet.TradeWalletService;
+import bisq.core.btc.wallet.TxBroadcaster;
+import bisq.core.btc.wallet.WalletService;
+import bisq.core.dao.DaoFacade;
import bisq.core.filter.FilterManager;
import bisq.core.offer.Offer;
import bisq.core.offer.OfferPayload;
@@ -32,10 +36,12 @@ import bisq.core.offer.availability.OfferAvailabilityModel;
import bisq.core.provider.price.PriceFeedService;
import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager;
import bisq.core.support.dispute.mediation.mediator.MediatorManager;
+import bisq.core.support.dispute.refund.refundagent.RefundAgentManager;
import bisq.core.trade.closed.ClosedTradableManager;
import bisq.core.trade.failed.FailedTradesManager;
import bisq.core.trade.handlers.TradeResultHandler;
-import bisq.core.trade.messages.PayDepositRequest;
+import bisq.core.trade.messages.InputsForDepositTxRequest;
+import bisq.core.trade.messages.PeerPublishedDelayedPayoutTxMessage;
import bisq.core.trade.messages.TradeMessage;
import bisq.core.trade.statistics.ReferralIdService;
import bisq.core.trade.statistics.TradeStatisticsManager;
@@ -47,9 +53,9 @@ import bisq.network.p2p.AckMessageSourceType;
import bisq.network.p2p.BootstrapListener;
import bisq.network.p2p.NodeAddress;
import bisq.network.p2p.P2PService;
+import bisq.network.p2p.SendMailboxMessageListener;
import bisq.common.ClockWatcher;
-import bisq.common.UserThread;
import bisq.common.crypto.KeyRing;
import bisq.common.handlers.ErrorMessageHandler;
import bisq.common.handlers.FaultHandler;
@@ -82,7 +88,7 @@ import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.Set;
-import java.util.concurrent.TimeUnit;
+import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -116,6 +122,8 @@ public class TradeManager implements PersistedDataHost {
private final AccountAgeWitnessService accountAgeWitnessService;
private final ArbitratorManager arbitratorManager;
private final MediatorManager mediatorManager;
+ private final RefundAgentManager refundAgentManager;
+ private final DaoFacade daoFacade;
private final ClockWatcher clockWatcher;
private final Storage> tradableListStorage;
@@ -150,6 +158,8 @@ public class TradeManager implements PersistedDataHost {
AccountAgeWitnessService accountAgeWitnessService,
ArbitratorManager arbitratorManager,
MediatorManager mediatorManager,
+ RefundAgentManager refundAgentManager,
+ DaoFacade daoFacade,
ClockWatcher clockWatcher,
Storage> storage) {
this.user = user;
@@ -168,6 +178,8 @@ public class TradeManager implements PersistedDataHost {
this.accountAgeWitnessService = accountAgeWitnessService;
this.arbitratorManager = arbitratorManager;
this.mediatorManager = mediatorManager;
+ this.refundAgentManager = refundAgentManager;
+ this.daoFacade = daoFacade;
this.clockWatcher = clockWatcher;
tradableListStorage = storage;
@@ -176,8 +188,8 @@ public class TradeManager implements PersistedDataHost {
NetworkEnvelope networkEnvelope = decryptedMessageWithPubKey.getNetworkEnvelope();
// Handler for incoming initial network_messages from taker
- if (networkEnvelope instanceof PayDepositRequest) {
- handlePayDepositRequest((PayDepositRequest) networkEnvelope, peerNodeAddress);
+ if (networkEnvelope instanceof InputsForDepositTxRequest) {
+ handlePayDepositRequest((InputsForDepositTxRequest) networkEnvelope, peerNodeAddress);
}
});
@@ -274,11 +286,6 @@ public class TradeManager implements PersistedDataHost {
cleanUpAddressEntries();
- // TODO remove once we support Taker side publishing at take offer process
- // We start later to have better connectivity to the network
- UserThread.runAfter(() -> tradeStatisticsManager.publishTradeStatistics(tradesForStatistics),
- 30, TimeUnit.SECONDS);
-
pendingTradesInitialized.set(true);
}
@@ -307,18 +314,18 @@ public class TradeManager implements PersistedDataHost {
});
}
- private void handlePayDepositRequest(PayDepositRequest payDepositRequest, NodeAddress peer) {
+ private void handlePayDepositRequest(InputsForDepositTxRequest inputsForDepositTxRequest, NodeAddress peer) {
log.info("Received PayDepositRequest from {} with tradeId {} and uid {}",
- peer, payDepositRequest.getTradeId(), payDepositRequest.getUid());
+ peer, inputsForDepositTxRequest.getTradeId(), inputsForDepositTxRequest.getUid());
try {
- Validator.nonEmptyStringOf(payDepositRequest.getTradeId());
+ Validator.nonEmptyStringOf(inputsForDepositTxRequest.getTradeId());
} catch (Throwable t) {
- log.warn("Invalid requestDepositTxInputsMessage " + payDepositRequest.toString());
+ log.warn("Invalid requestDepositTxInputsMessage " + inputsForDepositTxRequest.toString());
return;
}
- Optional openOfferOptional = openOfferManager.getOpenOfferById(payDepositRequest.getTradeId());
+ Optional openOfferOptional = openOfferManager.getOpenOfferById(inputsForDepositTxRequest.getTradeId());
if (openOfferOptional.isPresent() && openOfferOptional.get().getState() == OpenOffer.State.AVAILABLE) {
OpenOffer openOffer = openOfferOptional.get();
Offer offer = openOffer.getOffer();
@@ -326,26 +333,28 @@ public class TradeManager implements PersistedDataHost {
Trade trade;
if (offer.isBuyOffer())
trade = new BuyerAsMakerTrade(offer,
- Coin.valueOf(payDepositRequest.getTxFee()),
- Coin.valueOf(payDepositRequest.getTakerFee()),
- payDepositRequest.isCurrencyForTakerFeeBtc(),
+ Coin.valueOf(inputsForDepositTxRequest.getTxFee()),
+ Coin.valueOf(inputsForDepositTxRequest.getTakerFee()),
+ inputsForDepositTxRequest.isCurrencyForTakerFeeBtc(),
openOffer.getArbitratorNodeAddress(),
openOffer.getMediatorNodeAddress(),
+ openOffer.getRefundAgentNodeAddress(),
tradableListStorage,
btcWalletService);
else
trade = new SellerAsMakerTrade(offer,
- Coin.valueOf(payDepositRequest.getTxFee()),
- Coin.valueOf(payDepositRequest.getTakerFee()),
- payDepositRequest.isCurrencyForTakerFeeBtc(),
+ Coin.valueOf(inputsForDepositTxRequest.getTxFee()),
+ Coin.valueOf(inputsForDepositTxRequest.getTakerFee()),
+ inputsForDepositTxRequest.isCurrencyForTakerFeeBtc(),
openOffer.getArbitratorNodeAddress(),
openOffer.getMediatorNodeAddress(),
+ openOffer.getRefundAgentNodeAddress(),
tradableListStorage,
btcWalletService);
initTrade(trade, trade.getProcessModel().isUseSavingsWallet(), trade.getProcessModel().getFundsNeededForTradeAsLong());
tradableList.add(trade);
- ((MakerTrade) trade).handleTakeOfferRequest(payDepositRequest, peer, errorMessage -> {
+ ((MakerTrade) trade).handleTakeOfferRequest(inputsForDepositTxRequest, peer, errorMessage -> {
if (takeOfferRequestErrorMessageHandler != null)
takeOfferRequestErrorMessageHandler.handleErrorMessage(errorMessage);
});
@@ -362,6 +371,7 @@ public class TradeManager implements PersistedDataHost {
btcWalletService,
bsqWalletService,
tradeWalletService,
+ daoFacade,
this,
openOfferManager,
referralIdService,
@@ -371,6 +381,7 @@ public class TradeManager implements PersistedDataHost {
tradeStatisticsManager,
arbitratorManager,
mediatorManager,
+ refundAgentManager,
keyRing,
useSavingsWallet,
fundsNeededForTrade);
@@ -453,6 +464,7 @@ public class TradeManager implements PersistedDataHost {
model.getPeerNodeAddress(),
model.getSelectedArbitrator(),
model.getSelectedMediator(),
+ model.getSelectedRefundAgent(),
tradableListStorage,
btcWalletService);
else
@@ -465,6 +477,7 @@ public class TradeManager implements PersistedDataHost {
model.getPeerNodeAddress(),
model.getSelectedArbitrator(),
model.getSelectedMediator(),
+ model.getSelectedRefundAgent(),
tradableListStorage,
btcWalletService);
@@ -567,6 +580,70 @@ public class TradeManager implements PersistedDataHost {
}
}
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Publish delayed payout tx
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public void publishDelayedPayoutTx(String tradeId,
+ ResultHandler resultHandler,
+ ErrorMessageHandler errorMessageHandler) {
+ getTradeById(tradeId).ifPresent(trade -> {
+ Transaction delayedPayoutTx = trade.getDelayedPayoutTx();
+ if (delayedPayoutTx != null) {
+ // We have spent the funds from the deposit tx with the delayedPayoutTx
+ btcWalletService.swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.MULTI_SIG);
+ // We might receive funds on AddressEntry.Context.TRADE_PAYOUT so we don't swap that
+
+ Transaction committedDelayedPayoutTx = WalletService.maybeAddSelfTxToWallet(delayedPayoutTx, btcWalletService.getWallet());
+
+ tradeWalletService.broadcastTx(committedDelayedPayoutTx, new TxBroadcaster.Callback() {
+ @Override
+ public void onSuccess(Transaction transaction) {
+ log.info("publishDelayedPayoutTx onSuccess " + transaction);
+ NodeAddress tradingPeerNodeAddress = trade.getTradingPeerNodeAddress();
+ PeerPublishedDelayedPayoutTxMessage msg = new PeerPublishedDelayedPayoutTxMessage(UUID.randomUUID().toString(),
+ tradeId,
+ tradingPeerNodeAddress);
+ p2PService.sendEncryptedMailboxMessage(
+ tradingPeerNodeAddress,
+ trade.getProcessModel().getTradingPeer().getPubKeyRing(),
+ msg,
+ new SendMailboxMessageListener() {
+ @Override
+ public void onArrived() {
+ resultHandler.handleResult();
+ log.info("SendMailboxMessageListener onArrived tradeId={} at peer {}",
+ tradeId, tradingPeerNodeAddress);
+ }
+
+ @Override
+ public void onStoredInMailbox() {
+ resultHandler.handleResult();
+ log.info("SendMailboxMessageListener onStoredInMailbox tradeId={} at peer {}",
+ tradeId, tradingPeerNodeAddress);
+ }
+
+ @Override
+ public void onFault(String errorMessage) {
+ log.error("SendMailboxMessageListener onFault tradeId={} at peer {}",
+ tradeId, tradingPeerNodeAddress);
+ errorMessageHandler.handleErrorMessage(errorMessage);
+ }
+ }
+ );
+ }
+
+ @Override
+ public void onFailure(TxBroadcastException exception) {
+ log.error("publishDelayedPayoutTx onFailure", exception);
+ errorMessageHandler.handleErrorMessage(exception.toString());
+ }
+ });
+ }
+ });
+ }
+
///////////////////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureRequest.java b/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureRequest.java
new file mode 100644
index 0000000000..0d1182001b
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureRequest.java
@@ -0,0 +1,89 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.messages;
+
+import bisq.network.p2p.DirectMessage;
+import bisq.network.p2p.NodeAddress;
+
+import bisq.common.app.Version;
+import bisq.common.util.Utilities;
+
+import com.google.protobuf.ByteString;
+
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+
+@EqualsAndHashCode(callSuper = true)
+@Value
+public final class DelayedPayoutTxSignatureRequest extends TradeMessage implements DirectMessage {
+ private final NodeAddress senderNodeAddress;
+ private final byte[] delayedPayoutTx;
+
+ public DelayedPayoutTxSignatureRequest(String uid,
+ String tradeId,
+ NodeAddress senderNodeAddress,
+ byte[] delayedPayoutTx) {
+ this(Version.getP2PMessageVersion(),
+ uid,
+ tradeId,
+ senderNodeAddress,
+ delayedPayoutTx);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // PROTO BUFFER
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ private DelayedPayoutTxSignatureRequest(int messageVersion,
+ String uid,
+ String tradeId,
+ NodeAddress senderNodeAddress,
+ byte[] delayedPayoutTx) {
+ super(messageVersion, tradeId, uid);
+ this.senderNodeAddress = senderNodeAddress;
+ this.delayedPayoutTx = delayedPayoutTx;
+ }
+
+
+ @Override
+ public protobuf.NetworkEnvelope toProtoNetworkEnvelope() {
+ return getNetworkEnvelopeBuilder()
+ .setDelayedPayoutTxSignatureRequest(protobuf.DelayedPayoutTxSignatureRequest.newBuilder()
+ .setUid(uid)
+ .setTradeId(tradeId)
+ .setSenderNodeAddress(senderNodeAddress.toProtoMessage())
+ .setDelayedPayoutTx(ByteString.copyFrom(delayedPayoutTx)))
+ .build();
+ }
+
+ public static DelayedPayoutTxSignatureRequest fromProto(protobuf.DelayedPayoutTxSignatureRequest proto, int messageVersion) {
+ return new DelayedPayoutTxSignatureRequest(messageVersion,
+ proto.getUid(),
+ proto.getTradeId(),
+ NodeAddress.fromProto(proto.getSenderNodeAddress()),
+ proto.getDelayedPayoutTx().toByteArray());
+ }
+
+ @Override
+ public String toString() {
+ return "DelayedPayoutTxSignatureRequest{" +
+ "\n senderNodeAddress=" + senderNodeAddress +
+ ",\n delayedPayoutTx=" + Utilities.bytesAsHexString(delayedPayoutTx) +
+ "\n} " + super.toString();
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureResponse.java b/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureResponse.java
new file mode 100644
index 0000000000..639d5edb72
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureResponse.java
@@ -0,0 +1,90 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.messages;
+
+import bisq.network.p2p.DirectMessage;
+import bisq.network.p2p.NodeAddress;
+
+import bisq.common.app.Version;
+import bisq.common.util.Utilities;
+
+import com.google.protobuf.ByteString;
+
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+
+@EqualsAndHashCode(callSuper = true)
+@Value
+public final class DelayedPayoutTxSignatureResponse extends TradeMessage implements DirectMessage {
+ private final NodeAddress senderNodeAddress;
+ private final byte[] delayedPayoutTxSignature;
+
+ public DelayedPayoutTxSignatureResponse(String uid,
+ String tradeId,
+ NodeAddress senderNodeAddress,
+ byte[] delayedPayoutTxSignature) {
+ this(Version.getP2PMessageVersion(),
+ uid,
+ tradeId,
+ senderNodeAddress,
+ delayedPayoutTxSignature);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // PROTO BUFFER
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ private DelayedPayoutTxSignatureResponse(int messageVersion,
+ String uid,
+ String tradeId,
+ NodeAddress senderNodeAddress,
+ byte[] delayedPayoutTxSignature) {
+ super(messageVersion, tradeId, uid);
+ this.senderNodeAddress = senderNodeAddress;
+ this.delayedPayoutTxSignature = delayedPayoutTxSignature;
+ }
+
+
+ @Override
+ public protobuf.NetworkEnvelope toProtoNetworkEnvelope() {
+ return getNetworkEnvelopeBuilder()
+ .setDelayedPayoutTxSignatureResponse(protobuf.DelayedPayoutTxSignatureResponse.newBuilder()
+ .setUid(uid)
+ .setTradeId(tradeId)
+ .setSenderNodeAddress(senderNodeAddress.toProtoMessage())
+ .setDelayedPayoutTxSignature(ByteString.copyFrom(delayedPayoutTxSignature))
+ )
+ .build();
+ }
+
+ public static DelayedPayoutTxSignatureResponse fromProto(protobuf.DelayedPayoutTxSignatureResponse proto, int messageVersion) {
+ return new DelayedPayoutTxSignatureResponse(messageVersion,
+ proto.getUid(),
+ proto.getTradeId(),
+ NodeAddress.fromProto(proto.getSenderNodeAddress()),
+ proto.getDelayedPayoutTxSignature().toByteArray());
+ }
+
+ @Override
+ public String toString() {
+ return "DelayedPayoutTxSignatureResponse{" +
+ "\n senderNodeAddress=" + senderNodeAddress +
+ ",\n delayedPayoutTxSignature=" + Utilities.bytesAsHexString(delayedPayoutTxSignature) +
+ "\n} " + super.toString();
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/messages/DepositTxAndDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/messages/DepositTxAndDelayedPayoutTxMessage.java
new file mode 100644
index 0000000000..6d90bb1f2d
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/messages/DepositTxAndDelayedPayoutTxMessage.java
@@ -0,0 +1,98 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.messages;
+
+import bisq.network.p2p.MailboxMessage;
+import bisq.network.p2p.NodeAddress;
+
+import bisq.common.app.Version;
+import bisq.common.util.Utilities;
+
+import com.google.protobuf.ByteString;
+
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+
+// It is the last message in the take offer phase. We use MailboxMessage instead of DirectMessage to add more tolerance
+// in case of network issues and as the message does not trigger further protocol execution.
+@EqualsAndHashCode(callSuper = true)
+@Value
+public final class DepositTxAndDelayedPayoutTxMessage extends TradeMessage implements MailboxMessage {
+ private final NodeAddress senderNodeAddress;
+ private final byte[] depositTx;
+ private final byte[] delayedPayoutTx;
+
+ public DepositTxAndDelayedPayoutTxMessage(String uid,
+ String tradeId,
+ NodeAddress senderNodeAddress,
+ byte[] depositTx,
+ byte[] delayedPayoutTx) {
+ this(Version.getP2PMessageVersion(),
+ uid,
+ tradeId,
+ senderNodeAddress,
+ depositTx,
+ delayedPayoutTx);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // PROTO BUFFER
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ private DepositTxAndDelayedPayoutTxMessage(int messageVersion,
+ String uid,
+ String tradeId,
+ NodeAddress senderNodeAddress,
+ byte[] depositTx,
+ byte[] delayedPayoutTx) {
+ super(messageVersion, tradeId, uid);
+ this.senderNodeAddress = senderNodeAddress;
+ this.depositTx = depositTx;
+ this.delayedPayoutTx = delayedPayoutTx;
+ }
+
+ @Override
+ public protobuf.NetworkEnvelope toProtoNetworkEnvelope() {
+ return getNetworkEnvelopeBuilder()
+ .setDepositTxAndDelayedPayoutTxMessage(protobuf.DepositTxAndDelayedPayoutTxMessage.newBuilder()
+ .setUid(uid)
+ .setTradeId(tradeId)
+ .setSenderNodeAddress(senderNodeAddress.toProtoMessage())
+ .setDepositTx(ByteString.copyFrom(depositTx))
+ .setDelayedPayoutTx(ByteString.copyFrom(delayedPayoutTx)))
+ .build();
+ }
+
+ public static DepositTxAndDelayedPayoutTxMessage fromProto(protobuf.DepositTxAndDelayedPayoutTxMessage proto, int messageVersion) {
+ return new DepositTxAndDelayedPayoutTxMessage(messageVersion,
+ proto.getUid(),
+ proto.getTradeId(),
+ NodeAddress.fromProto(proto.getSenderNodeAddress()),
+ proto.getDepositTx().toByteArray(),
+ proto.getDelayedPayoutTx().toByteArray());
+ }
+
+ @Override
+ public String toString() {
+ return "DepositTxAndDelayedPayoutTxMessage{" +
+ "\n senderNodeAddress=" + senderNodeAddress +
+ ",\n depositTx=" + Utilities.bytesAsHexString(depositTx) +
+ ",\n delayedPayoutTx=" + Utilities.bytesAsHexString(delayedPayoutTx) +
+ "\n} " + super.toString();
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/messages/DepositTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/messages/DepositTxMessage.java
similarity index 58%
rename from core/src/main/java/bisq/core/trade/messages/DepositTxPublishedMessage.java
rename to core/src/main/java/bisq/core/trade/messages/DepositTxMessage.java
index e5fd07021e..4350afd226 100644
--- a/core/src/main/java/bisq/core/trade/messages/DepositTxPublishedMessage.java
+++ b/core/src/main/java/bisq/core/trade/messages/DepositTxMessage.java
@@ -17,7 +17,7 @@
package bisq.core.trade.messages;
-import bisq.network.p2p.MailboxMessage;
+import bisq.network.p2p.DirectMessage;
import bisq.network.p2p.NodeAddress;
import bisq.common.app.Version;
@@ -28,64 +28,63 @@ import com.google.protobuf.ByteString;
import lombok.EqualsAndHashCode;
import lombok.Value;
+// It is the last message in the take offer phase. We use MailboxMessage instead of DirectMessage to add more tolerance
+// in case of network issues and as the message does not trigger further protocol execution.
@EqualsAndHashCode(callSuper = true)
@Value
-public final class DepositTxPublishedMessage extends TradeMessage implements MailboxMessage {
- private final byte[] depositTx;
+public final class DepositTxMessage extends TradeMessage implements DirectMessage {
private final NodeAddress senderNodeAddress;
+ private final byte[] depositTx;
- public DepositTxPublishedMessage(String tradeId,
- byte[] depositTx,
- NodeAddress senderNodeAddress,
- String uid) {
- this(tradeId,
- depositTx,
- senderNodeAddress,
+ public DepositTxMessage(String uid,
+ String tradeId,
+ NodeAddress senderNodeAddress,
+ byte[] depositTx) {
+ this(Version.getP2PMessageVersion(),
uid,
- Version.getP2PMessageVersion());
+ tradeId,
+ senderNodeAddress,
+ depositTx);
}
///////////////////////////////////////////////////////////////////////////////////////////
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
- private DepositTxPublishedMessage(String tradeId,
- byte[] depositTx,
- NodeAddress senderNodeAddress,
- String uid,
- int messageVersion) {
+ private DepositTxMessage(int messageVersion,
+ String uid,
+ String tradeId,
+ NodeAddress senderNodeAddress,
+ byte[] depositTx) {
super(messageVersion, tradeId, uid);
- this.depositTx = depositTx;
this.senderNodeAddress = senderNodeAddress;
+ this.depositTx = depositTx;
}
-
@Override
public protobuf.NetworkEnvelope toProtoNetworkEnvelope() {
return getNetworkEnvelopeBuilder()
- .setDepositTxPublishedMessage(protobuf.DepositTxPublishedMessage.newBuilder()
+ .setDepositTxMessage(protobuf.DepositTxMessage.newBuilder()
+ .setUid(uid)
.setTradeId(tradeId)
- .setDepositTx(ByteString.copyFrom(depositTx))
.setSenderNodeAddress(senderNodeAddress.toProtoMessage())
- .setUid(uid))
+ .setDepositTx(ByteString.copyFrom(depositTx)))
.build();
}
- public static DepositTxPublishedMessage fromProto(protobuf.DepositTxPublishedMessage proto, int messageVersion) {
- return new DepositTxPublishedMessage(proto.getTradeId(),
- proto.getDepositTx().toByteArray(),
- NodeAddress.fromProto(proto.getSenderNodeAddress()),
+ public static DepositTxMessage fromProto(protobuf.DepositTxMessage proto, int messageVersion) {
+ return new DepositTxMessage(messageVersion,
proto.getUid(),
- messageVersion);
+ proto.getTradeId(),
+ NodeAddress.fromProto(proto.getSenderNodeAddress()),
+ proto.getDepositTx().toByteArray());
}
-
@Override
public String toString() {
- return "DepositTxPublishedMessage{" +
- "\n depositTx=" + Utilities.bytesAsHexString(depositTx) +
- ",\n senderNodeAddress=" + senderNodeAddress +
- ",\n uid='" + uid + '\'' +
+ return "DepositTxMessage{" +
+ "\n senderNodeAddress=" + senderNodeAddress +
+ ",\n depositTx=" + Utilities.bytesAsHexString(depositTx) +
"\n} " + super.toString();
}
}
diff --git a/core/src/main/java/bisq/core/trade/messages/PayDepositRequest.java b/core/src/main/java/bisq/core/trade/messages/InputsForDepositTxRequest.java
similarity index 71%
rename from core/src/main/java/bisq/core/trade/messages/PayDepositRequest.java
rename to core/src/main/java/bisq/core/trade/messages/InputsForDepositTxRequest.java
index 05447f26a6..57df03a1b2 100644
--- a/core/src/main/java/bisq/core/trade/messages/PayDepositRequest.java
+++ b/core/src/main/java/bisq/core/trade/messages/InputsForDepositTxRequest.java
@@ -21,6 +21,7 @@ import bisq.core.btc.model.RawTransactionInput;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.proto.CoreProtoResolver;
+import bisq.network.p2p.DirectMessage;
import bisq.network.p2p.NodeAddress;
import bisq.common.crypto.PubKeyRing;
@@ -29,7 +30,6 @@ import bisq.common.util.Utilities;
import com.google.protobuf.ByteString;
-import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -41,7 +41,7 @@ import javax.annotation.Nullable;
@EqualsAndHashCode(callSuper = true)
@Value
-public final class PayDepositRequest extends TradeMessage {
+public final class InputsForDepositTxRequest extends TradeMessage implements DirectMessage {
private final NodeAddress senderNodeAddress;
private final long tradeAmount;
private final long tradePrice;
@@ -60,38 +60,43 @@ public final class PayDepositRequest extends TradeMessage {
private final String takerFeeTxId;
private final List acceptedArbitratorNodeAddresses;
private final List acceptedMediatorNodeAddresses;
+ private final List acceptedRefundAgentNodeAddresses;
+ @Nullable
private final NodeAddress arbitratorNodeAddress;
private final NodeAddress mediatorNodeAddress;
+ private final NodeAddress refundAgentNodeAddress;
// added in v 0.6. can be null if we trade with an older peer
@Nullable
private final byte[] accountAgeWitnessSignatureOfOfferId;
private final long currentDate;
- public PayDepositRequest(String tradeId,
- NodeAddress senderNodeAddress,
- long tradeAmount,
- long tradePrice,
- long txFee,
- long takerFee,
- boolean isCurrencyForTakerFeeBtc,
- List rawTransactionInputs,
- long changeOutputValue,
- @Nullable String changeOutputAddress,
- byte[] takerMultiSigPubKey,
- String takerPayoutAddressString,
- PubKeyRing takerPubKeyRing,
- PaymentAccountPayload takerPaymentAccountPayload,
- String takerAccountId,
- String takerFeeTxId,
- List acceptedArbitratorNodeAddresses,
- List acceptedMediatorNodeAddresses,
- NodeAddress arbitratorNodeAddress,
- NodeAddress mediatorNodeAddress,
- String uid,
- int messageVersion,
- @Nullable byte[] accountAgeWitnessSignatureOfOfferId,
- long currentDate) {
+ public InputsForDepositTxRequest(String tradeId,
+ NodeAddress senderNodeAddress,
+ long tradeAmount,
+ long tradePrice,
+ long txFee,
+ long takerFee,
+ boolean isCurrencyForTakerFeeBtc,
+ List rawTransactionInputs,
+ long changeOutputValue,
+ @Nullable String changeOutputAddress,
+ byte[] takerMultiSigPubKey,
+ String takerPayoutAddressString,
+ PubKeyRing takerPubKeyRing,
+ PaymentAccountPayload takerPaymentAccountPayload,
+ String takerAccountId,
+ String takerFeeTxId,
+ List acceptedArbitratorNodeAddresses,
+ List acceptedMediatorNodeAddresses,
+ List acceptedRefundAgentNodeAddresses,
+ NodeAddress arbitratorNodeAddress,
+ NodeAddress mediatorNodeAddress,
+ NodeAddress refundAgentNodeAddress,
+ String uid,
+ int messageVersion,
+ @Nullable byte[] accountAgeWitnessSignatureOfOfferId,
+ long currentDate) {
super(messageVersion, tradeId, uid);
this.senderNodeAddress = senderNodeAddress;
this.tradeAmount = tradeAmount;
@@ -110,8 +115,10 @@ public final class PayDepositRequest extends TradeMessage {
this.takerFeeTxId = takerFeeTxId;
this.acceptedArbitratorNodeAddresses = acceptedArbitratorNodeAddresses;
this.acceptedMediatorNodeAddresses = acceptedMediatorNodeAddresses;
+ this.acceptedRefundAgentNodeAddresses = acceptedRefundAgentNodeAddresses;
this.arbitratorNodeAddress = arbitratorNodeAddress;
this.mediatorNodeAddress = mediatorNodeAddress;
+ this.refundAgentNodeAddress = refundAgentNodeAddress;
this.accountAgeWitnessSignatureOfOfferId = accountAgeWitnessSignatureOfOfferId;
this.currentDate = currentDate;
}
@@ -123,7 +130,7 @@ public final class PayDepositRequest extends TradeMessage {
@Override
public protobuf.NetworkEnvelope toProtoNetworkEnvelope() {
- protobuf.PayDepositRequest.Builder builder = protobuf.PayDepositRequest.newBuilder()
+ protobuf.InputsForDepositTxRequest.Builder builder = protobuf.InputsForDepositTxRequest.newBuilder()
.setTradeId(tradeId)
.setSenderNodeAddress(senderNodeAddress.toProtoMessage())
.setTradeAmount(tradeAmount)
@@ -144,20 +151,23 @@ public final class PayDepositRequest extends TradeMessage {
.map(NodeAddress::toProtoMessage).collect(Collectors.toList()))
.addAllAcceptedMediatorNodeAddresses(acceptedMediatorNodeAddresses.stream()
.map(NodeAddress::toProtoMessage).collect(Collectors.toList()))
- .setArbitratorNodeAddress(arbitratorNodeAddress.toProtoMessage())
+ .addAllAcceptedRefundAgentNodeAddresses(acceptedRefundAgentNodeAddresses.stream()
+ .map(NodeAddress::toProtoMessage).collect(Collectors.toList()))
.setMediatorNodeAddress(mediatorNodeAddress.toProtoMessage())
+ .setRefundAgentNodeAddress(refundAgentNodeAddress.toProtoMessage())
.setUid(uid);
Optional.ofNullable(changeOutputAddress).ifPresent(builder::setChangeOutputAddress);
Optional.ofNullable(accountAgeWitnessSignatureOfOfferId).ifPresent(e -> builder.setAccountAgeWitnessSignatureOfOfferId(ByteString.copyFrom(e)));
+ Optional.ofNullable(arbitratorNodeAddress).ifPresent(e -> builder.setArbitratorNodeAddress(arbitratorNodeAddress.toProtoMessage()));
builder.setCurrentDate(currentDate);
- return getNetworkEnvelopeBuilder().setPayDepositRequest(builder).build();
+ return getNetworkEnvelopeBuilder().setInputsForDepositTxRequest(builder).build();
}
- public static PayDepositRequest fromProto(protobuf.PayDepositRequest proto,
- CoreProtoResolver coreProtoResolver,
- int messageVersion) {
+ public static InputsForDepositTxRequest fromProto(protobuf.InputsForDepositTxRequest proto,
+ CoreProtoResolver coreProtoResolver,
+ int messageVersion) {
List rawTransactionInputs = proto.getRawTransactionInputsList().stream()
.map(rawTransactionInput -> new RawTransactionInput(rawTransactionInput.getIndex(),
rawTransactionInput.getParentTransaction().toByteArray(), rawTransactionInput.getValue()))
@@ -166,8 +176,10 @@ public final class PayDepositRequest extends TradeMessage {
.map(NodeAddress::fromProto).collect(Collectors.toList());
List acceptedMediatorNodeAddresses = proto.getAcceptedMediatorNodeAddressesList().stream()
.map(NodeAddress::fromProto).collect(Collectors.toList());
+ List acceptedRefundAgentNodeAddresses = proto.getAcceptedRefundAgentNodeAddressesList().stream()
+ .map(NodeAddress::fromProto).collect(Collectors.toList());
- return new PayDepositRequest(proto.getTradeId(),
+ return new InputsForDepositTxRequest(proto.getTradeId(),
NodeAddress.fromProto(proto.getSenderNodeAddress()),
proto.getTradeAmount(),
proto.getTradePrice(),
@@ -185,8 +197,10 @@ public final class PayDepositRequest extends TradeMessage {
proto.getTakerFeeTxId(),
acceptedArbitratorNodeAddresses,
acceptedMediatorNodeAddresses,
+ acceptedRefundAgentNodeAddresses,
NodeAddress.fromProto(proto.getArbitratorNodeAddress()),
NodeAddress.fromProto(proto.getMediatorNodeAddress()),
+ NodeAddress.fromProto(proto.getRefundAgentNodeAddress()),
proto.getUid(),
messageVersion,
ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessSignatureOfOfferId()),
@@ -195,7 +209,7 @@ public final class PayDepositRequest extends TradeMessage {
@Override
public String toString() {
- return "PayDepositRequest{" +
+ return "InputsForDepositTxRequest{" +
"\n senderNodeAddress=" + senderNodeAddress +
",\n tradeAmount=" + tradeAmount +
",\n tradePrice=" + tradePrice +
@@ -213,11 +227,12 @@ public final class PayDepositRequest extends TradeMessage {
",\n takerFeeTxId='" + takerFeeTxId + '\'' +
",\n acceptedArbitratorNodeAddresses=" + acceptedArbitratorNodeAddresses +
",\n acceptedMediatorNodeAddresses=" + acceptedMediatorNodeAddresses +
+ ",\n acceptedRefundAgentNodeAddresses=" + acceptedRefundAgentNodeAddresses +
",\n arbitratorNodeAddress=" + arbitratorNodeAddress +
",\n mediatorNodeAddress=" + mediatorNodeAddress +
- ",\n uid='" + uid + '\'' +
+ ",\n refundAgentNodeAddress=" + refundAgentNodeAddress +
",\n accountAgeWitnessSignatureOfOfferId=" + Utilities.bytesAsHexString(accountAgeWitnessSignatureOfOfferId) +
- ",\n currentDate=" + new Date(currentDate) +
+ ",\n currentDate=" + currentDate +
"\n} " + super.toString();
}
}
diff --git a/core/src/main/java/bisq/core/trade/messages/PublishDepositTxRequest.java b/core/src/main/java/bisq/core/trade/messages/InputsForDepositTxResponse.java
similarity index 69%
rename from core/src/main/java/bisq/core/trade/messages/PublishDepositTxRequest.java
rename to core/src/main/java/bisq/core/trade/messages/InputsForDepositTxResponse.java
index 7e115979fb..994be36e5b 100644
--- a/core/src/main/java/bisq/core/trade/messages/PublishDepositTxRequest.java
+++ b/core/src/main/java/bisq/core/trade/messages/InputsForDepositTxResponse.java
@@ -21,7 +21,7 @@ import bisq.core.btc.model.RawTransactionInput;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.proto.CoreProtoResolver;
-import bisq.network.p2p.MailboxMessage;
+import bisq.network.p2p.DirectMessage;
import bisq.network.p2p.NodeAddress;
import bisq.common.app.Version;
@@ -40,12 +40,9 @@ import lombok.Value;
import javax.annotation.Nullable;
-// We use a MailboxMessage here because the taker has paid already the trade fee and it could be that
-// we lost connection to him but we are complete on our side. So even if the peer is offline he can
-// continue later to complete the deposit tx.
@EqualsAndHashCode(callSuper = true)
@Value
-public final class PublishDepositTxRequest extends TradeMessage implements MailboxMessage {
+public final class InputsForDepositTxResponse extends TradeMessage implements DirectMessage {
private final PaymentAccountPayload makerPaymentAccountPayload;
private final String makerAccountId;
private final byte[] makerMultiSigPubKey;
@@ -60,20 +57,22 @@ public final class PublishDepositTxRequest extends TradeMessage implements Mailb
@Nullable
private final byte[] accountAgeWitnessSignatureOfPreparedDepositTx;
private final long currentDate;
+ private final long lockTime;
- public PublishDepositTxRequest(String tradeId,
- PaymentAccountPayload makerPaymentAccountPayload,
- String makerAccountId,
- byte[] makerMultiSigPubKey,
- String makerContractAsJson,
- String makerContractSignature,
- String makerPayoutAddressString,
- byte[] preparedDepositTx,
- List makerInputs,
- NodeAddress senderNodeAddress,
- String uid,
- @Nullable byte[] accountAgeWitnessSignatureOfPreparedDepositTx,
- long currentDate) {
+ public InputsForDepositTxResponse(String tradeId,
+ PaymentAccountPayload makerPaymentAccountPayload,
+ String makerAccountId,
+ byte[] makerMultiSigPubKey,
+ String makerContractAsJson,
+ String makerContractSignature,
+ String makerPayoutAddressString,
+ byte[] preparedDepositTx,
+ List makerInputs,
+ NodeAddress senderNodeAddress,
+ String uid,
+ @Nullable byte[] accountAgeWitnessSignatureOfPreparedDepositTx,
+ long currentDate,
+ long lockTime) {
this(tradeId,
makerPaymentAccountPayload,
makerAccountId,
@@ -87,7 +86,8 @@ public final class PublishDepositTxRequest extends TradeMessage implements Mailb
uid,
Version.getP2PMessageVersion(),
accountAgeWitnessSignatureOfPreparedDepositTx,
- currentDate);
+ currentDate,
+ lockTime);
}
@@ -95,20 +95,21 @@ public final class PublishDepositTxRequest extends TradeMessage implements Mailb
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
- private PublishDepositTxRequest(String tradeId,
- PaymentAccountPayload makerPaymentAccountPayload,
- String makerAccountId,
- byte[] makerMultiSigPubKey,
- String makerContractAsJson,
- String makerContractSignature,
- String makerPayoutAddressString,
- byte[] preparedDepositTx,
- List makerInputs,
- NodeAddress senderNodeAddress,
- String uid,
- int messageVersion,
- @Nullable byte[] accountAgeWitnessSignatureOfPreparedDepositTx,
- long currentDate) {
+ private InputsForDepositTxResponse(String tradeId,
+ PaymentAccountPayload makerPaymentAccountPayload,
+ String makerAccountId,
+ byte[] makerMultiSigPubKey,
+ String makerContractAsJson,
+ String makerContractSignature,
+ String makerPayoutAddressString,
+ byte[] preparedDepositTx,
+ List makerInputs,
+ NodeAddress senderNodeAddress,
+ String uid,
+ int messageVersion,
+ @Nullable byte[] accountAgeWitnessSignatureOfPreparedDepositTx,
+ long currentDate,
+ long lockTime) {
super(messageVersion, tradeId, uid);
this.makerPaymentAccountPayload = makerPaymentAccountPayload;
this.makerAccountId = makerAccountId;
@@ -121,11 +122,12 @@ public final class PublishDepositTxRequest extends TradeMessage implements Mailb
this.senderNodeAddress = senderNodeAddress;
this.accountAgeWitnessSignatureOfPreparedDepositTx = accountAgeWitnessSignatureOfPreparedDepositTx;
this.currentDate = currentDate;
+ this.lockTime = lockTime;
}
@Override
public protobuf.NetworkEnvelope toProtoNetworkEnvelope() {
- final protobuf.PublishDepositTxRequest.Builder builder = protobuf.PublishDepositTxRequest.newBuilder()
+ final protobuf.InputsForDepositTxResponse.Builder builder = protobuf.InputsForDepositTxResponse.newBuilder()
.setTradeId(tradeId)
.setMakerPaymentAccountPayload((protobuf.PaymentAccountPayload) makerPaymentAccountPayload.toProtoMessage())
.setMakerAccountId(makerAccountId)
@@ -136,22 +138,23 @@ public final class PublishDepositTxRequest extends TradeMessage implements Mailb
.setPreparedDepositTx(ByteString.copyFrom(preparedDepositTx))
.addAllMakerInputs(makerInputs.stream().map(RawTransactionInput::toProtoMessage).collect(Collectors.toList()))
.setSenderNodeAddress(senderNodeAddress.toProtoMessage())
- .setUid(uid);
+ .setUid(uid)
+ .setLockTime(lockTime);
Optional.ofNullable(accountAgeWitnessSignatureOfPreparedDepositTx).ifPresent(e -> builder.setAccountAgeWitnessSignatureOfPreparedDepositTx(ByteString.copyFrom(e)));
builder.setCurrentDate(currentDate);
return getNetworkEnvelopeBuilder()
- .setPublishDepositTxRequest(builder)
+ .setInputsForDepositTxResponse(builder)
.build();
}
- public static PublishDepositTxRequest fromProto(protobuf.PublishDepositTxRequest proto, CoreProtoResolver coreProtoResolver, int messageVersion) {
+ public static InputsForDepositTxResponse fromProto(protobuf.InputsForDepositTxResponse proto, CoreProtoResolver coreProtoResolver, int messageVersion) {
List makerInputs = proto.getMakerInputsList().stream()
.map(RawTransactionInput::fromProto)
.collect(Collectors.toList());
- return new PublishDepositTxRequest(proto.getTradeId(),
+ return new InputsForDepositTxResponse(proto.getTradeId(),
coreProtoResolver.fromProto(proto.getMakerPaymentAccountPayload()),
proto.getMakerAccountId(),
proto.getMakerMultiSigPubKey().toByteArray(),
@@ -164,13 +167,14 @@ public final class PublishDepositTxRequest extends TradeMessage implements Mailb
proto.getUid(),
messageVersion,
ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessSignatureOfPreparedDepositTx()),
- proto.getCurrentDate());
+ proto.getCurrentDate(),
+ proto.getLockTime());
}
@Override
public String toString() {
- return "PublishDepositTxRequest{" +
+ return "InputsForDepositTxResponse{" +
"\n makerPaymentAccountPayload=" + makerPaymentAccountPayload +
",\n makerAccountId='" + makerAccountId + '\'' +
",\n makerMultiSigPubKey=" + Utilities.bytesAsHexString(makerMultiSigPubKey) +
@@ -183,6 +187,7 @@ public final class PublishDepositTxRequest extends TradeMessage implements Mailb
",\n uid='" + uid + '\'' +
",\n accountAgeWitnessSignatureOfPreparedDepositTx=" + Utilities.bytesAsHexString(accountAgeWitnessSignatureOfPreparedDepositTx) +
",\n currentDate=" + new Date(currentDate) +
+ ",\n lockTime=" + lockTime +
"\n} " + super.toString();
}
}
diff --git a/core/src/main/java/bisq/core/trade/messages/PeerPublishedDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/messages/PeerPublishedDelayedPayoutTxMessage.java
new file mode 100644
index 0000000000..9447f9494f
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/messages/PeerPublishedDelayedPayoutTxMessage.java
@@ -0,0 +1,77 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.messages;
+
+import bisq.network.p2p.MailboxMessage;
+import bisq.network.p2p.NodeAddress;
+
+import bisq.common.app.Version;
+
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+
+@EqualsAndHashCode(callSuper = true)
+@Value
+public final class PeerPublishedDelayedPayoutTxMessage extends TradeMessage implements MailboxMessage {
+ private final NodeAddress senderNodeAddress;
+
+ public PeerPublishedDelayedPayoutTxMessage(String uid,
+ String tradeId,
+ NodeAddress senderNodeAddress) {
+ this(Version.getP2PMessageVersion(),
+ uid,
+ tradeId,
+ senderNodeAddress);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // PROTO BUFFER
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ private PeerPublishedDelayedPayoutTxMessage(int messageVersion,
+ String uid,
+ String tradeId,
+ NodeAddress senderNodeAddress) {
+ super(messageVersion, tradeId, uid);
+ this.senderNodeAddress = senderNodeAddress;
+ }
+
+ @Override
+ public protobuf.NetworkEnvelope toProtoNetworkEnvelope() {
+ final protobuf.PeerPublishedDelayedPayoutTxMessage.Builder builder = protobuf.PeerPublishedDelayedPayoutTxMessage.newBuilder();
+ builder.setUid(uid)
+ .setTradeId(tradeId)
+ .setSenderNodeAddress(senderNodeAddress.toProtoMessage());
+ return getNetworkEnvelopeBuilder().setPeerPublishedDelayedPayoutTxMessage(builder).build();
+ }
+
+ public static PeerPublishedDelayedPayoutTxMessage fromProto(protobuf.PeerPublishedDelayedPayoutTxMessage proto, int messageVersion) {
+ return new PeerPublishedDelayedPayoutTxMessage(messageVersion,
+ proto.getUid(),
+ proto.getTradeId(),
+ NodeAddress.fromProto(proto.getSenderNodeAddress()));
+ }
+
+ @Override
+ public String toString() {
+ return "PeerPublishedDelayedPayoutTxMessage{" +
+ "\n senderNodeAddress=" + senderNodeAddress +
+ "\n} " + super.toString();
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/messages/TradeMessage.java b/core/src/main/java/bisq/core/trade/messages/TradeMessage.java
index 5b386e2e1e..e90cbb0265 100644
--- a/core/src/main/java/bisq/core/trade/messages/TradeMessage.java
+++ b/core/src/main/java/bisq/core/trade/messages/TradeMessage.java
@@ -17,7 +17,6 @@
package bisq.core.trade.messages;
-import bisq.network.p2p.DirectMessage;
import bisq.network.p2p.UidMessage;
import bisq.common.proto.network.NetworkEnvelope;
@@ -29,7 +28,7 @@ import lombok.ToString;
@EqualsAndHashCode(callSuper = true)
@Getter
@ToString
-public abstract class TradeMessage extends NetworkEnvelope implements DirectMessage, UidMessage {
+public abstract class TradeMessage extends NetworkEnvelope implements UidMessage {
protected final String tradeId;
protected final String uid;
diff --git a/core/src/main/java/bisq/core/trade/protocol/BuyerAsMakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/BuyerAsMakerProtocol.java
index dd68fd16f0..236e6d47b0 100644
--- a/core/src/main/java/bisq/core/trade/protocol/BuyerAsMakerProtocol.java
+++ b/core/src/main/java/bisq/core/trade/protocol/BuyerAsMakerProtocol.java
@@ -19,38 +19,40 @@ package bisq.core.trade.protocol;
import bisq.core.trade.BuyerAsMakerTrade;
import bisq.core.trade.Trade;
-import bisq.core.trade.messages.DepositTxPublishedMessage;
-import bisq.core.trade.messages.PayDepositRequest;
+import bisq.core.trade.messages.DelayedPayoutTxSignatureRequest;
+import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage;
+import bisq.core.trade.messages.InputsForDepositTxRequest;
import bisq.core.trade.messages.PayoutTxPublishedMessage;
import bisq.core.trade.messages.TradeMessage;
import bisq.core.trade.protocol.tasks.ApplyFilter;
import bisq.core.trade.protocol.tasks.PublishTradeStatistics;
import bisq.core.trade.protocol.tasks.VerifyPeersAccountAgeWitness;
+import bisq.core.trade.protocol.tasks.buyer.BuyerProcessDelayedPayoutTxSignatureRequest;
+import bisq.core.trade.protocol.tasks.buyer.BuyerProcessDepositTxAndDelayedPayoutTxMessage;
import bisq.core.trade.protocol.tasks.buyer.BuyerProcessPayoutTxPublishedMessage;
import bisq.core.trade.protocol.tasks.buyer.BuyerSendCounterCurrencyTransferStartedMessage;
+import bisq.core.trade.protocol.tasks.buyer.BuyerSendsDelayedPayoutTxSignatureResponse;
+import bisq.core.trade.protocol.tasks.buyer.BuyerSetupDepositTxListener;
import bisq.core.trade.protocol.tasks.buyer.BuyerSetupPayoutTxListener;
+import bisq.core.trade.protocol.tasks.buyer.BuyerSignPayoutTx;
+import bisq.core.trade.protocol.tasks.buyer.BuyerSignsDelayedPayoutTx;
+import bisq.core.trade.protocol.tasks.buyer.BuyerVerifiesDelayedPayoutTx;
import bisq.core.trade.protocol.tasks.buyer_as_maker.BuyerAsMakerCreatesAndSignsDepositTx;
-import bisq.core.trade.protocol.tasks.buyer_as_maker.BuyerAsMakerSignPayoutTx;
+import bisq.core.trade.protocol.tasks.buyer_as_maker.BuyerAsMakerSendsInputsForDepositTxResponse;
import bisq.core.trade.protocol.tasks.maker.MakerCreateAndSignContract;
-import bisq.core.trade.protocol.tasks.maker.MakerProcessDepositTxPublishedMessage;
-import bisq.core.trade.protocol.tasks.maker.MakerProcessPayDepositRequest;
-import bisq.core.trade.protocol.tasks.maker.MakerSendPublishDepositTxRequest;
-import bisq.core.trade.protocol.tasks.maker.MakerSetupDepositTxListener;
+import bisq.core.trade.protocol.tasks.maker.MakerProcessesInputsForDepositTxRequest;
+import bisq.core.trade.protocol.tasks.maker.MakerSetsLockTime;
import bisq.core.trade.protocol.tasks.maker.MakerVerifyTakerAccount;
import bisq.core.trade.protocol.tasks.maker.MakerVerifyTakerFeePayment;
import bisq.core.util.Validator;
-import bisq.network.p2p.MailboxMessage;
import bisq.network.p2p.NodeAddress;
import bisq.common.handlers.ErrorMessageHandler;
import bisq.common.handlers.ResultHandler;
-import bisq.common.proto.network.NetworkEnvelope;
import lombok.extern.slf4j.Slf4j;
-import static com.google.common.base.Preconditions.checkArgument;
-
@Slf4j
public class BuyerAsMakerProtocol extends TradeProtocol implements BuyerProtocol, MakerProtocol {
private final BuyerAsMakerTrade buyerAsMakerTrade;
@@ -68,10 +70,10 @@ public class BuyerAsMakerProtocol extends TradeProtocol implements BuyerProtocol
Trade.Phase phase = trade.getState().getPhase();
if (phase == Trade.Phase.TAKER_FEE_PUBLISHED) {
TradeTaskRunner taskRunner = new TradeTaskRunner(trade,
- () -> handleTaskRunnerSuccess("MakerSetupDepositTxListener"),
+ () -> handleTaskRunnerSuccess("BuyerSetupDepositTxListener"),
this::handleTaskRunnerFault);
- taskRunner.addTasks(MakerSetupDepositTxListener.class);
+ taskRunner.addTasks(BuyerSetupDepositTxListener.class);
taskRunner.run();
} else if (trade.isFiatSent() && !trade.isPayoutPublished()) {
TradeTaskRunner taskRunner = new TradeTaskRunner(trade,
@@ -89,23 +91,13 @@ public class BuyerAsMakerProtocol extends TradeProtocol implements BuyerProtocol
///////////////////////////////////////////////////////////////////////////////////////////
@Override
- public void doApplyMailboxMessage(NetworkEnvelope networkEnvelope, Trade trade) {
- this.trade = trade;
+ public void doApplyMailboxTradeMessage(TradeMessage tradeMessage, NodeAddress peerNodeAddress) {
+ super.doApplyMailboxTradeMessage(tradeMessage, peerNodeAddress);
- if (networkEnvelope instanceof MailboxMessage) {
- MailboxMessage mailboxMessage = (MailboxMessage) networkEnvelope;
- NodeAddress peerNodeAddress = mailboxMessage.getSenderNodeAddress();
- if (networkEnvelope instanceof TradeMessage) {
- TradeMessage tradeMessage = (TradeMessage) networkEnvelope;
- log.info("Received {} as MailboxMessage from {} with tradeId {} and uid {}",
- tradeMessage.getClass().getSimpleName(), peerNodeAddress, tradeMessage.getTradeId(), tradeMessage.getUid());
- if (tradeMessage instanceof DepositTxPublishedMessage)
- handle((DepositTxPublishedMessage) tradeMessage, peerNodeAddress);
- else if (tradeMessage instanceof PayoutTxPublishedMessage)
- handle((PayoutTxPublishedMessage) tradeMessage, peerNodeAddress);
- else
- log.error("We received an unhandled tradeMessage" + tradeMessage.toString());
- }
+ if (tradeMessage instanceof DepositTxAndDelayedPayoutTxMessage) {
+ handle((DepositTxAndDelayedPayoutTxMessage) tradeMessage, peerNodeAddress);
+ } else if (tradeMessage instanceof PayoutTxPublishedMessage) {
+ handle((PayoutTxPublishedMessage) tradeMessage, peerNodeAddress);
}
}
@@ -115,11 +107,10 @@ public class BuyerAsMakerProtocol extends TradeProtocol implements BuyerProtocol
///////////////////////////////////////////////////////////////////////////////////////////
@Override
- public void handleTakeOfferRequest(TradeMessage tradeMessage,
+ public void handleTakeOfferRequest(InputsForDepositTxRequest tradeMessage,
NodeAddress peerNodeAddress,
ErrorMessageHandler errorMessageHandler) {
Validator.checkTradeId(processModel.getOfferId(), tradeMessage);
- checkArgument(tradeMessage instanceof PayDepositRequest);
processModel.setTradeMessage(tradeMessage);
processModel.setTempTradingPeerNodeAddress(peerNodeAddress);
@@ -130,15 +121,16 @@ public class BuyerAsMakerProtocol extends TradeProtocol implements BuyerProtocol
handleTaskRunnerFault(errorMessage);
});
taskRunner.addTasks(
- MakerProcessPayDepositRequest.class,
+ MakerProcessesInputsForDepositTxRequest.class,
ApplyFilter.class,
MakerVerifyTakerAccount.class,
VerifyPeersAccountAgeWitness.class,
MakerVerifyTakerFeePayment.class,
+ MakerSetsLockTime.class,
MakerCreateAndSignContract.class,
BuyerAsMakerCreatesAndSignsDepositTx.class,
- MakerSetupDepositTxListener.class,
- MakerSendPublishDepositTxRequest.class
+ BuyerSetupDepositTxListener.class,
+ BuyerAsMakerSendsInputsForDepositTxResponse.class
);
// We don't use a timeout here because if the DepositTxPublishedMessage does not arrive we
// get the deposit tx set at MakerSetupDepositTxListener once it is seen in the bitcoin network
@@ -150,19 +142,35 @@ public class BuyerAsMakerProtocol extends TradeProtocol implements BuyerProtocol
// Incoming message handling
///////////////////////////////////////////////////////////////////////////////////////////
- private void handle(DepositTxPublishedMessage tradeMessage, NodeAddress peerNodeAddress) {
+ private void handle(DelayedPayoutTxSignatureRequest tradeMessage, NodeAddress peerNodeAddress) {
processModel.setTradeMessage(tradeMessage);
processModel.setTempTradingPeerNodeAddress(peerNodeAddress);
TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsMakerTrade,
() -> {
- handleTaskRunnerSuccess(tradeMessage, "handle DepositTxPublishedMessage");
+ handleTaskRunnerSuccess(tradeMessage, "handle DelayedPayoutTxSignatureRequest");
},
errorMessage -> handleTaskRunnerFault(tradeMessage, errorMessage));
taskRunner.addTasks(
- MakerProcessDepositTxPublishedMessage.class,
- MakerVerifyTakerAccount.class,
- MakerVerifyTakerFeePayment.class,
+ BuyerProcessDelayedPayoutTxSignatureRequest.class,
+ BuyerSignsDelayedPayoutTx.class,
+ BuyerSendsDelayedPayoutTxSignatureResponse.class
+ );
+ taskRunner.run();
+ }
+
+ private void handle(DepositTxAndDelayedPayoutTxMessage tradeMessage, NodeAddress peerNodeAddress) {
+ processModel.setTradeMessage(tradeMessage);
+ processModel.setTempTradingPeerNodeAddress(peerNodeAddress);
+
+ TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsMakerTrade,
+ () -> {
+ handleTaskRunnerSuccess(tradeMessage, "handle DepositTxAndDelayedPayoutTxMessage");
+ },
+ errorMessage -> handleTaskRunnerFault(tradeMessage, errorMessage));
+ taskRunner.addTasks(
+ BuyerProcessDepositTxAndDelayedPayoutTxMessage.class,
+ BuyerVerifiesDelayedPayoutTx.class,
PublishTradeStatistics.class
);
taskRunner.run();
@@ -191,7 +199,7 @@ public class BuyerAsMakerProtocol extends TradeProtocol implements BuyerProtocol
ApplyFilter.class,
MakerVerifyTakerAccount.class,
MakerVerifyTakerFeePayment.class,
- BuyerAsMakerSignPayoutTx.class,
+ BuyerSignPayoutTx.class,
BuyerSendCounterCurrencyTransferStartedMessage.class,
BuyerSetupPayoutTxListener.class
);
@@ -232,8 +240,10 @@ public class BuyerAsMakerProtocol extends TradeProtocol implements BuyerProtocol
log.info("Received {} from {} with tradeId {} and uid {}",
tradeMessage.getClass().getSimpleName(), sender, tradeMessage.getTradeId(), tradeMessage.getUid());
- if (tradeMessage instanceof DepositTxPublishedMessage) {
- handle((DepositTxPublishedMessage) tradeMessage, sender);
+ if (tradeMessage instanceof DelayedPayoutTxSignatureRequest) {
+ handle((DelayedPayoutTxSignatureRequest) tradeMessage, sender);
+ } else if (tradeMessage instanceof DepositTxAndDelayedPayoutTxMessage) {
+ handle((DepositTxAndDelayedPayoutTxMessage) tradeMessage, sender);
} else if (tradeMessage instanceof PayoutTxPublishedMessage) {
handle((PayoutTxPublishedMessage) tradeMessage, sender);
}
diff --git a/core/src/main/java/bisq/core/trade/protocol/BuyerAsTakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/BuyerAsTakerProtocol.java
index 36b868cd90..6047236501 100644
--- a/core/src/main/java/bisq/core/trade/protocol/BuyerAsTakerProtocol.java
+++ b/core/src/main/java/bisq/core/trade/protocol/BuyerAsTakerProtocol.java
@@ -18,38 +18,47 @@
package bisq.core.trade.protocol;
+import bisq.core.offer.Offer;
import bisq.core.trade.BuyerAsTakerTrade;
import bisq.core.trade.Trade;
+import bisq.core.trade.messages.DelayedPayoutTxSignatureRequest;
+import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage;
+import bisq.core.trade.messages.InputsForDepositTxResponse;
import bisq.core.trade.messages.PayoutTxPublishedMessage;
-import bisq.core.trade.messages.PublishDepositTxRequest;
import bisq.core.trade.messages.TradeMessage;
import bisq.core.trade.protocol.tasks.ApplyFilter;
import bisq.core.trade.protocol.tasks.PublishTradeStatistics;
import bisq.core.trade.protocol.tasks.VerifyPeersAccountAgeWitness;
+import bisq.core.trade.protocol.tasks.buyer.BuyerProcessDelayedPayoutTxSignatureRequest;
+import bisq.core.trade.protocol.tasks.buyer.BuyerProcessDepositTxAndDelayedPayoutTxMessage;
import bisq.core.trade.protocol.tasks.buyer.BuyerProcessPayoutTxPublishedMessage;
import bisq.core.trade.protocol.tasks.buyer.BuyerSendCounterCurrencyTransferStartedMessage;
+import bisq.core.trade.protocol.tasks.buyer.BuyerSendsDelayedPayoutTxSignatureResponse;
+import bisq.core.trade.protocol.tasks.buyer.BuyerSetupDepositTxListener;
import bisq.core.trade.protocol.tasks.buyer.BuyerSetupPayoutTxListener;
-import bisq.core.trade.protocol.tasks.buyer_as_maker.BuyerAsMakerSignPayoutTx;
+import bisq.core.trade.protocol.tasks.buyer.BuyerSignPayoutTx;
+import bisq.core.trade.protocol.tasks.buyer.BuyerSignsDelayedPayoutTx;
+import bisq.core.trade.protocol.tasks.buyer.BuyerVerifiesDelayedPayoutTx;
import bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerCreatesDepositTxInputs;
-import bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerSignAndPublishDepositTx;
+import bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerSendsDepositTxMessage;
+import bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerSignsDepositTx;
import bisq.core.trade.protocol.tasks.taker.CreateTakerFeeTx;
-import bisq.core.trade.protocol.tasks.taker.TakerProcessPublishDepositTxRequest;
+import bisq.core.trade.protocol.tasks.taker.TakerProcessesInputsForDepositTxResponse;
import bisq.core.trade.protocol.tasks.taker.TakerPublishFeeTx;
-import bisq.core.trade.protocol.tasks.taker.TakerSendDepositTxPublishedMessage;
-import bisq.core.trade.protocol.tasks.taker.TakerSendPayDepositRequest;
+import bisq.core.trade.protocol.tasks.taker.TakerSendInputsForDepositTxRequest;
import bisq.core.trade.protocol.tasks.taker.TakerVerifyAndSignContract;
import bisq.core.trade.protocol.tasks.taker.TakerVerifyMakerAccount;
import bisq.core.trade.protocol.tasks.taker.TakerVerifyMakerFeePayment;
-import bisq.network.p2p.MailboxMessage;
import bisq.network.p2p.NodeAddress;
import bisq.common.handlers.ErrorMessageHandler;
import bisq.common.handlers.ResultHandler;
-import bisq.common.proto.network.NetworkEnvelope;
import lombok.extern.slf4j.Slf4j;
+import static com.google.common.base.Preconditions.checkNotNull;
+
@Slf4j
public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol, TakerProtocol {
private final BuyerAsTakerTrade buyerAsTakerTrade;
@@ -64,9 +73,18 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol
this.buyerAsTakerTrade = trade;
- processModel.getTradingPeer().setPubKeyRing(trade.getOffer().getPubKeyRing());
+ Offer offer = checkNotNull(trade.getOffer());
+ processModel.getTradingPeer().setPubKeyRing(offer.getPubKeyRing());
- if (trade.isFiatSent() && !trade.isPayoutPublished()) {
+ Trade.Phase phase = trade.getState().getPhase();
+ if (phase == Trade.Phase.TAKER_FEE_PUBLISHED) {
+ TradeTaskRunner taskRunner = new TradeTaskRunner(trade,
+ () -> handleTaskRunnerSuccess("BuyerSetupDepositTxListener"),
+ this::handleTaskRunnerFault);
+
+ taskRunner.addTasks(BuyerSetupDepositTxListener.class);
+ taskRunner.run();
+ } else if (trade.isFiatSent() && !trade.isPayoutPublished()) {
TradeTaskRunner taskRunner = new TradeTaskRunner(trade,
() -> handleTaskRunnerSuccess("BuyerSetupPayoutTxListener"),
this::handleTaskRunnerFault);
@@ -82,22 +100,13 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol
///////////////////////////////////////////////////////////////////////////////////////////
@Override
- public void doApplyMailboxMessage(NetworkEnvelope networkEnvelope, Trade trade) {
- this.trade = trade;
+ public void doApplyMailboxTradeMessage(TradeMessage tradeMessage, NodeAddress peerNodeAddress) {
+ super.doApplyMailboxTradeMessage(tradeMessage, peerNodeAddress);
- if (networkEnvelope instanceof MailboxMessage) {
- final NodeAddress peerNodeAddress = ((MailboxMessage) networkEnvelope).getSenderNodeAddress();
- if (networkEnvelope instanceof TradeMessage) {
- TradeMessage tradeMessage = (TradeMessage) networkEnvelope;
- log.info("Received {} as MailboxMessage from {} with tradeId {} and uid {}",
- tradeMessage.getClass().getSimpleName(), peerNodeAddress, tradeMessage.getTradeId(), tradeMessage.getUid());
- if (tradeMessage instanceof PublishDepositTxRequest)
- handle((PublishDepositTxRequest) tradeMessage, peerNodeAddress);
- else if (tradeMessage instanceof PayoutTxPublishedMessage) {
- handle((PayoutTxPublishedMessage) tradeMessage, peerNodeAddress);
- } else
- log.error("We received an unhandled tradeMessage" + tradeMessage.toString());
- }
+ if (tradeMessage instanceof DepositTxAndDelayedPayoutTxMessage) {
+ handle((DepositTxAndDelayedPayoutTxMessage) tradeMessage, peerNodeAddress);
+ } else if (tradeMessage instanceof PayoutTxPublishedMessage) {
+ handle((PayoutTxPublishedMessage) tradeMessage, peerNodeAddress);
}
}
@@ -117,7 +126,7 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol
TakerVerifyMakerFeePayment.class,
CreateTakerFeeTx.class,
BuyerAsTakerCreatesDepositTxInputs.class,
- TakerSendPayDepositRequest.class
+ TakerSendInputsForDepositTxRequest.class
);
//TODO if peer does get an error he does not respond and all we get is the timeout now knowing why it failed.
@@ -131,7 +140,7 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol
// Incoming message handling
///////////////////////////////////////////////////////////////////////////////////////////
- private void handle(PublishDepositTxRequest tradeMessage, NodeAddress sender) {
+ private void handle(InputsForDepositTxResponse tradeMessage, NodeAddress sender) {
processModel.setTradeMessage(tradeMessage);
processModel.setTempTradingPeerNodeAddress(sender);
@@ -142,15 +151,50 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol
},
errorMessage -> handleTaskRunnerFault(tradeMessage, errorMessage));
taskRunner.addTasks(
- TakerProcessPublishDepositTxRequest.class,
+ TakerProcessesInputsForDepositTxResponse.class,
ApplyFilter.class,
TakerVerifyMakerAccount.class,
VerifyPeersAccountAgeWitness.class,
TakerVerifyMakerFeePayment.class,
TakerVerifyAndSignContract.class,
TakerPublishFeeTx.class,
- BuyerAsTakerSignAndPublishDepositTx.class,
- TakerSendDepositTxPublishedMessage.class,
+ BuyerAsTakerSignsDepositTx.class,
+ BuyerSetupDepositTxListener.class,
+ BuyerAsTakerSendsDepositTxMessage.class
+ );
+ taskRunner.run();
+ }
+
+ private void handle(DelayedPayoutTxSignatureRequest tradeMessage, NodeAddress sender) {
+ processModel.setTradeMessage(tradeMessage);
+ processModel.setTempTradingPeerNodeAddress(sender);
+
+ TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsTakerTrade,
+ () -> {
+ handleTaskRunnerSuccess(tradeMessage, "handle DelayedPayoutTxSignatureRequest");
+ },
+ errorMessage -> handleTaskRunnerFault(tradeMessage, errorMessage));
+ taskRunner.addTasks(
+ BuyerProcessDelayedPayoutTxSignatureRequest.class,
+ BuyerSignsDelayedPayoutTx.class,
+ BuyerSendsDelayedPayoutTxSignatureResponse.class
+ );
+ taskRunner.run();
+ }
+
+
+ private void handle(DepositTxAndDelayedPayoutTxMessage tradeMessage, NodeAddress peerNodeAddress) {
+ processModel.setTradeMessage(tradeMessage);
+ processModel.setTempTradingPeerNodeAddress(peerNodeAddress);
+
+ TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsTakerTrade,
+ () -> {
+ handleTaskRunnerSuccess(tradeMessage, "handle DepositTxAndDelayedPayoutTxMessage");
+ },
+ errorMessage -> handleTaskRunnerFault(tradeMessage, errorMessage));
+ taskRunner.addTasks(
+ BuyerProcessDepositTxAndDelayedPayoutTxMessage.class,
+ BuyerVerifiesDelayedPayoutTx.class,
PublishTradeStatistics.class
);
taskRunner.run();
@@ -180,7 +224,7 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol
ApplyFilter.class,
TakerVerifyMakerAccount.class,
TakerVerifyMakerFeePayment.class,
- BuyerAsMakerSignPayoutTx.class,
+ BuyerSignPayoutTx.class,
BuyerSendCounterCurrencyTransferStartedMessage.class,
BuyerSetupPayoutTxListener.class
);
@@ -221,8 +265,12 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol
log.info("Received {} from {} with tradeId {} and uid {}",
tradeMessage.getClass().getSimpleName(), sender, tradeMessage.getTradeId(), tradeMessage.getUid());
- if (tradeMessage instanceof PublishDepositTxRequest) {
- handle((PublishDepositTxRequest) tradeMessage, sender);
+ if (tradeMessage instanceof InputsForDepositTxResponse) {
+ handle((InputsForDepositTxResponse) tradeMessage, sender);
+ } else if (tradeMessage instanceof DelayedPayoutTxSignatureRequest) {
+ handle((DelayedPayoutTxSignatureRequest) tradeMessage, sender);
+ } else if (tradeMessage instanceof DepositTxAndDelayedPayoutTxMessage) {
+ handle((DepositTxAndDelayedPayoutTxMessage) tradeMessage, sender);
} else if (tradeMessage instanceof PayoutTxPublishedMessage) {
handle((PayoutTxPublishedMessage) tradeMessage, sender);
}
diff --git a/core/src/main/java/bisq/core/trade/protocol/MakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/MakerProtocol.java
index a95c78bfeb..d460289e3f 100644
--- a/core/src/main/java/bisq/core/trade/protocol/MakerProtocol.java
+++ b/core/src/main/java/bisq/core/trade/protocol/MakerProtocol.java
@@ -18,12 +18,12 @@
package bisq.core.trade.protocol;
-import bisq.core.trade.messages.TradeMessage;
+import bisq.core.trade.messages.InputsForDepositTxRequest;
import bisq.network.p2p.NodeAddress;
import bisq.common.handlers.ErrorMessageHandler;
public interface MakerProtocol {
- void handleTakeOfferRequest(TradeMessage message, NodeAddress taker, ErrorMessageHandler errorMessageHandler);
+ void handleTakeOfferRequest(InputsForDepositTxRequest message, NodeAddress taker, ErrorMessageHandler errorMessageHandler);
}
diff --git a/core/src/main/java/bisq/core/trade/protocol/ProcessModel.java b/core/src/main/java/bisq/core/trade/protocol/ProcessModel.java
index f2b180926a..9e25fa1a0f 100644
--- a/core/src/main/java/bisq/core/trade/protocol/ProcessModel.java
+++ b/core/src/main/java/bisq/core/trade/protocol/ProcessModel.java
@@ -22,6 +22,7 @@ import bisq.core.btc.model.RawTransactionInput;
import bisq.core.btc.wallet.BsqWalletService;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.btc.wallet.TradeWalletService;
+import bisq.core.dao.DaoFacade;
import bisq.core.filter.FilterManager;
import bisq.core.network.MessageState;
import bisq.core.offer.Offer;
@@ -31,6 +32,7 @@ import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.proto.CoreProtoResolver;
import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager;
import bisq.core.support.dispute.mediation.mediator.MediatorManager;
+import bisq.core.support.dispute.refund.refundagent.RefundAgentManager;
import bisq.core.trade.MakerTrade;
import bisq.core.trade.Trade;
import bisq.core.trade.TradeManager;
@@ -69,6 +71,10 @@ import lombok.extern.slf4j.Slf4j;
import javax.annotation.Nullable;
+// Fields marked as transient are only used during protocol execution which are based on directMessages so we do not
+// persist them.
+//todo clean up older fields as well to make most transient
+
@Getter
@Slf4j
public class ProcessModel implements Model, PersistablePayload {
@@ -78,6 +84,7 @@ public class ProcessModel implements Model, PersistablePayload {
transient private BtcWalletService btcWalletService;
transient private BsqWalletService bsqWalletService;
transient private TradeWalletService tradeWalletService;
+ transient private DaoFacade daoFacade;
transient private Offer offer;
transient private User user;
transient private FilterManager filterManager;
@@ -85,6 +92,7 @@ public class ProcessModel implements Model, PersistablePayload {
transient private TradeStatisticsManager tradeStatisticsManager;
transient private ArbitratorManager arbitratorManager;
transient private MediatorManager mediatorManager;
+ transient private RefundAgentManager refundAgentManager;
transient private KeyRing keyRing;
transient private P2PService p2PService;
transient private ReferralIdService referralIdService;
@@ -96,32 +104,29 @@ public class ProcessModel implements Model, PersistablePayload {
@Setter
transient private DecryptedMessageWithPubKey decryptedMessageWithPubKey;
+ // Added in v1.2.0
+ @Setter
+ @Nullable
+ transient private byte[] delayedPayoutTxSignature;
+ @Setter
+ @Nullable
+ transient private Transaction preparedDelayedPayoutTx;
- // Persistable Immutable (only set by PB)
- @Setter
+ // Persistable Immutable (private setter only used by PB method)
private TradingPeer tradingPeer = new TradingPeer();
- @Setter
private String offerId;
- @Setter
private String accountId;
- @Setter
private PubKeyRing pubKeyRing;
// Persistable Mutable
@Nullable
- @Setter
+ @Setter()
private String takeOfferFeeTxId;
@Nullable
@Setter
private byte[] payoutTxSignature;
@Nullable
@Setter
- private List takerAcceptedArbitratorNodeAddresses;
- @Nullable
- @Setter
- private List takerAcceptedMediatorNodeAddresses;
- @Nullable
- @Setter
private byte[] preparedDepositTx;
@Nullable
@Setter
@@ -182,14 +187,13 @@ public class ProcessModel implements Model, PersistablePayload {
Optional.ofNullable(takeOfferFeeTxId).ifPresent(builder::setTakeOfferFeeTxId);
Optional.ofNullable(payoutTxSignature).ifPresent(e -> builder.setPayoutTxSignature(ByteString.copyFrom(payoutTxSignature)));
- Optional.ofNullable(takerAcceptedArbitratorNodeAddresses).ifPresent(e -> builder.addAllTakerAcceptedArbitratorNodeAddresses(ProtoUtil.collectionToProto(takerAcceptedArbitratorNodeAddresses)));
- Optional.ofNullable(takerAcceptedMediatorNodeAddresses).ifPresent(e -> builder.addAllTakerAcceptedMediatorNodeAddresses(ProtoUtil.collectionToProto(takerAcceptedMediatorNodeAddresses)));
Optional.ofNullable(preparedDepositTx).ifPresent(e -> builder.setPreparedDepositTx(ByteString.copyFrom(preparedDepositTx)));
Optional.ofNullable(rawTransactionInputs).ifPresent(e -> builder.addAllRawTransactionInputs(ProtoUtil.collectionToProto(rawTransactionInputs)));
Optional.ofNullable(changeOutputAddress).ifPresent(builder::setChangeOutputAddress);
Optional.ofNullable(myMultiSigPubKey).ifPresent(e -> builder.setMyMultiSigPubKey(ByteString.copyFrom(myMultiSigPubKey)));
Optional.ofNullable(tempTradingPeerNodeAddress).ifPresent(e -> builder.setTempTradingPeerNodeAddress(tempTradingPeerNodeAddress.toProtoMessage()));
Optional.ofNullable(mediatedPayoutTxSignature).ifPresent(e -> builder.setMediatedPayoutTxSignature(ByteString.copyFrom(e)));
+
return builder.build();
}
@@ -208,14 +212,6 @@ public class ProcessModel implements Model, PersistablePayload {
// nullable
processModel.setTakeOfferFeeTxId(ProtoUtil.stringOrNullFromProto(proto.getTakeOfferFeeTxId()));
processModel.setPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getPayoutTxSignature()));
- List takerAcceptedArbitratorNodeAddresses = proto.getTakerAcceptedArbitratorNodeAddressesList().isEmpty() ?
- null : proto.getTakerAcceptedArbitratorNodeAddressesList().stream()
- .map(NodeAddress::fromProto).collect(Collectors.toList());
- List takerAcceptedMediatorNodeAddresses = proto.getTakerAcceptedMediatorNodeAddressesList().isEmpty() ?
- null : proto.getTakerAcceptedMediatorNodeAddressesList().stream()
- .map(NodeAddress::fromProto).collect(Collectors.toList());
- processModel.setTakerAcceptedArbitratorNodeAddresses(takerAcceptedArbitratorNodeAddresses);
- processModel.setTakerAcceptedMediatorNodeAddresses(takerAcceptedMediatorNodeAddresses);
processModel.setPreparedDepositTx(ProtoUtil.byteArrayOrNullFromProto(proto.getPreparedDepositTx()));
List rawTransactionInputs = proto.getRawTransactionInputsList().isEmpty() ?
null : proto.getRawTransactionInputsList().stream()
@@ -243,6 +239,7 @@ public class ProcessModel implements Model, PersistablePayload {
BtcWalletService walletService,
BsqWalletService bsqWalletService,
TradeWalletService tradeWalletService,
+ DaoFacade daoFacade,
ReferralIdService referralIdService,
User user,
FilterManager filterManager,
@@ -250,6 +247,7 @@ public class ProcessModel implements Model, PersistablePayload {
TradeStatisticsManager tradeStatisticsManager,
ArbitratorManager arbitratorManager,
MediatorManager mediatorManager,
+ RefundAgentManager refundAgentManager,
KeyRing keyRing,
boolean useSavingsWallet,
Coin fundsNeededForTrade) {
@@ -259,6 +257,7 @@ public class ProcessModel implements Model, PersistablePayload {
this.btcWalletService = walletService;
this.bsqWalletService = bsqWalletService;
this.tradeWalletService = tradeWalletService;
+ this.daoFacade = daoFacade;
this.referralIdService = referralIdService;
this.user = user;
this.filterManager = filterManager;
@@ -266,6 +265,7 @@ public class ProcessModel implements Model, PersistablePayload {
this.tradeStatisticsManager = tradeStatisticsManager;
this.arbitratorManager = arbitratorManager;
this.mediatorManager = mediatorManager;
+ this.refundAgentManager = refundAgentManager;
this.keyRing = keyRing;
this.p2PService = p2PService;
this.useSavingsWallet = useSavingsWallet;
@@ -339,4 +339,20 @@ public class ProcessModel implements Model, PersistablePayload {
public void setPaymentStartedMessageState(MessageState paymentStartedMessageStateProperty) {
this.paymentStartedMessageStateProperty.set(paymentStartedMessageStateProperty);
}
+
+ private void setTradingPeer(TradingPeer tradingPeer) {
+ this.tradingPeer = tradingPeer;
+ }
+
+ private void setOfferId(String offerId) {
+ this.offerId = offerId;
+ }
+
+ private void setAccountId(String accountId) {
+ this.accountId = accountId;
+ }
+
+ private void setPubKeyRing(PubKeyRing pubKeyRing) {
+ this.pubKeyRing = pubKeyRing;
+ }
}
diff --git a/core/src/main/java/bisq/core/trade/protocol/SellerAsMakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/SellerAsMakerProtocol.java
index 60894b2633..f509096529 100644
--- a/core/src/main/java/bisq/core/trade/protocol/SellerAsMakerProtocol.java
+++ b/core/src/main/java/bisq/core/trade/protocol/SellerAsMakerProtocol.java
@@ -21,38 +21,42 @@ package bisq.core.trade.protocol;
import bisq.core.trade.SellerAsMakerTrade;
import bisq.core.trade.Trade;
import bisq.core.trade.messages.CounterCurrencyTransferStartedMessage;
-import bisq.core.trade.messages.DepositTxPublishedMessage;
-import bisq.core.trade.messages.PayDepositRequest;
+import bisq.core.trade.messages.DelayedPayoutTxSignatureResponse;
+import bisq.core.trade.messages.DepositTxMessage;
+import bisq.core.trade.messages.InputsForDepositTxRequest;
import bisq.core.trade.messages.TradeMessage;
import bisq.core.trade.protocol.tasks.ApplyFilter;
import bisq.core.trade.protocol.tasks.PublishTradeStatistics;
import bisq.core.trade.protocol.tasks.VerifyPeersAccountAgeWitness;
import bisq.core.trade.protocol.tasks.maker.MakerCreateAndSignContract;
-import bisq.core.trade.protocol.tasks.maker.MakerProcessDepositTxPublishedMessage;
-import bisq.core.trade.protocol.tasks.maker.MakerProcessPayDepositRequest;
-import bisq.core.trade.protocol.tasks.maker.MakerSendPublishDepositTxRequest;
-import bisq.core.trade.protocol.tasks.maker.MakerSetupDepositTxListener;
+import bisq.core.trade.protocol.tasks.maker.MakerProcessesInputsForDepositTxRequest;
+import bisq.core.trade.protocol.tasks.maker.MakerSetsLockTime;
import bisq.core.trade.protocol.tasks.maker.MakerVerifyTakerAccount;
import bisq.core.trade.protocol.tasks.maker.MakerVerifyTakerFeePayment;
import bisq.core.trade.protocol.tasks.seller.SellerBroadcastPayoutTx;
+import bisq.core.trade.protocol.tasks.seller.SellerCreatesDelayedPayoutTx;
+import bisq.core.trade.protocol.tasks.seller.SellerFinalizesDelayedPayoutTx;
import bisq.core.trade.protocol.tasks.seller.SellerProcessCounterCurrencyTransferStartedMessage;
+import bisq.core.trade.protocol.tasks.seller.SellerProcessDelayedPayoutTxSignatureResponse;
+import bisq.core.trade.protocol.tasks.seller.SellerPublishesDepositTx;
+import bisq.core.trade.protocol.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest;
import bisq.core.trade.protocol.tasks.seller.SellerSendPayoutTxPublishedMessage;
+import bisq.core.trade.protocol.tasks.seller.SellerSendsDepositTxAndDelayedPayoutTxMessage;
import bisq.core.trade.protocol.tasks.seller.SellerSignAndFinalizePayoutTx;
-import bisq.core.trade.protocol.tasks.seller.SellerVerifiesPeersAccountAge;
-import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerCreatesAndSignsDepositTx;
+import bisq.core.trade.protocol.tasks.seller.SellerSignsDelayedPayoutTx;
+import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerCreatesUnsignedDepositTx;
+import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerFinalizesDepositTx;
+import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerProcessDepositTxMessage;
+import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerSendsInputsForDepositTxResponse;
import bisq.core.util.Validator;
-import bisq.network.p2p.MailboxMessage;
import bisq.network.p2p.NodeAddress;
import bisq.common.handlers.ErrorMessageHandler;
import bisq.common.handlers.ResultHandler;
-import bisq.common.proto.network.NetworkEnvelope;
import lombok.extern.slf4j.Slf4j;
-import static com.google.common.base.Preconditions.checkArgument;
-
@Slf4j
public class SellerAsMakerProtocol extends TradeProtocol implements SellerProtocol, MakerProtocol {
private final SellerAsMakerTrade sellerAsMakerTrade;
@@ -73,7 +77,6 @@ public class SellerAsMakerProtocol extends TradeProtocol implements SellerProtoc
() -> handleTaskRunnerSuccess("MakerSetupDepositTxListener"),
this::handleTaskRunnerFault);
- taskRunner.addTasks(MakerSetupDepositTxListener.class);
taskRunner.run();
}
}
@@ -84,23 +87,11 @@ public class SellerAsMakerProtocol extends TradeProtocol implements SellerProtoc
///////////////////////////////////////////////////////////////////////////////////////////
@Override
- public void doApplyMailboxMessage(NetworkEnvelope networkEnvelope, Trade trade) {
- this.trade = trade;
+ public void doApplyMailboxTradeMessage(TradeMessage tradeMessage, NodeAddress peerNodeAddress) {
+ super.doApplyMailboxTradeMessage(tradeMessage, peerNodeAddress);
- if (networkEnvelope instanceof MailboxMessage) {
- NodeAddress peerNodeAddress = ((MailboxMessage) networkEnvelope).getSenderNodeAddress();
- if (networkEnvelope instanceof TradeMessage) {
- TradeMessage tradeMessage = (TradeMessage) networkEnvelope;
- log.info("Received {} as MailboxMessage from {} with tradeId {} and uid {}",
- tradeMessage.getClass().getSimpleName(), peerNodeAddress, tradeMessage.getTradeId(), tradeMessage.getUid());
-
- if (tradeMessage instanceof DepositTxPublishedMessage)
- handle((DepositTxPublishedMessage) tradeMessage, peerNodeAddress);
- else if (tradeMessage instanceof CounterCurrencyTransferStartedMessage)
- handle((CounterCurrencyTransferStartedMessage) tradeMessage, peerNodeAddress);
- else
- log.error("We received an unhandled tradeMessage" + tradeMessage.toString());
- }
+ if (tradeMessage instanceof CounterCurrencyTransferStartedMessage) {
+ handle((CounterCurrencyTransferStartedMessage) tradeMessage, peerNodeAddress);
}
}
@@ -110,11 +101,10 @@ public class SellerAsMakerProtocol extends TradeProtocol implements SellerProtoc
///////////////////////////////////////////////////////////////////////////////////////////
@Override
- public void handleTakeOfferRequest(TradeMessage tradeMessage,
+ public void handleTakeOfferRequest(InputsForDepositTxRequest tradeMessage,
NodeAddress sender,
ErrorMessageHandler errorMessageHandler) {
Validator.checkTradeId(processModel.getOfferId(), tradeMessage);
- checkArgument(tradeMessage instanceof PayDepositRequest);
processModel.setTradeMessage(tradeMessage);
processModel.setTempTradingPeerNodeAddress(sender);
@@ -126,20 +116,17 @@ public class SellerAsMakerProtocol extends TradeProtocol implements SellerProtoc
});
taskRunner.addTasks(
- MakerProcessPayDepositRequest.class,
+ MakerProcessesInputsForDepositTxRequest.class,
ApplyFilter.class,
MakerVerifyTakerAccount.class,
VerifyPeersAccountAgeWitness.class,
- SellerVerifiesPeersAccountAge.class,
MakerVerifyTakerFeePayment.class,
+ MakerSetsLockTime.class,
MakerCreateAndSignContract.class,
- SellerAsMakerCreatesAndSignsDepositTx.class,
- MakerSetupDepositTxListener.class,
- MakerSendPublishDepositTxRequest.class
+ SellerAsMakerCreatesUnsignedDepositTx.class,
+ SellerAsMakerSendsInputsForDepositTxResponse.class
);
- // We don't start a timeout because if we don't receive the peers DepositTxPublishedMessage we still
- // will get set the deposit tx in MakerSetupDepositTxListener once seen in the network
taskRunner.run();
}
@@ -148,7 +135,7 @@ public class SellerAsMakerProtocol extends TradeProtocol implements SellerProtoc
// Incoming message handling
///////////////////////////////////////////////////////////////////////////////////////////
- protected void handle(DepositTxPublishedMessage tradeMessage, NodeAddress sender) {
+ protected void handle(DepositTxMessage tradeMessage, NodeAddress sender) {
processModel.setTradeMessage(tradeMessage);
processModel.setTempTradingPeerNodeAddress(sender);
@@ -159,10 +146,32 @@ public class SellerAsMakerProtocol extends TradeProtocol implements SellerProtoc
errorMessage -> handleTaskRunnerFault(tradeMessage, errorMessage));
taskRunner.addTasks(
- MakerProcessDepositTxPublishedMessage.class,
- PublishTradeStatistics.class,
- MakerVerifyTakerAccount.class,
- MakerVerifyTakerFeePayment.class
+ SellerAsMakerProcessDepositTxMessage.class,
+ SellerAsMakerFinalizesDepositTx.class,
+ SellerCreatesDelayedPayoutTx.class,
+ SellerSendDelayedPayoutTxSignatureRequest.class
+ );
+ taskRunner.run();
+ }
+
+ private void handle(DelayedPayoutTxSignatureResponse tradeMessage, NodeAddress sender) {
+ processModel.setTradeMessage(tradeMessage);
+ processModel.setTempTradingPeerNodeAddress(sender);
+
+ TradeTaskRunner taskRunner = new TradeTaskRunner(sellerAsMakerTrade,
+ () -> {
+ stopTimeout();
+ handleTaskRunnerSuccess(tradeMessage, "PublishDepositTxRequest");
+ },
+ errorMessage -> handleTaskRunnerFault(tradeMessage, errorMessage));
+
+ taskRunner.addTasks(
+ SellerProcessDelayedPayoutTxSignatureResponse.class,
+ SellerSignsDelayedPayoutTx.class,
+ SellerFinalizesDelayedPayoutTx.class,
+ SellerPublishesDepositTx.class,
+ SellerSendsDepositTxAndDelayedPayoutTxMessage.class,
+ PublishTradeStatistics.class
);
taskRunner.run();
}
@@ -255,8 +264,10 @@ public class SellerAsMakerProtocol extends TradeProtocol implements SellerProtoc
log.info("Received {} from {} with tradeId {} and uid {}",
tradeMessage.getClass().getSimpleName(), sender, tradeMessage.getTradeId(), tradeMessage.getUid());
- if (tradeMessage instanceof DepositTxPublishedMessage) {
- handle((DepositTxPublishedMessage) tradeMessage, sender);
+ if (tradeMessage instanceof DepositTxMessage) {
+ handle((DepositTxMessage) tradeMessage, sender);
+ } else if (tradeMessage instanceof DelayedPayoutTxSignatureResponse) {
+ handle((DelayedPayoutTxSignatureResponse) tradeMessage, sender);
} else if (tradeMessage instanceof CounterCurrencyTransferStartedMessage) {
handle((CounterCurrencyTransferStartedMessage) tradeMessage, sender);
}
diff --git a/core/src/main/java/bisq/core/trade/protocol/SellerAsTakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/SellerAsTakerProtocol.java
index d3071b1c8b..fa4c4d3d0c 100644
--- a/core/src/main/java/bisq/core/trade/protocol/SellerAsTakerProtocol.java
+++ b/core/src/main/java/bisq/core/trade/protocol/SellerAsTakerProtocol.java
@@ -18,39 +18,46 @@
package bisq.core.trade.protocol;
+import bisq.core.offer.Offer;
import bisq.core.trade.SellerAsTakerTrade;
import bisq.core.trade.Trade;
import bisq.core.trade.messages.CounterCurrencyTransferStartedMessage;
-import bisq.core.trade.messages.PublishDepositTxRequest;
+import bisq.core.trade.messages.DelayedPayoutTxSignatureResponse;
+import bisq.core.trade.messages.InputsForDepositTxResponse;
import bisq.core.trade.messages.TradeMessage;
import bisq.core.trade.protocol.tasks.ApplyFilter;
import bisq.core.trade.protocol.tasks.PublishTradeStatistics;
import bisq.core.trade.protocol.tasks.VerifyPeersAccountAgeWitness;
import bisq.core.trade.protocol.tasks.seller.SellerBroadcastPayoutTx;
+import bisq.core.trade.protocol.tasks.seller.SellerCreatesDelayedPayoutTx;
+import bisq.core.trade.protocol.tasks.seller.SellerFinalizesDelayedPayoutTx;
import bisq.core.trade.protocol.tasks.seller.SellerProcessCounterCurrencyTransferStartedMessage;
+import bisq.core.trade.protocol.tasks.seller.SellerProcessDelayedPayoutTxSignatureResponse;
+import bisq.core.trade.protocol.tasks.seller.SellerPublishesDepositTx;
+import bisq.core.trade.protocol.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest;
import bisq.core.trade.protocol.tasks.seller.SellerSendPayoutTxPublishedMessage;
+import bisq.core.trade.protocol.tasks.seller.SellerSendsDepositTxAndDelayedPayoutTxMessage;
import bisq.core.trade.protocol.tasks.seller.SellerSignAndFinalizePayoutTx;
-import bisq.core.trade.protocol.tasks.seller.SellerVerifiesPeersAccountAge;
+import bisq.core.trade.protocol.tasks.seller.SellerSignsDelayedPayoutTx;
import bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerCreatesDepositTxInputs;
-import bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerSignAndPublishDepositTx;
+import bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerSignsDepositTx;
import bisq.core.trade.protocol.tasks.taker.CreateTakerFeeTx;
-import bisq.core.trade.protocol.tasks.taker.TakerProcessPublishDepositTxRequest;
+import bisq.core.trade.protocol.tasks.taker.TakerProcessesInputsForDepositTxResponse;
import bisq.core.trade.protocol.tasks.taker.TakerPublishFeeTx;
-import bisq.core.trade.protocol.tasks.taker.TakerSendDepositTxPublishedMessage;
-import bisq.core.trade.protocol.tasks.taker.TakerSendPayDepositRequest;
+import bisq.core.trade.protocol.tasks.taker.TakerSendInputsForDepositTxRequest;
import bisq.core.trade.protocol.tasks.taker.TakerVerifyAndSignContract;
import bisq.core.trade.protocol.tasks.taker.TakerVerifyMakerAccount;
import bisq.core.trade.protocol.tasks.taker.TakerVerifyMakerFeePayment;
-import bisq.network.p2p.MailboxMessage;
import bisq.network.p2p.NodeAddress;
import bisq.common.handlers.ErrorMessageHandler;
import bisq.common.handlers.ResultHandler;
-import bisq.common.proto.network.NetworkEnvelope;
import lombok.extern.slf4j.Slf4j;
+import static com.google.common.base.Preconditions.checkNotNull;
+
@Slf4j
public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtocol, TakerProtocol {
private final SellerAsTakerTrade sellerAsTakerTrade;
@@ -65,7 +72,8 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc
this.sellerAsTakerTrade = trade;
- processModel.getTradingPeer().setPubKeyRing(trade.getOffer().getPubKeyRing());
+ Offer offer = checkNotNull(trade.getOffer());
+ processModel.getTradingPeer().setPubKeyRing(offer.getPubKeyRing());
}
@@ -74,22 +82,11 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc
///////////////////////////////////////////////////////////////////////////////////////////
@Override
- public void doApplyMailboxMessage(NetworkEnvelope networkEnvelope, Trade trade) {
- this.trade = trade;
+ public void doApplyMailboxTradeMessage(TradeMessage tradeMessage, NodeAddress peerNodeAddress) {
+ super.doApplyMailboxTradeMessage(tradeMessage, peerNodeAddress);
- if (networkEnvelope instanceof MailboxMessage) {
- NodeAddress peerNodeAddress = ((MailboxMessage) networkEnvelope).getSenderNodeAddress();
- if (networkEnvelope instanceof TradeMessage) {
- TradeMessage tradeMessage = (TradeMessage) networkEnvelope;
- log.info("Received {} as MailboxMessage from {} with tradeId {} and uid {}",
- tradeMessage.getClass().getSimpleName(), peerNodeAddress, tradeMessage.getTradeId(), tradeMessage.getUid());
- if (tradeMessage instanceof PublishDepositTxRequest)
- handle((PublishDepositTxRequest) tradeMessage, peerNodeAddress);
- else if (tradeMessage instanceof CounterCurrencyTransferStartedMessage)
- handle((CounterCurrencyTransferStartedMessage) tradeMessage, peerNodeAddress);
- else
- log.error("We received an unhandled tradeMessage" + tradeMessage.toString());
- }
+ if (tradeMessage instanceof CounterCurrencyTransferStartedMessage) {
+ handle((CounterCurrencyTransferStartedMessage) tradeMessage, peerNodeAddress);
}
}
@@ -109,11 +106,9 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc
TakerVerifyMakerFeePayment.class,
CreateTakerFeeTx.class,
SellerAsTakerCreatesDepositTxInputs.class,
- TakerSendPayDepositRequest.class
+ TakerSendInputsForDepositTxRequest.class
);
- //TODO if peer does get an error he does not respond and all we get is the timeout now knowing why it failed.
- // We should add an error message the peer sends us in such cases.
startTimeout();
taskRunner.run();
}
@@ -123,7 +118,7 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc
// Incoming message handling
///////////////////////////////////////////////////////////////////////////////////////////
- private void handle(PublishDepositTxRequest tradeMessage, NodeAddress sender) {
+ private void handle(InputsForDepositTxResponse tradeMessage, NodeAddress sender) {
processModel.setTradeMessage(tradeMessage);
processModel.setTempTradingPeerNodeAddress(sender);
@@ -135,16 +130,37 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc
errorMessage -> handleTaskRunnerFault(tradeMessage, errorMessage));
taskRunner.addTasks(
- TakerProcessPublishDepositTxRequest.class,
+ TakerProcessesInputsForDepositTxResponse.class,
ApplyFilter.class,
TakerVerifyMakerAccount.class,
VerifyPeersAccountAgeWitness.class,
- SellerVerifiesPeersAccountAge.class,
TakerVerifyMakerFeePayment.class,
TakerVerifyAndSignContract.class,
TakerPublishFeeTx.class,
- SellerAsTakerSignAndPublishDepositTx.class,
- TakerSendDepositTxPublishedMessage.class,
+ SellerAsTakerSignsDepositTx.class,
+ SellerCreatesDelayedPayoutTx.class,
+ SellerSendDelayedPayoutTxSignatureRequest.class
+ );
+ taskRunner.run();
+ }
+
+ private void handle(DelayedPayoutTxSignatureResponse tradeMessage, NodeAddress sender) {
+ processModel.setTradeMessage(tradeMessage);
+ processModel.setTempTradingPeerNodeAddress(sender);
+
+ TradeTaskRunner taskRunner = new TradeTaskRunner(sellerAsTakerTrade,
+ () -> {
+ stopTimeout();
+ handleTaskRunnerSuccess(tradeMessage, "PublishDepositTxRequest");
+ },
+ errorMessage -> handleTaskRunnerFault(tradeMessage, errorMessage));
+
+ taskRunner.addTasks(
+ SellerProcessDelayedPayoutTxSignatureResponse.class,
+ SellerSignsDelayedPayoutTx.class,
+ SellerFinalizesDelayedPayoutTx.class,
+ SellerPublishesDepositTx.class,
+ SellerSendsDepositTxAndDelayedPayoutTxMessage.class,
PublishTradeStatistics.class
);
taskRunner.run();
@@ -238,8 +254,10 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc
log.info("Received {} from {} with tradeId {} and uid {}",
tradeMessage.getClass().getSimpleName(), sender, tradeMessage.getTradeId(), tradeMessage.getUid());
- if (tradeMessage instanceof PublishDepositTxRequest) {
- handle((PublishDepositTxRequest) tradeMessage, sender);
+ if (tradeMessage instanceof InputsForDepositTxResponse) {
+ handle((InputsForDepositTxResponse) tradeMessage, sender);
+ } else if (tradeMessage instanceof DelayedPayoutTxSignatureResponse) {
+ handle((DelayedPayoutTxSignatureResponse) tradeMessage, sender);
} else if (tradeMessage instanceof CounterCurrencyTransferStartedMessage) {
handle((CounterCurrencyTransferStartedMessage) tradeMessage, sender);
}
diff --git a/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java b/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java
index eee4da8371..cc2a59c318 100644
--- a/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java
+++ b/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java
@@ -21,11 +21,13 @@ import bisq.core.trade.MakerTrade;
import bisq.core.trade.Trade;
import bisq.core.trade.TradeManager;
import bisq.core.trade.messages.CounterCurrencyTransferStartedMessage;
+import bisq.core.trade.messages.InputsForDepositTxRequest;
import bisq.core.trade.messages.MediatedPayoutTxPublishedMessage;
import bisq.core.trade.messages.MediatedPayoutTxSignatureMessage;
-import bisq.core.trade.messages.PayDepositRequest;
+import bisq.core.trade.messages.PeerPublishedDelayedPayoutTxMessage;
import bisq.core.trade.messages.TradeMessage;
import bisq.core.trade.protocol.tasks.ApplyFilter;
+import bisq.core.trade.protocol.tasks.ProcessPeerPublishedDelayedPayoutTxMessage;
import bisq.core.trade.protocol.tasks.mediation.BroadcastMediatedPayoutTx;
import bisq.core.trade.protocol.tasks.mediation.FinalizeMediatedPayoutTx;
import bisq.core.trade.protocol.tasks.mediation.ProcessMediatedPayoutSignatureMessage;
@@ -59,6 +61,7 @@ import lombok.extern.slf4j.Slf4j;
import javax.annotation.Nullable;
import static bisq.core.util.Validator.nonEmptyStringOf;
+import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
public abstract class TradeProtocol {
@@ -80,13 +83,13 @@ public abstract class TradeProtocol {
PublicKey signaturePubKey = decryptedMessageWithPubKey.getSignaturePubKey();
if (tradingPeerPubKeyRing != null && signaturePubKey.equals(tradingPeerPubKeyRing.getSignaturePubKey())) {
NetworkEnvelope networkEnvelope = decryptedMessageWithPubKey.getNetworkEnvelope();
- log.trace("handleNewMessage: message = {} from {}", networkEnvelope.getClass().getSimpleName(), peersNodeAddress);
if (networkEnvelope instanceof TradeMessage) {
TradeMessage tradeMessage = (TradeMessage) networkEnvelope;
nonEmptyStringOf(tradeMessage.getTradeId());
- if (tradeMessage.getTradeId().equals(processModel.getOfferId()))
+ if (tradeMessage.getTradeId().equals(processModel.getOfferId())) {
doHandleDecryptedMessage(tradeMessage, peersNodeAddress);
+ }
} else if (networkEnvelope instanceof AckMessage) {
AckMessage ackMessage = (AckMessage) networkEnvelope;
if (ackMessage.getSourceType() == AckMessageSourceType.TRADE_MESSAGE &&
@@ -110,7 +113,7 @@ public abstract class TradeProtocol {
stateChangeListener = (observable, oldValue, newValue) -> {
if (newValue.getPhase() == Trade.Phase.TAKER_FEE_PUBLISHED && trade instanceof MakerTrade)
- processModel.getOpenOfferManager().closeOpenOffer(trade.getOffer());
+ processModel.getOpenOfferManager().closeOpenOffer(checkNotNull(trade.getOffer()));
};
trade.stateProperty().addListener(stateChangeListener);
}
@@ -206,6 +209,26 @@ public abstract class TradeProtocol {
}
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Peer has published the delayed payout tx
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ private void handle(PeerPublishedDelayedPayoutTxMessage tradeMessage, NodeAddress sender) {
+ processModel.setTradeMessage(tradeMessage);
+ processModel.setTempTradingPeerNodeAddress(sender);
+
+ TradeTaskRunner taskRunner = new TradeTaskRunner(trade,
+ () -> handleTaskRunnerSuccess(tradeMessage, "PeerPublishedDelayedPayoutTxMessage"),
+ errorMessage -> handleTaskRunnerFault(tradeMessage, errorMessage));
+
+ taskRunner.addTasks(
+ //todo
+ ProcessPeerPublishedDelayedPayoutTxMessage.class
+ );
+ taskRunner.run();
+ }
+
+
///////////////////////////////////////////////////////////////////////////////////////////
// Dispatcher
///////////////////////////////////////////////////////////////////////////////////////////
@@ -215,6 +238,8 @@ public abstract class TradeProtocol {
handle((MediatedPayoutTxSignatureMessage) tradeMessage, sender);
} else if (tradeMessage instanceof MediatedPayoutTxPublishedMessage) {
handle((MediatedPayoutTxPublishedMessage) tradeMessage, sender);
+ } else if (tradeMessage instanceof PeerPublishedDelayedPayoutTxMessage) {
+ handle((PeerPublishedDelayedPayoutTxMessage) tradeMessage, sender);
}
}
@@ -225,10 +250,6 @@ public abstract class TradeProtocol {
public void completed() {
cleanup();
-
- // We only removed earlier the listener here, but then we migth have dangling trades after faults...
- // so lets remove it at cleanup
- //processModel.getP2PService().removeDecryptedDirectMessageListener(decryptedDirectMessageListener);
}
private void cleanup() {
@@ -241,28 +262,33 @@ public abstract class TradeProtocol {
public void applyMailboxMessage(DecryptedMessageWithPubKey decryptedMessageWithPubKey, Trade trade) {
NetworkEnvelope networkEnvelope = decryptedMessageWithPubKey.getNetworkEnvelope();
- log.debug("applyMailboxMessage {}", networkEnvelope);
if (processModel.getTradingPeer().getPubKeyRing() != null &&
decryptedMessageWithPubKey.getSignaturePubKey().equals(processModel.getTradingPeer().getPubKeyRing().getSignaturePubKey())) {
processModel.setDecryptedMessageWithPubKey(decryptedMessageWithPubKey);
- doApplyMailboxMessage(networkEnvelope, trade);
- // This is just a quick fix for the missing handling of the mediation MailboxMessages.
- // With the new trade protocol that will be refactored further with using doApplyMailboxMessage...
if (networkEnvelope instanceof MailboxMessage && networkEnvelope instanceof TradeMessage) {
- NodeAddress sender = ((MailboxMessage) networkEnvelope).getSenderNodeAddress();
- if (networkEnvelope instanceof MediatedPayoutTxSignatureMessage) {
- handle((MediatedPayoutTxSignatureMessage) networkEnvelope, sender);
- } else if (networkEnvelope instanceof MediatedPayoutTxPublishedMessage) {
- handle((MediatedPayoutTxPublishedMessage) networkEnvelope, sender);
- }
+ this.trade = trade;
+ TradeMessage tradeMessage = (TradeMessage) networkEnvelope;
+ NodeAddress peerNodeAddress = ((MailboxMessage) networkEnvelope).getSenderNodeAddress();
+ doApplyMailboxTradeMessage(tradeMessage, peerNodeAddress);
}
} else {
log.error("SignaturePubKey in message does not match the SignaturePubKey we have stored to that trading peer.");
}
}
- protected abstract void doApplyMailboxMessage(NetworkEnvelope networkEnvelope, Trade trade);
+ protected void doApplyMailboxTradeMessage(TradeMessage tradeMessage, NodeAddress peerNodeAddress) {
+ log.info("Received {} as MailboxMessage from {} with tradeId {} and uid {}",
+ tradeMessage.getClass().getSimpleName(), peerNodeAddress, tradeMessage.getTradeId(), tradeMessage.getUid());
+
+ if (tradeMessage instanceof MediatedPayoutTxSignatureMessage) {
+ handle((MediatedPayoutTxSignatureMessage) tradeMessage, peerNodeAddress);
+ } else if (tradeMessage instanceof MediatedPayoutTxPublishedMessage) {
+ handle((MediatedPayoutTxPublishedMessage) tradeMessage, peerNodeAddress);
+ } else if (tradeMessage instanceof PeerPublishedDelayedPayoutTxMessage) {
+ handle((PeerPublishedDelayedPayoutTxMessage) tradeMessage, peerNodeAddress);
+ }
+ }
protected void startTimeout() {
stopTimeout();
@@ -318,7 +344,7 @@ public abstract class TradeProtocol {
sourceUid = ((MailboxMessage) tradeMessage).getUid();
} else {
// For direct msg we don't have a mandatory uid so we need to cast to get it
- if (tradeMessage instanceof PayDepositRequest) {
+ if (tradeMessage instanceof InputsForDepositTxRequest) {
sourceUid = tradeMessage.getUid();
}
}
diff --git a/core/src/main/java/bisq/core/trade/protocol/TradingPeer.java b/core/src/main/java/bisq/core/trade/protocol/TradingPeer.java
index 94398caf79..3a2af77705 100644
--- a/core/src/main/java/bisq/core/trade/protocol/TradingPeer.java
+++ b/core/src/main/java/bisq/core/trade/protocol/TradingPeer.java
@@ -38,10 +38,23 @@ import lombok.extern.slf4j.Slf4j;
import javax.annotation.Nullable;
+// Fields marked as transient are only used during protocol execution which are based on directMessages so we do not
+// persist them.
+//todo clean up older fields as well to make most transient
@Slf4j
@Getter
@Setter
public final class TradingPeer implements PersistablePayload {
+ // Transient/Mutable
+ // Added in v1.2.0
+ @Setter
+ @Nullable
+ transient private byte[] delayedPayoutTxSignature;
+ @Setter
+ @Nullable
+ transient private byte[] preparedDepositTx;
+
+ // Persistable mutable
@Nullable
private String accountId;
@Nullable
@@ -75,6 +88,7 @@ public final class TradingPeer implements PersistablePayload {
@Nullable
private byte[] mediatedPayoutTxSignature;
+
public TradingPeer() {
}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java
new file mode 100644
index 0000000000..d0dc930053
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java
@@ -0,0 +1,64 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks;
+
+import bisq.core.btc.wallet.WalletService;
+import bisq.core.trade.Trade;
+import bisq.core.trade.messages.PeerPublishedDelayedPayoutTxMessage;
+import bisq.core.util.Validator;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import org.bitcoinj.core.Transaction;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class ProcessPeerPublishedDelayedPayoutTxMessage extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public ProcessPeerPublishedDelayedPayoutTxMessage(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+
+ PeerPublishedDelayedPayoutTxMessage message = (PeerPublishedDelayedPayoutTxMessage) processModel.getTradeMessage();
+ Validator.checkTradeId(processModel.getOfferId(), message);
+ checkNotNull(message);
+
+ // update to the latest peer address of our peer if the message is correct
+ trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
+ processModel.removeMailboxMessageAfterProcessing(trade);
+
+ // We add the tx to our wallet.
+ Transaction delayedPayoutTx = checkNotNull(trade.getDelayedPayoutTx());
+ WalletService.maybeAddSelfTxToWallet(delayedPayoutTx, processModel.getBtcWalletService().getWallet());
+
+ // todo trade.setState
+
+ complete();
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/PublishTradeStatistics.java b/core/src/main/java/bisq/core/trade/protocol/tasks/PublishTradeStatistics.java
index e6c7342d6d..2b9010fe65 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/PublishTradeStatistics.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/PublishTradeStatistics.java
@@ -66,9 +66,9 @@ public class PublishTradeStatistics extends TradeTask {
NodeAddress mediatorNodeAddress = trade.getMediatorNodeAddress();
if (mediatorNodeAddress != null) {
- // The first 4 chars are sufficient to identify an arbitrator.
+ // The first 4 chars are sufficient to identify an mediator.
// For testing with regtest/localhost we use the full address as its localhost and would result in
- // same values for multiple arbitrators.
+ // same values for multiple mediators.
NetworkNode networkNode = model.getProcessModel().getP2PService().getNetworkNode();
String address = networkNode instanceof TorNetworkNode ?
mediatorNodeAddress.getFullAddress().substring(0, 4) :
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/SetupPayoutTxListener.java b/core/src/main/java/bisq/core/trade/protocol/tasks/SetupPayoutTxListener.java
index 61dbe0ff53..20b8553939 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/SetupPayoutTxListener.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/SetupPayoutTxListener.java
@@ -54,10 +54,10 @@ public abstract class SetupPayoutTxListener extends TradeTask {
runInterceptHook();
if (!trade.isPayoutPublished()) {
BtcWalletService walletService = processModel.getBtcWalletService();
- final String id = processModel.getOffer().getId();
+ String id = processModel.getOffer().getId();
Address address = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.TRADE_PAYOUT).getAddress();
- final TransactionConfidence confidence = walletService.getConfidenceForAddress(address);
+ TransactionConfidence confidence = walletService.getConfidenceForAddress(address);
if (isInNetwork(confidence)) {
applyConfidence(confidence);
} else {
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java
new file mode 100644
index 0000000000..c9fe2e8b7a
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.buyer;
+
+import bisq.core.trade.Trade;
+import bisq.core.trade.messages.DelayedPayoutTxSignatureRequest;
+import bisq.core.trade.protocol.tasks.TradeTask;
+import bisq.core.util.Validator;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import org.bitcoinj.core.Transaction;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class BuyerProcessDelayedPayoutTxSignatureRequest extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public BuyerProcessDelayedPayoutTxSignatureRequest(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+ DelayedPayoutTxSignatureRequest message = (DelayedPayoutTxSignatureRequest) processModel.getTradeMessage();
+ checkNotNull(message);
+ Validator.checkTradeId(processModel.getOfferId(), message);
+ byte[] delayedPayoutTxAsBytes = checkNotNull(message.getDelayedPayoutTx());
+ Transaction preparedDelayedPayoutTx = processModel.getBtcWalletService().getTxFromSerializedTx(delayedPayoutTxAsBytes);
+ processModel.setPreparedDelayedPayoutTx(preparedDelayedPayoutTx);
+
+ // update to the latest peer address of our peer if the message is correct
+ trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
+
+ complete();
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessDepositTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java
similarity index 64%
rename from core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessDepositTxPublishedMessage.java
rename to core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java
index c000c49e3f..509bfc7f16 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessDepositTxPublishedMessage.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java
@@ -15,12 +15,13 @@
* along with Bisq. If not, see .
*/
-package bisq.core.trade.protocol.tasks.maker;
+package bisq.core.trade.protocol.tasks.buyer;
import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.wallet.BtcWalletService;
+import bisq.core.btc.wallet.WalletService;
import bisq.core.trade.Trade;
-import bisq.core.trade.messages.DepositTxPublishedMessage;
+import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage;
import bisq.core.trade.protocol.tasks.TradeTask;
import bisq.core.util.Validator;
@@ -34,9 +35,9 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
-public class MakerProcessDepositTxPublishedMessage extends TradeTask {
+public class BuyerProcessDepositTxAndDelayedPayoutTxMessage extends TradeTask {
@SuppressWarnings({"unused"})
- public MakerProcessDepositTxPublishedMessage(TaskRunner taskHandler, Trade trade) {
+ public BuyerProcessDepositTxAndDelayedPayoutTxMessage(TaskRunner taskHandler, Trade trade) {
super(taskHandler, trade);
}
@@ -44,18 +45,22 @@ public class MakerProcessDepositTxPublishedMessage extends TradeTask {
protected void run() {
try {
runInterceptHook();
- log.debug("current trade state " + trade.getState());
- DepositTxPublishedMessage message = (DepositTxPublishedMessage) processModel.getTradeMessage();
- Validator.checkTradeId(processModel.getOfferId(), message);
+ DepositTxAndDelayedPayoutTxMessage message = (DepositTxAndDelayedPayoutTxMessage) processModel.getTradeMessage();
checkNotNull(message);
+ Validator.checkTradeId(processModel.getOfferId(), message);
checkArgument(message.getDepositTx() != null);
// To access tx confidence we need to add that tx into our wallet.
- Transaction txFromSerializedTx = processModel.getBtcWalletService().getTxFromSerializedTx(message.getDepositTx());
+ Transaction depositTx = processModel.getBtcWalletService().getTxFromSerializedTx(message.getDepositTx());
// update with full tx
- Transaction walletTx = processModel.getTradeWalletService().addTxToWallet(txFromSerializedTx);
- trade.setDepositTx(walletTx);
- BtcWalletService.printTx("depositTx received from peer", walletTx);
+ Transaction committedDepositTx = WalletService.maybeAddSelfTxToWallet(depositTx, processModel.getBtcWalletService().getWallet());
+ trade.applyDepositTx(committedDepositTx);
+ BtcWalletService.printTx("depositTx received from peer", committedDepositTx);
+
+ // To access tx confidence we need to add that tx into our wallet.
+ byte[] delayedPayoutTxBytes = message.getDelayedPayoutTx();
+ trade.applyDelayedPayoutTxBytes(delayedPayoutTxBytes);
+ BtcWalletService.printTx("delayedPayoutTx received from peer", trade.getDelayedPayoutTx());
// update to the latest peer address of our peer if the message is correct
trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
@@ -63,8 +68,8 @@ public class MakerProcessDepositTxPublishedMessage extends TradeTask {
processModel.removeMailboxMessageAfterProcessing(trade);
// If we got already the confirmation we don't want to apply an earlier state
- if (trade.getState() != Trade.State.MAKER_SAW_DEPOSIT_TX_IN_NETWORK)
- trade.setState(Trade.State.MAKER_RECEIVED_DEPOSIT_TX_PUBLISHED_MSG);
+ if (trade.getState() != Trade.State.BUYER_SAW_DEPOSIT_TX_IN_NETWORK)
+ trade.setState(Trade.State.BUYER_RECEIVED_DEPOSIT_TX_PUBLISHED_MSG);
processModel.getBtcWalletService().swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.RESERVED_FOR_TRADE);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java
index 6fc5f2d18c..245dd40aac 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java
@@ -19,6 +19,7 @@ package bisq.core.trade.protocol.tasks.buyer;
import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.wallet.BtcWalletService;
+import bisq.core.btc.wallet.WalletService;
import bisq.core.trade.Trade;
import bisq.core.trade.messages.PayoutTxPublishedMessage;
import bisq.core.trade.protocol.tasks.TradeTask;
@@ -54,9 +55,9 @@ public class BuyerProcessPayoutTxPublishedMessage extends TradeTask {
trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
if (trade.getPayoutTx() == null) {
- Transaction walletTx = processModel.getTradeWalletService().addTxToWallet(message.getPayoutTx());
- trade.setPayoutTx(walletTx);
- BtcWalletService.printTx("payoutTx received from peer", walletTx);
+ Transaction committedPayoutTx = WalletService.maybeAddNetworkTxToWallet(message.getPayoutTx(), processModel.getBtcWalletService().getWallet());
+ trade.setPayoutTx(committedPayoutTx);
+ BtcWalletService.printTx("payoutTx received from peer", committedPayoutTx);
trade.setState(Trade.State.BUYER_RECEIVED_PAYOUT_TX_PUBLISHED_MSG);
processModel.getBtcWalletService().swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.MULTI_SIG);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java
new file mode 100644
index 0000000000..887c416a54
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java
@@ -0,0 +1,85 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.buyer;
+
+import bisq.core.trade.Trade;
+import bisq.core.trade.messages.DelayedPayoutTxSignatureResponse;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.network.p2p.NodeAddress;
+import bisq.network.p2p.SendDirectMessageListener;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import java.util.UUID;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class BuyerSendsDelayedPayoutTxSignatureResponse extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public BuyerSendsDelayedPayoutTxSignatureResponse(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+
+ byte[] delayedPayoutTxSignature = checkNotNull(processModel.getDelayedPayoutTxSignature());
+ DelayedPayoutTxSignatureResponse message = new DelayedPayoutTxSignatureResponse(UUID.randomUUID().toString(),
+ processModel.getOfferId(),
+ processModel.getMyNodeAddress(),
+ delayedPayoutTxSignature);
+
+ // todo trade.setState
+
+ NodeAddress peersNodeAddress = trade.getTradingPeerNodeAddress();
+ log.info("Send {} to peer {}. tradeId={}, uid={}",
+ message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
+ processModel.getP2PService().sendEncryptedDirectMessage(
+ peersNodeAddress,
+ processModel.getTradingPeer().getPubKeyRing(),
+ message,
+ new SendDirectMessageListener() {
+ @Override
+ public void onArrived() {
+ log.info("{} arrived at peer {}. tradeId={}, uid={}",
+ message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
+ // todo trade.setState
+ complete();
+ }
+
+ @Override
+ public void onFault(String errorMessage) {
+ log.error("{} failed: Peer {}. tradeId={}, uid={}, errorMessage={}",
+ message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid(), errorMessage);
+ // todo trade.setState
+ appendToErrorMessage("Sending message failed: message=" + message + "\nerrorMessage=" + errorMessage);
+ failed(errorMessage);
+ }
+ }
+ );
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetupDepositTxListener.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupDepositTxListener.java
similarity index 94%
rename from core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetupDepositTxListener.java
rename to core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupDepositTxListener.java
index a858124c5a..454761b4ae 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetupDepositTxListener.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupDepositTxListener.java
@@ -15,7 +15,7 @@
* along with Bisq. If not, see .
*/
-package bisq.core.trade.protocol.tasks.maker;
+package bisq.core.trade.protocol.tasks.buyer;
import bisq.core.btc.listeners.AddressConfidenceListener;
import bisq.core.btc.model.AddressEntry;
@@ -39,13 +39,13 @@ import lombok.extern.slf4j.Slf4j;
import static com.google.common.base.Preconditions.checkArgument;
@Slf4j
-public class MakerSetupDepositTxListener extends TradeTask {
+public class BuyerSetupDepositTxListener extends TradeTask {
// Use instance fields to not get eaten up by the GC
private Subscription tradeStateSubscription;
private AddressConfidenceListener confidenceListener;
@SuppressWarnings({"unused"})
- public MakerSetupDepositTxListener(TaskRunner taskHandler, Trade trade) {
+ public BuyerSetupDepositTxListener(TaskRunner taskHandler, Trade trade) {
super(taskHandler, trade);
}
@@ -94,9 +94,9 @@ public class MakerSetupDepositTxListener extends TradeTask {
private void applyConfidence(TransactionConfidence confidence) {
if (trade.getDepositTx() == null) {
Transaction walletTx = processModel.getTradeWalletService().getWalletTx(confidence.getTransactionHash());
- trade.setDepositTx(walletTx);
+ trade.applyDepositTx(walletTx);
BtcWalletService.printTx("depositTx received from network", walletTx);
- trade.setState(Trade.State.MAKER_SAW_DEPOSIT_TX_IN_NETWORK);
+ trade.setState(Trade.State.BUYER_SAW_DEPOSIT_TX_IN_NETWORK);
} else {
log.info("We got the deposit tx already set from MakerProcessDepositTxPublishedMessage. tradeId={}, state={}", trade.getId(), trade.getState());
}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSignPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignPayoutTx.java
similarity index 89%
rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSignPayoutTx.java
rename to core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignPayoutTx.java
index 4140ce364d..b90a91ec22 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSignPayoutTx.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignPayoutTx.java
@@ -15,7 +15,7 @@
* along with Bisq. If not, see .
*/
-package bisq.core.trade.protocol.tasks.buyer_as_maker;
+package bisq.core.trade.protocol.tasks.buyer;
import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.wallet.BtcWalletService;
@@ -38,10 +38,10 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
-public class BuyerAsMakerSignPayoutTx extends TradeTask {
+public class BuyerSignPayoutTx extends TradeTask {
@SuppressWarnings({"unused"})
- public BuyerAsMakerSignPayoutTx(TaskRunner taskHandler, Trade trade) {
+ public BuyerSignPayoutTx(TaskRunner taskHandler, Trade trade) {
super(taskHandler, trade);
}
@@ -69,7 +69,7 @@ public class BuyerAsMakerSignPayoutTx extends TradeTask {
checkArgument(Arrays.equals(buyerMultiSigPubKey,
walletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG).getPubKey()),
"buyerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id);
- final byte[] sellerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey();
+ byte[] sellerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey();
byte[] payoutTxSignature = processModel.getTradeWalletService().buyerSignsPayoutTx(
trade.getDepositTx(),
@@ -79,8 +79,7 @@ public class BuyerAsMakerSignPayoutTx extends TradeTask {
sellerPayoutAddressString,
buyerMultiSigKeyPair,
buyerMultiSigPubKey,
- sellerMultiSigPubKey,
- trade.getArbitratorBtcPubKey());
+ sellerMultiSigPubKey);
processModel.setPayoutTxSignature(payoutTxSignature);
complete();
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignsDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignsDelayedPayoutTx.java
new file mode 100644
index 0000000000..0d0bb585ae
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignsDelayedPayoutTx.java
@@ -0,0 +1,68 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.buyer;
+
+import bisq.core.btc.model.AddressEntry;
+import bisq.core.btc.wallet.BtcWalletService;
+import bisq.core.trade.Trade;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import org.bitcoinj.core.Transaction;
+import org.bitcoinj.crypto.DeterministicKey;
+
+import java.util.Arrays;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class BuyerSignsDelayedPayoutTx extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public BuyerSignsDelayedPayoutTx(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+
+ Transaction preparedDelayedPayoutTx = checkNotNull(processModel.getPreparedDelayedPayoutTx());
+ BtcWalletService btcWalletService = processModel.getBtcWalletService();
+ String id = processModel.getOffer().getId();
+
+ byte[] buyerMultiSigPubKey = processModel.getMyMultiSigPubKey();
+ DeterministicKey myMultiSigKeyPair = btcWalletService.getMultiSigKeyPair(id, buyerMultiSigPubKey);
+
+ checkArgument(Arrays.equals(buyerMultiSigPubKey,
+ btcWalletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG).getPubKey()),
+ "buyerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id);
+ byte[] sellerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey();
+ byte[] delayedPayoutTxSignature = processModel.getTradeWalletService().signDelayedPayoutTx(preparedDelayedPayoutTx, myMultiSigKeyPair, buyerMultiSigPubKey, sellerMultiSigPubKey);
+ processModel.setDelayedPayoutTxSignature(delayedPayoutTxSignature);
+
+ complete();
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerVerifiesPeersAccountAge.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesDelayedPayoutTx.java
similarity index 50%
rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerVerifiesPeersAccountAge.java
rename to core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesDelayedPayoutTx.java
index 3f2637328a..3ec30a6778 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerVerifiesPeersAccountAge.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesDelayedPayoutTx.java
@@ -15,22 +15,23 @@
* along with Bisq. If not, see .
*/
-package bisq.core.trade.protocol.tasks.seller;
+package bisq.core.trade.protocol.tasks.buyer;
-import bisq.core.account.witness.AccountAgeRestrictions;
-import bisq.core.offer.OfferRestrictions;
import bisq.core.trade.Trade;
import bisq.core.trade.protocol.tasks.TradeTask;
import bisq.common.taskrunner.TaskRunner;
+import org.bitcoinj.core.Transaction;
+
import lombok.extern.slf4j.Slf4j;
-@Slf4j
-public class SellerVerifiesPeersAccountAge extends TradeTask {
+import static com.google.common.base.Preconditions.checkNotNull;
+@Slf4j
+public class BuyerVerifiesDelayedPayoutTx extends TradeTask {
@SuppressWarnings({"unused"})
- public SellerVerifiesPeersAccountAge(TaskRunner taskHandler, Trade trade) {
+ public BuyerVerifiesDelayedPayoutTx(TaskRunner taskHandler, Trade trade) {
super(taskHandler, trade);
}
@@ -39,19 +40,12 @@ public class SellerVerifiesPeersAccountAge extends TradeTask {
try {
runInterceptHook();
- boolean isTradeRisky = OfferRestrictions.isTradeRisky(trade);
- boolean isTradePeersAccountAgeImmature = AccountAgeRestrictions.isTradePeersAccountAgeImmature(
- processModel.getAccountAgeWitnessService(), trade);
- log.debug("SellerVerifiesPeersAccountAge isOfferRisky={} isTradePeersAccountAgeImmature={}",
- isTradeRisky, isTradePeersAccountAgeImmature);
- if (isTradeRisky &&
- isTradePeersAccountAgeImmature) {
- failed("Violation of security restrictions:\n" +
- " - The peer's account was created after March 1st 2019\n" +
- " - The trade amount is above 0.01 BTC\n" +
- " - The payment method for that offer is considered risky for bank chargebacks\n");
- } else {
+ Transaction depositTx = checkNotNull(trade.getDepositTx());
+ Transaction delayedPayoutTx = checkNotNull(trade.getDelayedPayoutTx());
+ if (processModel.getTradeWalletService().verifiesDepositTxAndDelayedPayoutTx(depositTx, delayedPayoutTx)) {
complete();
+ } else {
+ failed("DelayedPayoutTx is not spending correctly depositTx");
}
} catch (Throwable t) {
failed(t);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java
index d49995560b..f7d2e8c817 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java
@@ -57,52 +57,40 @@ public class BuyerAsMakerCreatesAndSignsDepositTx extends TradeTask {
BtcWalletService walletService = processModel.getBtcWalletService();
String id = processModel.getOffer().getId();
TradingPeer tradingPeer = processModel.getTradingPeer();
- final Offer offer = trade.getOffer();
+ Offer offer = checkNotNull(trade.getOffer());
// params
- final boolean makerIsBuyer = true;
-
- final byte[] contractHash = Hash.getSha256Hash(trade.getContractAsJson());
+ byte[] contractHash = Hash.getSha256Hash(checkNotNull(trade.getContractAsJson()));
trade.setContractHash(contractHash);
log.debug("\n\n------------------------------------------------------------\n"
+ "Contract as json\n"
+ trade.getContractAsJson()
+ "\n------------------------------------------------------------\n");
- final Coin makerInputAmount = offer.getBuyerSecurityDeposit();
+ Coin makerInputAmount = offer.getBuyerSecurityDeposit();
Optional addressEntryOptional = walletService.getAddressEntry(id, AddressEntry.Context.MULTI_SIG);
checkArgument(addressEntryOptional.isPresent(), "addressEntryOptional must be present");
AddressEntry makerMultiSigAddressEntry = addressEntryOptional.get();
makerMultiSigAddressEntry.setCoinLockedInMultiSig(makerInputAmount);
walletService.saveAddressEntryList();
- final Coin msOutputAmount = makerInputAmount
+ Coin msOutputAmount = makerInputAmount
.add(trade.getTxFee())
.add(offer.getSellerSecurityDeposit())
.add(trade.getTradeAmount());
- final List takerRawTransactionInputs = tradingPeer.getRawTransactionInputs();
-
- final long takerChangeOutputValue = tradingPeer.getChangeOutputValue();
-
- final String takerChangeAddressString = tradingPeer.getChangeOutputAddress();
-
- final Address makerAddress = walletService.getOrCreateAddressEntry(id,
- AddressEntry.Context.RESERVED_FOR_TRADE).getAddress();
-
- final Address makerChangeAddress = walletService.getFreshAddressEntry().getAddress();
-
- final byte[] buyerPubKey = processModel.getMyMultiSigPubKey();
+ List takerRawTransactionInputs = checkNotNull(tradingPeer.getRawTransactionInputs());
+ long takerChangeOutputValue = tradingPeer.getChangeOutputValue();
+ String takerChangeAddressString = tradingPeer.getChangeOutputAddress();
+ Address makerAddress = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.RESERVED_FOR_TRADE).getAddress();
+ Address makerChangeAddress = walletService.getFreshAddressEntry().getAddress();
+ byte[] buyerPubKey = processModel.getMyMultiSigPubKey();
+ byte[] sellerPubKey = tradingPeer.getMultiSigPubKey();
checkArgument(Arrays.equals(buyerPubKey,
makerMultiSigAddressEntry.getPubKey()),
"buyerPubKey from AddressEntry must match the one from the trade data. trade id =" + id);
- final byte[] sellerPubKey = tradingPeer.getMultiSigPubKey();
-
- final byte[] arbitratorBtcPubKey = trade.getArbitratorBtcPubKey();
-
- PreparedDepositTxAndMakerInputs result = processModel.getTradeWalletService().makerCreatesAndSignsDepositTx(
- makerIsBuyer,
+ PreparedDepositTxAndMakerInputs result = processModel.getTradeWalletService().buyerAsMakerCreatesAndSignsDepositTx(
contractHash,
makerInputAmount,
msOutputAmount,
@@ -112,8 +100,7 @@ public class BuyerAsMakerCreatesAndSignsDepositTx extends TradeTask {
makerAddress,
makerChangeAddress,
buyerPubKey,
- sellerPubKey,
- arbitratorBtcPubKey);
+ sellerPubKey);
processModel.setPreparedDepositTx(result.depositTransaction);
processModel.setRawTransactionInputs(result.rawMakerInputs);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java
new file mode 100644
index 0000000000..029a8213dc
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java
@@ -0,0 +1,38 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.buyer_as_maker;
+
+import bisq.core.trade.Trade;
+import bisq.core.trade.protocol.tasks.maker.MakerSendsInputsForDepositTxResponse;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class BuyerAsMakerSendsInputsForDepositTxResponse extends MakerSendsInputsForDepositTxResponse {
+ @SuppressWarnings({"unused"})
+ public BuyerAsMakerSendsInputsForDepositTxResponse(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected byte[] getPreparedDepositTx() {
+ return processModel.getPreparedDepositTx();
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java
index 79b18574dd..ad0efc70bf 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java
@@ -17,19 +17,18 @@
package bisq.core.trade.protocol.tasks.buyer_as_taker;
-import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.model.InputsAndChangeOutput;
-import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.trade.Trade;
import bisq.core.trade.protocol.tasks.TradeTask;
import bisq.common.taskrunner.TaskRunner;
-import org.bitcoinj.core.Address;
import org.bitcoinj.core.Coin;
import lombok.extern.slf4j.Slf4j;
+import static com.google.common.base.Preconditions.checkNotNull;
+
@Slf4j
public class BuyerAsTakerCreatesDepositTxInputs extends TradeTask {
@@ -47,15 +46,15 @@ public class BuyerAsTakerCreatesDepositTxInputs extends TradeTask {
Coin bsqTakerFee = trade.isCurrencyForTakerFeeBtc() ? Coin.ZERO : trade.getTakerFee();
Coin txFee = trade.getTxFee();
- Coin takerInputAmount = trade.getOffer().getBuyerSecurityDeposit().add(txFee).add(txFee).subtract(bsqTakerFee);
- BtcWalletService walletService = processModel.getBtcWalletService();
- Address takersAddress = walletService.getOrCreateAddressEntry(processModel.getOffer().getId(),
- AddressEntry.Context.RESERVED_FOR_TRADE).getAddress();
- InputsAndChangeOutput result = processModel.getTradeWalletService().takerCreatesDepositsTxInputs(
+ Coin takerInputAmount = checkNotNull(trade.getOffer()).getBuyerSecurityDeposit()
+ .add(txFee)
+ .add(txFee)
+ .subtract(bsqTakerFee);
+ Coin fee = txFee.subtract(bsqTakerFee);
+ InputsAndChangeOutput result = processModel.getTradeWalletService().takerCreatesDepositTxInputs(
processModel.getTakeOfferFeeTx(),
takerInputAmount,
- txFee.subtract(bsqTakerFee),
- takersAddress);
+ fee);
processModel.setRawTransactionInputs(result.rawTransactionInputs);
processModel.setChangeOutputValue(result.changeOutputValue);
processModel.setChangeOutputAddress(result.changeOutputAddress);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java
new file mode 100644
index 0000000000..f0391f91eb
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java
@@ -0,0 +1,87 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.buyer_as_taker;
+
+import bisq.core.trade.Trade;
+import bisq.core.trade.messages.DepositTxMessage;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.network.p2p.NodeAddress;
+import bisq.network.p2p.SendDirectMessageListener;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import java.util.UUID;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class BuyerAsTakerSendsDepositTxMessage extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public BuyerAsTakerSendsDepositTxMessage(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+ if (trade.getDepositTx() != null) {
+ DepositTxMessage message = new DepositTxMessage(UUID.randomUUID().toString(),
+ processModel.getOfferId(),
+ processModel.getMyNodeAddress(),
+ trade.getDepositTx().bitcoinSerialize());
+
+ // todo trade.setState
+
+ NodeAddress peersNodeAddress = trade.getTradingPeerNodeAddress();
+ log.info("Send {} to peer {}. tradeId={}, uid={}",
+ message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
+ processModel.getP2PService().sendEncryptedDirectMessage(
+ peersNodeAddress,
+ processModel.getTradingPeer().getPubKeyRing(),
+ message,
+ new SendDirectMessageListener() {
+ @Override
+ public void onArrived() {
+ log.info("{} arrived at peer {}. tradeId={}, uid={}",
+ message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
+ // todo trade.setState
+ complete();
+ }
+
+ @Override
+ public void onFault(String errorMessage) {
+ log.error("{} failed: Peer {}. tradeId={}, uid={}, errorMessage={}",
+ message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid(), errorMessage);
+
+ // todo trade.setState
+ appendToErrorMessage("Sending message failed: message=" + message + "\nerrorMessage=" + errorMessage);
+ failed();
+ }
+ }
+ );
+ } else {
+ log.error("trade.getDepositTx() = " + trade.getDepositTx());
+ failed("DepositTx is null");
+ }
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignAndPublishDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java
similarity index 55%
rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignAndPublishDepositTx.java
rename to core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java
index 125e347578..f5cdcb3760 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignAndPublishDepositTx.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java
@@ -17,11 +17,9 @@
package bisq.core.trade.protocol.tasks.buyer_as_taker;
-import bisq.core.btc.exceptions.TxBroadcastException;
import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.model.RawTransactionInput;
import bisq.core.btc.wallet.BtcWalletService;
-import bisq.core.btc.wallet.TxBroadcaster;
import bisq.core.trade.Trade;
import bisq.core.trade.protocol.TradingPeer;
import bisq.core.trade.protocol.tasks.TradeTask;
@@ -42,10 +40,10 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
-public class BuyerAsTakerSignAndPublishDepositTx extends TradeTask {
+public class BuyerAsTakerSignsDepositTx extends TradeTask {
@SuppressWarnings({"unused"})
- public BuyerAsTakerSignAndPublishDepositTx(TaskRunner taskHandler, Trade trade) {
+ public BuyerAsTakerSignsDepositTx(TaskRunner taskHandler, Trade trade) {
super(taskHandler, trade);
}
@@ -60,7 +58,7 @@ public class BuyerAsTakerSignAndPublishDepositTx extends TradeTask {
+ "\n------------------------------------------------------------\n");
- byte[] contractHash = Hash.getSha256Hash(trade.getContractAsJson());
+ byte[] contractHash = Hash.getSha256Hash(checkNotNull(trade.getContractAsJson()));
trade.setContractHash(contractHash);
List buyerInputs = checkNotNull(processModel.getRawTransactionInputs(), "buyerInputs must not be null");
BtcWalletService walletService = processModel.getBtcWalletService();
@@ -79,49 +77,19 @@ public class BuyerAsTakerSignAndPublishDepositTx extends TradeTask {
checkArgument(Arrays.equals(buyerMultiSigPubKey, buyerMultiSigAddressEntry.getPubKey()),
"buyerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id);
- Transaction depositTx = processModel.getTradeWalletService().takerSignsAndPublishesDepositTx(
+ List sellerInputs = checkNotNull(tradingPeer.getRawTransactionInputs());
+ byte[] sellerMultiSigPubKey = tradingPeer.getMultiSigPubKey();
+ Transaction depositTx = processModel.getTradeWalletService().takerSignsDepositTx(
false,
contractHash,
processModel.getPreparedDepositTx(),
buyerInputs,
- tradingPeer.getRawTransactionInputs(),
+ sellerInputs,
buyerMultiSigPubKey,
- tradingPeer.getMultiSigPubKey(),
- trade.getArbitratorBtcPubKey(),
- new TxBroadcaster.Callback() {
- @Override
- public void onSuccess(Transaction transaction) {
- if (!completed) {
- // We set the depositTx before we change the state as the state change triggers code
- // which expected the tx to be available. That case will usually never happen as the
- // callback is called after the method call has returned but in some test scenarios
- // with regtest we run into such issues, thus fixing it to make it more stict seems
- // reasonable.
- trade.setDepositTx(transaction);
- log.trace("takerSignsAndPublishesDepositTx succeeded " + transaction);
- trade.setState(Trade.State.TAKER_PUBLISHED_DEPOSIT_TX);
- walletService.swapTradeEntryToAvailableEntry(id, AddressEntry.Context.RESERVED_FOR_TRADE);
+ sellerMultiSigPubKey);
+ trade.applyDepositTx(depositTx);
- complete();
- } else {
- log.warn("We got the onSuccess callback called after the timeout has been triggered a complete().");
- }
- }
-
- @Override
- public void onFailure(TxBroadcastException exception) {
- if (!completed) {
- failed(exception);
- } else {
- log.warn("We got the onFailure callback called after the timeout has been triggered a complete().");
- }
- }
- });
- if (trade.getDepositTx() == null) {
- // We set the deposit tx in case we get the onFailure called. We cannot set it in the onFailure
- // callback as the tx is returned by the method call where the callback is used as an argument.
- trade.setDepositTx(depositTx);
- }
+ complete();
} catch (Throwable t) {
failed(t);
}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerCreateAndSignContract.java b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerCreateAndSignContract.java
index 417a4be432..fcd6ec6a79 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerCreateAndSignContract.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerCreateAndSignContract.java
@@ -55,7 +55,7 @@ public class MakerCreateAndSignContract extends TradeTask {
TradingPeer taker = processModel.getTradingPeer();
PaymentAccountPayload makerPaymentAccountPayload = processModel.getPaymentAccountPayload(trade);
checkNotNull(makerPaymentAccountPayload, "makerPaymentAccountPayload must not be null");
- PaymentAccountPayload takerPaymentAccountPayload = taker.getPaymentAccountPayload();
+ PaymentAccountPayload takerPaymentAccountPayload = checkNotNull(taker.getPaymentAccountPayload());
boolean isBuyerMakerAndSellerTaker = trade instanceof BuyerAsMakerTrade;
NodeAddress buyerNodeAddress = isBuyerMakerAndSellerTaker ?
@@ -79,7 +79,6 @@ public class MakerCreateAndSignContract extends TradeTask {
trade.getTakerFeeTxId(),
buyerNodeAddress,
sellerNodeAddress,
- trade.getArbitratorNodeAddress(),
trade.getMediatorNodeAddress(),
isBuyerMakerAndSellerTaker,
processModel.getAccountId(),
@@ -91,7 +90,9 @@ public class MakerCreateAndSignContract extends TradeTask {
takerAddressEntry.getAddressString(),
taker.getPayoutAddressString(),
makerMultiSigPubKey,
- taker.getMultiSigPubKey()
+ taker.getMultiSigPubKey(),
+ trade.getLockTime(),
+ trade.getRefundAgentNodeAddress()
);
String contractAsJson = Utilities.objectToJson(contract);
String signature = Sig.sign(processModel.getKeyRing().getSignatureKeyPair().getPrivate(), contractAsJson);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessPayDepositRequest.java b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessesInputsForDepositTxRequest.java
similarity index 50%
rename from core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessPayDepositRequest.java
rename to core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessesInputsForDepositTxRequest.java
index 3a8088905c..68fbbc5178 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessPayDepositRequest.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessesInputsForDepositTxRequest.java
@@ -19,10 +19,9 @@ package bisq.core.trade.protocol.tasks.maker;
import bisq.core.exceptions.TradePriceOutOfToleranceException;
import bisq.core.offer.Offer;
-import bisq.core.support.dispute.arbitration.arbitrator.Arbitrator;
import bisq.core.support.dispute.mediation.mediator.Mediator;
import bisq.core.trade.Trade;
-import bisq.core.trade.messages.PayDepositRequest;
+import bisq.core.trade.messages.InputsForDepositTxRequest;
import bisq.core.trade.protocol.TradingPeer;
import bisq.core.trade.protocol.tasks.TradeTask;
import bisq.core.user.User;
@@ -43,9 +42,9 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
-public class MakerProcessPayDepositRequest extends TradeTask {
+public class MakerProcessesInputsForDepositTxRequest extends TradeTask {
@SuppressWarnings({"unused"})
- public MakerProcessPayDepositRequest(TaskRunner taskHandler, Trade trade) {
+ public MakerProcessesInputsForDepositTxRequest(TaskRunner taskHandler, Trade trade) {
super(taskHandler, trade);
}
@@ -54,47 +53,33 @@ public class MakerProcessPayDepositRequest extends TradeTask {
try {
runInterceptHook();
log.debug("current trade state " + trade.getState());
- PayDepositRequest payDepositRequest = (PayDepositRequest) processModel.getTradeMessage();
- checkNotNull(payDepositRequest);
- checkTradeId(processModel.getOfferId(), payDepositRequest);
+ InputsForDepositTxRequest inputsForDepositTxRequest = (InputsForDepositTxRequest) processModel.getTradeMessage();
+ checkNotNull(inputsForDepositTxRequest);
+ checkTradeId(processModel.getOfferId(), inputsForDepositTxRequest);
final TradingPeer tradingPeer = processModel.getTradingPeer();
- tradingPeer.setPaymentAccountPayload(checkNotNull(payDepositRequest.getTakerPaymentAccountPayload()));
- tradingPeer.setRawTransactionInputs(checkNotNull(payDepositRequest.getRawTransactionInputs()));
- checkArgument(payDepositRequest.getRawTransactionInputs().size() > 0);
+ tradingPeer.setPaymentAccountPayload(checkNotNull(inputsForDepositTxRequest.getTakerPaymentAccountPayload()));
+ tradingPeer.setRawTransactionInputs(checkNotNull(inputsForDepositTxRequest.getRawTransactionInputs()));
+ checkArgument(inputsForDepositTxRequest.getRawTransactionInputs().size() > 0);
- tradingPeer.setChangeOutputValue(payDepositRequest.getChangeOutputValue());
- tradingPeer.setChangeOutputAddress(payDepositRequest.getChangeOutputAddress());
+ tradingPeer.setChangeOutputValue(inputsForDepositTxRequest.getChangeOutputValue());
+ tradingPeer.setChangeOutputAddress(inputsForDepositTxRequest.getChangeOutputAddress());
- tradingPeer.setMultiSigPubKey(checkNotNull(payDepositRequest.getTakerMultiSigPubKey()));
- tradingPeer.setPayoutAddressString(nonEmptyStringOf(payDepositRequest.getTakerPayoutAddressString()));
- tradingPeer.setPubKeyRing(checkNotNull(payDepositRequest.getTakerPubKeyRing()));
+ tradingPeer.setMultiSigPubKey(checkNotNull(inputsForDepositTxRequest.getTakerMultiSigPubKey()));
+ tradingPeer.setPayoutAddressString(nonEmptyStringOf(inputsForDepositTxRequest.getTakerPayoutAddressString()));
+ tradingPeer.setPubKeyRing(checkNotNull(inputsForDepositTxRequest.getTakerPubKeyRing()));
- tradingPeer.setAccountId(nonEmptyStringOf(payDepositRequest.getTakerAccountId()));
- trade.setTakerFeeTxId(nonEmptyStringOf(payDepositRequest.getTakerFeeTxId()));
- processModel.setTakerAcceptedArbitratorNodeAddresses(checkNotNull(payDepositRequest.getAcceptedArbitratorNodeAddresses()));
- processModel.setTakerAcceptedMediatorNodeAddresses(checkNotNull(payDepositRequest.getAcceptedMediatorNodeAddresses()));
- if (payDepositRequest.getAcceptedArbitratorNodeAddresses().isEmpty())
- failed("acceptedArbitratorNodeAddresses must not be empty");
+ tradingPeer.setAccountId(nonEmptyStringOf(inputsForDepositTxRequest.getTakerAccountId()));
+ trade.setTakerFeeTxId(nonEmptyStringOf(inputsForDepositTxRequest.getTakerFeeTxId()));
// Taker has to sign offerId (he cannot manipulate that - so we avoid to have a challenge protocol for passing the nonce we want to get signed)
tradingPeer.setAccountAgeWitnessNonce(trade.getId().getBytes(Charsets.UTF_8));
- tradingPeer.setAccountAgeWitnessSignature(payDepositRequest.getAccountAgeWitnessSignatureOfOfferId());
- tradingPeer.setCurrentDate(payDepositRequest.getCurrentDate());
+ tradingPeer.setAccountAgeWitnessSignature(inputsForDepositTxRequest.getAccountAgeWitnessSignatureOfOfferId());
+ tradingPeer.setCurrentDate(inputsForDepositTxRequest.getCurrentDate());
User user = checkNotNull(processModel.getUser(), "User must not be null");
- NodeAddress arbitratorNodeAddress = checkNotNull(payDepositRequest.getArbitratorNodeAddress(),
- "payDepositRequest.getArbitratorNodeAddress() must not be null");
- trade.setArbitratorNodeAddress(arbitratorNodeAddress);
- Arbitrator arbitrator = checkNotNull(user.getAcceptedArbitratorByAddress(arbitratorNodeAddress),
- "user.getAcceptedArbitratorByAddress(arbitratorNodeAddress) must not be null");
- trade.setArbitratorBtcPubKey(checkNotNull(arbitrator.getBtcPubKey(),
- "arbitrator.getBtcPubKey() must not be null"));
- trade.setArbitratorPubKeyRing(checkNotNull(arbitrator.getPubKeyRing(),
- "arbitrator.getPubKeyRing() must not be null"));
-
- NodeAddress mediatorNodeAddress = checkNotNull(payDepositRequest.getMediatorNodeAddress(),
+ NodeAddress mediatorNodeAddress = checkNotNull(inputsForDepositTxRequest.getMediatorNodeAddress(),
"payDepositRequest.getMediatorNodeAddress() must not be null");
trade.setMediatorNodeAddress(mediatorNodeAddress);
Mediator mediator = checkNotNull(user.getAcceptedMediatorByAddress(mediatorNodeAddress),
@@ -104,7 +89,7 @@ public class MakerProcessPayDepositRequest extends TradeTask {
Offer offer = checkNotNull(trade.getOffer(), "Offer must not be null");
try {
- long takersTradePrice = payDepositRequest.getTradePrice();
+ long takersTradePrice = inputsForDepositTxRequest.getTradePrice();
offer.checkTradePriceTolerance(takersTradePrice);
trade.setTradePrice(takersTradePrice);
} catch (TradePriceOutOfToleranceException e) {
@@ -113,15 +98,13 @@ public class MakerProcessPayDepositRequest extends TradeTask {
failed(e2);
}
- checkArgument(payDepositRequest.getTradeAmount() > 0);
- trade.setTradeAmount(Coin.valueOf(payDepositRequest.getTradeAmount()));
+ checkArgument(inputsForDepositTxRequest.getTradeAmount() > 0);
+ trade.setTradeAmount(Coin.valueOf(inputsForDepositTxRequest.getTradeAmount()));
trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
trade.persist();
- processModel.removeMailboxMessageAfterProcessing(trade);
-
complete();
} catch (Throwable t) {
failed(t);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendPublishDepositTxRequest.java b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendsInputsForDepositTxResponse.java
similarity index 79%
rename from core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendPublishDepositTxRequest.java
rename to core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendsInputsForDepositTxResponse.java
index 8bb029f140..2cd81721ee 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendPublishDepositTxRequest.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendsInputsForDepositTxResponse.java
@@ -21,11 +21,11 @@ import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.trade.Trade;
-import bisq.core.trade.messages.PublishDepositTxRequest;
+import bisq.core.trade.messages.InputsForDepositTxResponse;
import bisq.core.trade.protocol.tasks.TradeTask;
import bisq.network.p2p.NodeAddress;
-import bisq.network.p2p.SendMailboxMessageListener;
+import bisq.network.p2p.SendDirectMessageListener;
import bisq.common.crypto.Sig;
import bisq.common.taskrunner.TaskRunner;
@@ -41,12 +41,14 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
-public class MakerSendPublishDepositTxRequest extends TradeTask {
+public abstract class MakerSendsInputsForDepositTxResponse extends TradeTask {
@SuppressWarnings({"unused"})
- public MakerSendPublishDepositTxRequest(TaskRunner taskHandler, Trade trade) {
+ public MakerSendsInputsForDepositTxResponse(TaskRunner taskHandler, Trade trade) {
super(taskHandler, trade);
}
+ protected abstract byte[] getPreparedDepositTx();
+
@Override
protected void run() {
try {
@@ -62,15 +64,16 @@ public class MakerSendPublishDepositTxRequest extends TradeTask {
addressEntryOptional.get().getPubKey()),
"makerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id);
- final byte[] preparedDepositTx = processModel.getPreparedDepositTx();
+ byte[] preparedDepositTx = getPreparedDepositTx();
// Maker has to use preparedDepositTx as nonce.
// He cannot manipulate the preparedDepositTx - so we avoid to have a challenge protocol for passing the nonce we want to get signed.
- final PaymentAccountPayload paymentAccountPayload = checkNotNull(processModel.getPaymentAccountPayload(trade), "processModel.getPaymentAccountPayload(trade) must not be null");
+ PaymentAccountPayload paymentAccountPayload = checkNotNull(processModel.getPaymentAccountPayload(trade),
+ "processModel.getPaymentAccountPayload(trade) must not be null");
byte[] sig = Sig.sign(processModel.getKeyRing().getSignatureKeyPair().getPrivate(), preparedDepositTx);
- PublishDepositTxRequest message = new PublishDepositTxRequest(
+ InputsForDepositTxResponse message = new InputsForDepositTxResponse(
processModel.getOfferId(),
paymentAccountPayload,
processModel.getAccountId(),
@@ -83,18 +86,19 @@ public class MakerSendPublishDepositTxRequest extends TradeTask {
processModel.getMyNodeAddress(),
UUID.randomUUID().toString(),
sig,
- new Date().getTime());
+ new Date().getTime(),
+ trade.getLockTime());
trade.setState(Trade.State.MAKER_SENT_PUBLISH_DEPOSIT_TX_REQUEST);
NodeAddress peersNodeAddress = trade.getTradingPeerNodeAddress();
log.info("Send {} to peer {}. tradeId={}, uid={}",
message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
- processModel.getP2PService().sendEncryptedMailboxMessage(
+ processModel.getP2PService().sendEncryptedDirectMessage(
peersNodeAddress,
processModel.getTradingPeer().getPubKeyRing(),
message,
- new SendMailboxMessageListener() {
+ new SendDirectMessageListener() {
@Override
public void onArrived() {
log.info("{} arrived at peer {}. tradeId={}, uid={}",
@@ -103,14 +107,6 @@ public class MakerSendPublishDepositTxRequest extends TradeTask {
complete();
}
- @Override
- public void onStoredInMailbox() {
- log.info("{} stored in mailbox for peer {}. tradeId={}, uid={}",
- message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
- trade.setState(Trade.State.MAKER_STORED_IN_MAILBOX_PUBLISH_DEPOSIT_TX_REQUEST);
- complete();
- }
-
@Override
public void onFault(String errorMessage) {
log.error("{} failed: Peer {}. tradeId={}, uid={}, errorMessage={}",
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java
new file mode 100644
index 0000000000..18cb46a96c
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java
@@ -0,0 +1,56 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.maker;
+
+import bisq.core.app.BisqEnvironment;
+import bisq.core.trade.Trade;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.common.app.DevEnv;
+import bisq.common.taskrunner.TaskRunner;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class MakerSetsLockTime extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public MakerSetsLockTime(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+
+ // 10 days for altcoins, 20 days for other payment methods
+ int delay = processModel.getOffer().getPaymentMethod().isAsset() ? 144 * 10 : 144 * 20;
+ if (BisqEnvironment.getBaseCurrencyNetwork().isRegtest()) {
+ delay = 5;
+ }
+
+ long lockTime = processModel.getBtcWalletService().getBestChainHeight() + delay;
+ log.info("lockTime={}, delay={}", lockTime, delay);
+ trade.setLockTime(lockTime);
+
+ complete();
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/FinalizeMediatedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/FinalizeMediatedPayoutTx.java
index b88a39ff05..96d8db5b4e 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/FinalizeMediatedPayoutTx.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/FinalizeMediatedPayoutTx.java
@@ -104,8 +104,7 @@ public class FinalizeMediatedPayoutTx extends TradeTask {
sellerPayoutAddressString,
multiSigKeyPair,
buyerMultiSigPubKey,
- sellerMultiSigPubKey,
- trade.getArbitratorBtcPubKey()
+ sellerMultiSigPubKey
);
trade.setPayoutTx(transaction);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java
index cb94c85d5a..e6c60eb4a1 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java
@@ -19,6 +19,7 @@ package bisq.core.trade.protocol.tasks.mediation;
import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.wallet.BtcWalletService;
+import bisq.core.btc.wallet.WalletService;
import bisq.core.support.dispute.mediation.MediationResultState;
import bisq.core.trade.Trade;
import bisq.core.trade.messages.MediatedPayoutTxPublishedMessage;
@@ -55,9 +56,9 @@ public class ProcessMediatedPayoutTxPublishedMessage extends TradeTask {
trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
if (trade.getPayoutTx() == null) {
- Transaction walletTx = processModel.getTradeWalletService().addTxToWallet(message.getPayoutTx());
- trade.setPayoutTx(walletTx);
- BtcWalletService.printTx("payoutTx received from peer", walletTx);
+ Transaction committedMediatedPayoutTx = WalletService.maybeAddNetworkTxToWallet(message.getPayoutTx(), processModel.getBtcWalletService().getWallet());
+ trade.setPayoutTx(committedMediatedPayoutTx);
+ BtcWalletService.printTx("MediatedPayoutTx received from peer", committedMediatedPayoutTx);
trade.setMediationResultState(MediationResultState.RECEIVED_PAYOUT_TX_PUBLISHED_MSG);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SignMediatedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SignMediatedPayoutTx.java
index 59c27e8317..5a48240f7d 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SignMediatedPayoutTx.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SignMediatedPayoutTx.java
@@ -97,8 +97,7 @@ public class SignMediatedPayoutTx extends TradeTask {
sellerPayoutAddressString,
myMultiSigKeyPair,
buyerMultiSigPubKey,
- sellerMultiSigPubKey,
- trade.getArbitratorBtcPubKey());
+ sellerMultiSigPubKey);
processModel.setMediatedPayoutTxSignature(mediatedPayoutTxSignature);
complete();
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerCreatesDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerCreatesDelayedPayoutTx.java
new file mode 100644
index 0000000000..6bddc5d9d6
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerCreatesDelayedPayoutTx.java
@@ -0,0 +1,65 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.seller;
+
+import bisq.core.btc.wallet.TradeWalletService;
+import bisq.core.dao.governance.param.Param;
+import bisq.core.trade.Trade;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import org.bitcoinj.core.Coin;
+import org.bitcoinj.core.Transaction;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class SellerCreatesDelayedPayoutTx extends TradeTask {
+
+ @SuppressWarnings({"unused"})
+ public SellerCreatesDelayedPayoutTx(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+
+ String donationAddressString = processModel.getDaoFacade().getParamValue(Param.RECIPIENT_BTC_ADDRESS);
+ Coin minerFee = trade.getTxFee();
+ TradeWalletService tradeWalletService = processModel.getTradeWalletService();
+ Transaction depositTx = checkNotNull(trade.getDepositTx());
+
+ long lockTime = trade.getLockTime();
+ Transaction preparedDelayedPayoutTx = tradeWalletService.createDelayedUnsignedPayoutTx(depositTx,
+ donationAddressString,
+ minerFee,
+ lockTime);
+
+ processModel.setPreparedDelayedPayoutTx(preparedDelayedPayoutTx);
+
+ complete();
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerFinalizesDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerFinalizesDelayedPayoutTx.java
new file mode 100644
index 0000000000..c43dc9da4d
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerFinalizesDelayedPayoutTx.java
@@ -0,0 +1,74 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.seller;
+
+import bisq.core.btc.model.AddressEntry;
+import bisq.core.btc.wallet.BtcWalletService;
+import bisq.core.trade.Trade;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import org.bitcoinj.core.Transaction;
+
+import java.util.Arrays;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class SellerFinalizesDelayedPayoutTx extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public SellerFinalizesDelayedPayoutTx(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+
+ Transaction preparedDelayedPayoutTx = checkNotNull(processModel.getPreparedDelayedPayoutTx());
+ BtcWalletService btcWalletService = processModel.getBtcWalletService();
+ String id = processModel.getOffer().getId();
+
+ byte[] buyerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey();
+ byte[] sellerMultiSigPubKey = processModel.getMyMultiSigPubKey();
+ checkArgument(Arrays.equals(sellerMultiSigPubKey,
+ btcWalletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG).getPubKey()),
+ "sellerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id);
+
+ byte[] buyerSignature = processModel.getTradingPeer().getDelayedPayoutTxSignature();
+ byte[] sellerSignature = processModel.getDelayedPayoutTxSignature();
+
+ Transaction signedDelayedPayoutTx = processModel.getTradeWalletService().finalizeDelayedPayoutTx(preparedDelayedPayoutTx,
+ buyerMultiSigPubKey,
+ sellerMultiSigPubKey,
+ buyerSignature,
+ sellerSignature);
+
+ trade.applyDelayedPayoutTx(signedDelayedPayoutTx);
+
+ complete();
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java
new file mode 100644
index 0000000000..e2e3d7cd37
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.seller;
+
+import bisq.core.trade.Trade;
+import bisq.core.trade.messages.DelayedPayoutTxSignatureResponse;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static bisq.core.util.Validator.checkTradeId;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class SellerProcessDelayedPayoutTxSignatureResponse extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public SellerProcessDelayedPayoutTxSignatureResponse(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+ DelayedPayoutTxSignatureResponse delayedPayoutTxSignatureResponse = (DelayedPayoutTxSignatureResponse) processModel.getTradeMessage();
+ checkNotNull(delayedPayoutTxSignatureResponse);
+ checkTradeId(processModel.getOfferId(), delayedPayoutTxSignatureResponse);
+
+ byte[] delayedPayoutTxSignature = checkNotNull(delayedPayoutTxSignatureResponse.getDelayedPayoutTxSignature());
+ processModel.getTradingPeer().setDelayedPayoutTxSignature(delayedPayoutTxSignature);
+
+ // update to the latest peer address of our peer if the message is correct
+ trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
+
+ // todo trade.setState
+
+ complete();
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesDepositTx.java
new file mode 100644
index 0000000000..be9b3fc1bd
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesDepositTx.java
@@ -0,0 +1,76 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.seller;
+
+import bisq.core.btc.exceptions.TxBroadcastException;
+import bisq.core.btc.model.AddressEntry;
+import bisq.core.btc.wallet.TxBroadcaster;
+import bisq.core.trade.Contract;
+import bisq.core.trade.Trade;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import org.bitcoinj.core.Transaction;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class SellerPublishesDepositTx extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public SellerPublishesDepositTx(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+
+ processModel.getTradeWalletService().broadcastTx(trade.getDepositTx(),
+ new TxBroadcaster.Callback() {
+ @Override
+ public void onSuccess(Transaction transaction) {
+ if (!completed) {
+ trade.setState(Trade.State.SELLER_PUBLISHED_DEPOSIT_TX);
+
+ processModel.getBtcWalletService().swapTradeEntryToAvailableEntry(processModel.getOffer().getId(), AddressEntry.Context.RESERVED_FOR_TRADE);
+
+ complete();
+ } else {
+ log.warn("We got the onSuccess callback called after the timeout has been triggered a complete().");
+ }
+ }
+
+ @Override
+ public void onFailure(TxBroadcastException exception) {
+ if (!completed) {
+ failed(exception);
+ } else {
+ log.warn("We got the onFailure callback called after the timeout has been triggered a complete().");
+ }
+ }
+ });
+ } catch (Throwable t) {
+ Contract contract = trade.getContract();
+ if (contract != null)
+ contract.printDiff(processModel.getTradingPeer().getContractAsJson());
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java
new file mode 100644
index 0000000000..187c274304
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java
@@ -0,0 +1,88 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.seller;
+
+import bisq.core.trade.Trade;
+import bisq.core.trade.messages.DelayedPayoutTxSignatureRequest;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.network.p2p.NodeAddress;
+import bisq.network.p2p.SendDirectMessageListener;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import org.bitcoinj.core.Transaction;
+
+import java.util.UUID;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class SellerSendDelayedPayoutTxSignatureRequest extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public SellerSendDelayedPayoutTxSignatureRequest(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+
+ Transaction preparedDelayedPayoutTx = checkNotNull(processModel.getPreparedDelayedPayoutTx(),
+ "processModel.getPreparedDelayedPayoutTx() must not be null");
+ DelayedPayoutTxSignatureRequest message = new DelayedPayoutTxSignatureRequest(UUID.randomUUID().toString(),
+ processModel.getOfferId(),
+ processModel.getMyNodeAddress(),
+ preparedDelayedPayoutTx.bitcoinSerialize());
+
+ // todo trade.setState
+
+ NodeAddress peersNodeAddress = trade.getTradingPeerNodeAddress();
+ log.info("Send {} to peer {}. tradeId={}, uid={}",
+ message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
+ processModel.getP2PService().sendEncryptedDirectMessage(
+ peersNodeAddress,
+ processModel.getTradingPeer().getPubKeyRing(),
+ message,
+ new SendDirectMessageListener() {
+ @Override
+ public void onArrived() {
+ log.info("{} arrived at peer {}. tradeId={}, uid={}",
+ message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
+ // todo trade.setState
+ complete();
+ }
+
+ @Override
+ public void onFault(String errorMessage) {
+ log.error("{} failed: Peer {}. tradeId={}, uid={}, errorMessage={}",
+ message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid(), errorMessage);
+ // todo trade.setState
+ appendToErrorMessage("Sending message failed: message=" + message + "\nerrorMessage=" + errorMessage);
+ failed();
+ }
+ }
+ );
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendDepositTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java
similarity index 73%
rename from core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendDepositTxPublishedMessage.java
rename to core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java
index ce9034b98d..077bca1363 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendDepositTxPublishedMessage.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java
@@ -15,10 +15,10 @@
* along with Bisq. If not, see .
*/
-package bisq.core.trade.protocol.tasks.taker;
+package bisq.core.trade.protocol.tasks.seller;
import bisq.core.trade.Trade;
-import bisq.core.trade.messages.DepositTxPublishedMessage;
+import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage;
import bisq.core.trade.protocol.tasks.TradeTask;
import bisq.network.p2p.NodeAddress;
@@ -26,14 +26,18 @@ import bisq.network.p2p.SendMailboxMessageListener;
import bisq.common.taskrunner.TaskRunner;
+import org.bitcoinj.core.Transaction;
+
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
+import static com.google.common.base.Preconditions.checkNotNull;
+
@Slf4j
-public class TakerSendDepositTxPublishedMessage extends TradeTask {
+public class SellerSendsDepositTxAndDelayedPayoutTxMessage extends TradeTask {
@SuppressWarnings({"unused"})
- public TakerSendDepositTxPublishedMessage(TaskRunner taskHandler, Trade trade) {
+ public SellerSendsDepositTxAndDelayedPayoutTxMessage(TaskRunner taskHandler, Trade trade) {
super(taskHandler, trade);
}
@@ -42,12 +46,14 @@ public class TakerSendDepositTxPublishedMessage extends TradeTask {
try {
runInterceptHook();
if (trade.getDepositTx() != null) {
- final String id = processModel.getOfferId();
- DepositTxPublishedMessage message = new DepositTxPublishedMessage(processModel.getOfferId(),
- trade.getDepositTx().bitcoinSerialize(),
+ Transaction delayedPayoutTx = checkNotNull(trade.getDelayedPayoutTx());
+ Transaction depositTx = checkNotNull(trade.getDepositTx());
+ DepositTxAndDelayedPayoutTxMessage message = new DepositTxAndDelayedPayoutTxMessage(UUID.randomUUID().toString(),
+ processModel.getOfferId(),
processModel.getMyNodeAddress(),
- UUID.randomUUID().toString());
- trade.setState(Trade.State.TAKER_SENT_DEPOSIT_TX_PUBLISHED_MSG);
+ depositTx.bitcoinSerialize(),
+ delayedPayoutTx.bitcoinSerialize());
+ trade.setState(Trade.State.SELLER_SENT_DEPOSIT_TX_PUBLISHED_MSG);
NodeAddress peersNodeAddress = trade.getTradingPeerNodeAddress();
log.info("Send {} to peer {}. tradeId={}, uid={}",
@@ -61,7 +67,7 @@ public class TakerSendDepositTxPublishedMessage extends TradeTask {
public void onArrived() {
log.info("{} arrived at peer {}. tradeId={}, uid={}",
message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
- trade.setState(Trade.State.TAKER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG);
+ trade.setState(Trade.State.SELLER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG);
complete();
}
@@ -69,7 +75,8 @@ public class TakerSendDepositTxPublishedMessage extends TradeTask {
public void onStoredInMailbox() {
log.info("{} stored in mailbox for peer {}. tradeId={}, uid={}",
message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
- trade.setState(Trade.State.TAKER_STORED_IN_MAILBOX_DEPOSIT_TX_PUBLISHED_MSG);
+
+ trade.setState(Trade.State.SELLER_STORED_IN_MAILBOX_DEPOSIT_TX_PUBLISHED_MSG);
complete();
}
@@ -77,7 +84,7 @@ public class TakerSendDepositTxPublishedMessage extends TradeTask {
public void onFault(String errorMessage) {
log.error("{} failed: Peer {}. tradeId={}, uid={}, errorMessage={}",
message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid(), errorMessage);
- trade.setState(Trade.State.TAKER_SEND_FAILED_DEPOSIT_TX_PUBLISHED_MSG);
+ trade.setState(Trade.State.SELLER_SEND_FAILED_DEPOSIT_TX_PUBLISHED_MSG);
appendToErrorMessage("Sending message failed: message=" + message + "\nerrorMessage=" + errorMessage);
failed();
}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignAndFinalizePayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignAndFinalizePayoutTx.java
index 80b3e4c634..d6868db423 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignAndFinalizePayoutTx.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignAndFinalizePayoutTx.java
@@ -60,7 +60,7 @@ public class SellerSignAndFinalizePayoutTx extends TradeTask {
final byte[] buyerSignature = tradingPeer.getSignature();
- Coin buyerPayoutAmount = offer.getBuyerSecurityDeposit().add(trade.getTradeAmount());
+ Coin buyerPayoutAmount = checkNotNull(offer.getBuyerSecurityDeposit()).add(trade.getTradeAmount());
Coin sellerPayoutAmount = offer.getSellerSecurityDeposit();
final String buyerPayoutAddressString = tradingPeer.getPayoutAddressString();
@@ -78,7 +78,7 @@ public class SellerSignAndFinalizePayoutTx extends TradeTask {
DeterministicKey multiSigKeyPair = walletService.getMultiSigKeyPair(id, sellerMultiSigPubKey);
Transaction transaction = processModel.getTradeWalletService().sellerSignsAndFinalizesPayoutTx(
- trade.getDepositTx(),
+ checkNotNull(trade.getDepositTx()),
buyerSignature,
buyerPayoutAmount,
sellerPayoutAmount,
@@ -86,8 +86,7 @@ public class SellerSignAndFinalizePayoutTx extends TradeTask {
sellerPayoutAddressString,
multiSigKeyPair,
buyerMultiSigPubKey,
- sellerMultiSigPubKey,
- trade.getArbitratorBtcPubKey()
+ sellerMultiSigPubKey
);
trade.setPayoutTx(transaction);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignsDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignsDelayedPayoutTx.java
new file mode 100644
index 0000000000..b8b8e155c2
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignsDelayedPayoutTx.java
@@ -0,0 +1,73 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.seller;
+
+import bisq.core.btc.model.AddressEntry;
+import bisq.core.btc.wallet.BtcWalletService;
+import bisq.core.trade.Trade;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import org.bitcoinj.core.Transaction;
+import org.bitcoinj.crypto.DeterministicKey;
+
+import java.util.Arrays;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class SellerSignsDelayedPayoutTx extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public SellerSignsDelayedPayoutTx(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+
+ Transaction preparedDelayedPayoutTx = checkNotNull(processModel.getPreparedDelayedPayoutTx());
+ BtcWalletService btcWalletService = processModel.getBtcWalletService();
+ String id = processModel.getOffer().getId();
+
+ byte[] sellerMultiSigPubKey = processModel.getMyMultiSigPubKey();
+ DeterministicKey myMultiSigKeyPair = btcWalletService.getMultiSigKeyPair(id, sellerMultiSigPubKey);
+
+ checkArgument(Arrays.equals(sellerMultiSigPubKey,
+ btcWalletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG).getPubKey()),
+ "sellerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id);
+ byte[] buyerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey();
+
+ byte[] delayedPayoutTxSignature = processModel.getTradeWalletService().signDelayedPayoutTx(preparedDelayedPayoutTx,
+ myMultiSigKeyPair,
+ buyerMultiSigPubKey,
+ sellerMultiSigPubKey);
+
+ processModel.setDelayedPayoutTxSignature(delayedPayoutTxSignature);
+
+ complete();
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesAndSignsDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java
similarity index 72%
rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesAndSignsDepositTx.java
rename to core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java
index 28f3005163..3f7cbdbef0 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesAndSignsDepositTx.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java
@@ -42,9 +42,9 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
-public class SellerAsMakerCreatesAndSignsDepositTx extends TradeTask {
+public class SellerAsMakerCreatesUnsignedDepositTx extends TradeTask {
@SuppressWarnings({"unused"})
- public SellerAsMakerCreatesAndSignsDepositTx(TaskRunner taskHandler, Trade trade) {
+ public SellerAsMakerCreatesUnsignedDepositTx(TaskRunner taskHandler, Trade trade) {
super(taskHandler, trade);
}
@@ -57,44 +57,39 @@ public class SellerAsMakerCreatesAndSignsDepositTx extends TradeTask {
BtcWalletService walletService = processModel.getBtcWalletService();
String id = processModel.getOffer().getId();
TradingPeer tradingPeer = processModel.getTradingPeer();
- final Offer offer = trade.getOffer();
+ Offer offer = checkNotNull(trade.getOffer());
// params
- final boolean makerIsBuyer = false;
-
- final byte[] contractHash = Hash.getSha256Hash(trade.getContractAsJson());
+ byte[] contractHash = Hash.getSha256Hash(checkNotNull(trade.getContractAsJson()));
trade.setContractHash(contractHash);
log.debug("\n\n------------------------------------------------------------\n"
+ "Contract as json\n"
+ trade.getContractAsJson()
+ "\n------------------------------------------------------------\n");
- final Coin makerInputAmount = offer.getSellerSecurityDeposit().add(trade.getTradeAmount());
+ Coin makerInputAmount = offer.getSellerSecurityDeposit().add(trade.getTradeAmount());
Optional addressEntryOptional = walletService.getAddressEntry(id, AddressEntry.Context.MULTI_SIG);
checkArgument(addressEntryOptional.isPresent(), "addressEntryOptional must be present");
AddressEntry makerMultiSigAddressEntry = addressEntryOptional.get();
makerMultiSigAddressEntry.setCoinLockedInMultiSig(makerInputAmount);
walletService.saveAddressEntryList();
- final Coin msOutputAmount = makerInputAmount
+ Coin msOutputAmount = makerInputAmount
.add(trade.getTxFee())
.add(offer.getBuyerSecurityDeposit());
- final List takerRawTransactionInputs = tradingPeer.getRawTransactionInputs();
- final long takerChangeOutputValue = tradingPeer.getChangeOutputValue();
- final String takerChangeAddressString = tradingPeer.getChangeOutputAddress();
- final Address makerAddress = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.RESERVED_FOR_TRADE).getAddress();
- final Address makerChangeAddress = walletService.getFreshAddressEntry().getAddress();
- final byte[] buyerPubKey = tradingPeer.getMultiSigPubKey();
- final byte[] sellerPubKey = processModel.getMyMultiSigPubKey();
+ List takerRawTransactionInputs = checkNotNull(tradingPeer.getRawTransactionInputs());
+ long takerChangeOutputValue = tradingPeer.getChangeOutputValue();
+ String takerChangeAddressString = tradingPeer.getChangeOutputAddress();
+ Address makerAddress = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.RESERVED_FOR_TRADE).getAddress();
+ Address makerChangeAddress = walletService.getFreshAddressEntry().getAddress();
+ byte[] buyerPubKey = tradingPeer.getMultiSigPubKey();
+ byte[] sellerPubKey = processModel.getMyMultiSigPubKey();
checkArgument(Arrays.equals(sellerPubKey,
makerMultiSigAddressEntry.getPubKey()),
"sellerPubKey from AddressEntry must match the one from the trade data. trade id =" + id);
- final byte[] arbitratorBtcPubKey = trade.getArbitratorBtcPubKey();
-
- PreparedDepositTxAndMakerInputs result = processModel.getTradeWalletService().makerCreatesAndSignsDepositTx(
- makerIsBuyer,
+ PreparedDepositTxAndMakerInputs result = processModel.getTradeWalletService().sellerAsMakerCreatesDepositTx(
contractHash,
makerInputAmount,
msOutputAmount,
@@ -104,8 +99,7 @@ public class SellerAsMakerCreatesAndSignsDepositTx extends TradeTask {
makerAddress,
makerChangeAddress,
buyerPubKey,
- sellerPubKey,
- arbitratorBtcPubKey);
+ sellerPubKey);
processModel.setPreparedDepositTx(result.depositTransaction);
processModel.setRawTransactionInputs(result.rawMakerInputs);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java
new file mode 100644
index 0000000000..ba490a92f3
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java
@@ -0,0 +1,57 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.seller_as_maker;
+
+import bisq.core.trade.Trade;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import org.bitcoinj.core.Transaction;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class SellerAsMakerFinalizesDepositTx extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public SellerAsMakerFinalizesDepositTx(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+
+ byte[] takersRawPreparedDepositTx = checkNotNull(processModel.getTradingPeer().getPreparedDepositTx());
+ byte[] myRawPreparedDepositTx = checkNotNull(processModel.getPreparedDepositTx());
+ Transaction takersDepositTx = processModel.getBtcWalletService().getTxFromSerializedTx(takersRawPreparedDepositTx);
+ Transaction myDepositTx = processModel.getBtcWalletService().getTxFromSerializedTx(myRawPreparedDepositTx);
+ int numTakersInputs = checkNotNull(processModel.getTradingPeer().getRawTransactionInputs()).size();
+ processModel.getTradeWalletService().sellerAsMakerFinalizesDepositTx(myDepositTx, takersDepositTx, numTakersInputs);
+
+ trade.applyDepositTx(myDepositTx);
+
+ complete();
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java
new file mode 100644
index 0000000000..b5962c989f
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java
@@ -0,0 +1,56 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.seller_as_maker;
+
+import bisq.core.trade.Trade;
+import bisq.core.trade.messages.DepositTxMessage;
+import bisq.core.trade.protocol.tasks.TradeTask;
+import bisq.core.util.Validator;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class SellerAsMakerProcessDepositTxMessage extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public SellerAsMakerProcessDepositTxMessage(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+ log.debug("current trade state " + trade.getState());
+ DepositTxMessage message = (DepositTxMessage) processModel.getTradeMessage();
+ Validator.checkTradeId(processModel.getOfferId(), message);
+ checkNotNull(message);
+ checkNotNull(message.getDepositTx());
+
+ processModel.getTradingPeer().setPreparedDepositTx(message.getDepositTx());
+ trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
+
+ complete();
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java
new file mode 100644
index 0000000000..f1fb516280
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java
@@ -0,0 +1,47 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.seller_as_maker;
+
+import bisq.core.trade.Trade;
+import bisq.core.trade.protocol.tasks.maker.MakerSendsInputsForDepositTxResponse;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import org.bitcoinj.core.Transaction;
+import org.bitcoinj.script.Script;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class SellerAsMakerSendsInputsForDepositTxResponse extends MakerSendsInputsForDepositTxResponse {
+ @SuppressWarnings({"unused"})
+ public SellerAsMakerSendsInputsForDepositTxResponse(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected byte[] getPreparedDepositTx() {
+ Transaction preparedDepositTx = processModel.getBtcWalletService().getTxFromSerializedTx(processModel.getPreparedDepositTx());
+ preparedDepositTx.getInputs().forEach(input -> {
+ // Remove signature before sending to peer as we don't want to risk that buyer could publish deposit tx
+ // before we have received his signature for the delayed payout tx.
+ input.setScriptSig(new Script(new byte[]{}));
+ });
+ return preparedDepositTx.bitcoinSerialize();
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java
index 6298250566..9b4b88a0ba 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java
@@ -17,19 +17,18 @@
package bisq.core.trade.protocol.tasks.seller_as_taker;
-import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.model.InputsAndChangeOutput;
-import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.trade.Trade;
import bisq.core.trade.protocol.tasks.TradeTask;
import bisq.common.taskrunner.TaskRunner;
-import org.bitcoinj.core.Address;
import org.bitcoinj.core.Coin;
import lombok.extern.slf4j.Slf4j;
+import static com.google.common.base.Preconditions.checkNotNull;
+
@Slf4j
public class SellerAsTakerCreatesDepositTxInputs extends TradeTask {
@SuppressWarnings({"unused"})
@@ -43,17 +42,14 @@ public class SellerAsTakerCreatesDepositTxInputs extends TradeTask {
runInterceptHook();
if (trade.getTradeAmount() != null) {
Coin txFee = trade.getTxFee();
- Coin takerInputAmount = trade.getOffer().getSellerSecurityDeposit()
- .add(txFee).add(txFee).add(trade.getTradeAmount());
-
- BtcWalletService walletService = processModel.getBtcWalletService();
- Address takersAddress = walletService.getOrCreateAddressEntry(processModel.getOffer().getId(),
- AddressEntry.Context.RESERVED_FOR_TRADE).getAddress();
- InputsAndChangeOutput result = processModel.getTradeWalletService().takerCreatesDepositsTxInputs(
+ Coin takerInputAmount = checkNotNull(trade.getOffer()).getSellerSecurityDeposit()
+ .add(txFee)
+ .add(txFee)
+ .add(trade.getTradeAmount());
+ InputsAndChangeOutput result = processModel.getTradeWalletService().takerCreatesDepositTxInputs(
processModel.getTakeOfferFeeTx(),
takerInputAmount,
- txFee,
- takersAddress);
+ txFee);
processModel.setRawTransactionInputs(result.rawTransactionInputs);
processModel.setChangeOutputValue(result.changeOutputValue);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignAndPublishDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java
similarity index 56%
rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignAndPublishDepositTx.java
rename to core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java
index 9bce294410..6a27e1221c 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignAndPublishDepositTx.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java
@@ -17,11 +17,9 @@
package bisq.core.trade.protocol.tasks.seller_as_taker;
-import bisq.core.btc.exceptions.TxBroadcastException;
import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.model.RawTransactionInput;
import bisq.core.btc.wallet.BtcWalletService;
-import bisq.core.btc.wallet.TxBroadcaster;
import bisq.core.trade.Contract;
import bisq.core.trade.Trade;
import bisq.core.trade.protocol.TradingPeer;
@@ -43,9 +41,9 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
-public class SellerAsTakerSignAndPublishDepositTx extends TradeTask {
+public class SellerAsTakerSignsDepositTx extends TradeTask {
@SuppressWarnings({"unused"})
- public SellerAsTakerSignAndPublishDepositTx(TaskRunner taskHandler, Trade trade) {
+ public SellerAsTakerSignsDepositTx(TaskRunner taskHandler, Trade trade) {
super(taskHandler, trade);
}
@@ -58,7 +56,7 @@ public class SellerAsTakerSignAndPublishDepositTx extends TradeTask {
+ trade.getContractAsJson()
+ "\n------------------------------------------------------------\n");
- byte[] contractHash = Hash.getSha256Hash(trade.getContractAsJson());
+ byte[] contractHash = Hash.getSha256Hash(checkNotNull(trade.getContractAsJson()));
trade.setContractHash(contractHash);
List sellerInputs = checkNotNull(processModel.getRawTransactionInputs(), "sellerInputs must not be null");
@@ -80,51 +78,20 @@ public class SellerAsTakerSignAndPublishDepositTx extends TradeTask {
TradingPeer tradingPeer = processModel.getTradingPeer();
- Transaction depositTx = processModel.getTradeWalletService().takerSignsAndPublishesDepositTx(
+ Transaction depositTx = processModel.getTradeWalletService().takerSignsDepositTx(
true,
contractHash,
processModel.getPreparedDepositTx(),
- tradingPeer.getRawTransactionInputs(),
+ checkNotNull(tradingPeer.getRawTransactionInputs()),
sellerInputs,
tradingPeer.getMultiSigPubKey(),
- sellerMultiSigPubKey,
- trade.getArbitratorBtcPubKey(),
- new TxBroadcaster.Callback() {
- @Override
- public void onSuccess(Transaction transaction) {
- if (!completed) {
- // We set the depositTx before we change the state as the state change triggers code
- // which expected the tx to be available. That case will usually never happen as the
- // callback is called after the method call has returned but in some test scenarios
- // with regtest we run into such issues, thus fixing it to make it more stict seems
- // reasonable.
- trade.setDepositTx(transaction);
- log.trace("takerSignsAndPublishesDepositTx succeeded " + transaction);
- trade.setState(Trade.State.TAKER_PUBLISHED_DEPOSIT_TX);
- walletService.swapTradeEntryToAvailableEntry(id, AddressEntry.Context.RESERVED_FOR_TRADE);
+ sellerMultiSigPubKey);
- complete();
- } else {
- log.warn("We got the onSuccess callback called after the timeout has been triggered a complete().");
- }
- }
+ trade.applyDepositTx(depositTx);
- @Override
- public void onFailure(TxBroadcastException exception) {
- if (!completed) {
- failed(exception);
- } else {
- log.warn("We got the onFailure callback called after the timeout has been triggered a complete().");
- }
- }
- });
- if (trade.getDepositTx() == null) {
- // We set the deposit tx in case we get the onFailure called. We cannot set it in the onFailure
- // callback as the tx is returned by the method call where the callback is used as an argument.
- trade.setDepositTx(depositTx);
- }
+ complete();
} catch (Throwable t) {
- final Contract contract = trade.getContract();
+ Contract contract = trade.getContract();
if (contract != null)
contract.printDiff(processModel.getTradingPeer().getContractAsJson());
failed(t);
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/CreateTakerFeeTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/CreateTakerFeeTx.java
index 1b9241f840..1e9f1a561c 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/CreateTakerFeeTx.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/CreateTakerFeeTx.java
@@ -22,8 +22,7 @@ import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.btc.wallet.TradeWalletService;
import bisq.core.btc.wallet.WalletService;
import bisq.core.dao.exceptions.DaoDisabledException;
-import bisq.core.offer.availability.DisputeAgentSelection;
-import bisq.core.support.dispute.arbitration.arbitrator.Arbitrator;
+import bisq.core.dao.governance.param.Param;
import bisq.core.trade.Trade;
import bisq.core.trade.protocol.tasks.TradeTask;
@@ -47,8 +46,6 @@ public class CreateTakerFeeTx extends TradeTask {
try {
runInterceptHook();
- Arbitrator arbitrator = DisputeAgentSelection.getLeastUsedArbitrator(processModel.getTradeStatisticsManager(),
- processModel.getArbitratorManager());
BtcWalletService walletService = processModel.getBtcWalletService();
String id = processModel.getOffer().getId();
@@ -68,6 +65,7 @@ public class CreateTakerFeeTx extends TradeTask {
Address changeAddress = changeAddressEntry.getAddress();
TradeWalletService tradeWalletService = processModel.getTradeWalletService();
Transaction transaction;
+ String feeReceiver = processModel.getDaoFacade().getParamValue(Param.RECIPIENT_BTC_ADDRESS);
if (trade.isCurrencyForTakerFeeBtc()) {
transaction = tradeWalletService.createBtcTradingFeeTx(
fundingAddress,
@@ -77,11 +75,11 @@ public class CreateTakerFeeTx extends TradeTask {
processModel.isUseSavingsWallet(),
trade.getTakerFee(),
trade.getTxFee(),
- arbitrator.getBtcAddress(),
+ feeReceiver,
false,
null);
} else {
- Transaction preparedBurnFeeTx = processModel.getBsqWalletService().getPreparedBurnFeeTx(trade.getTakerFee());
+ Transaction preparedBurnFeeTx = processModel.getBsqWalletService().getPreparedTradeFeeTx(trade.getTakerFee());
Transaction txWithBsqFee = tradeWalletService.completeBsqTradingFeeTx(preparedBurnFeeTx,
fundingAddress,
reservedForTradeAddress,
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessPublishDepositTxRequest.java b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessPublishDepositTxRequest.java
deleted file mode 100644
index 0160397d04..0000000000
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessPublishDepositTxRequest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * This file is part of Bisq.
- *
- * Bisq is free software: you can redistribute it and/or modify it
- * under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or (at
- * your option) any later version.
- *
- * Bisq is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
- * License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with Bisq. If not, see .
- */
-
-package bisq.core.trade.protocol.tasks.taker;
-
-import bisq.core.trade.Trade;
-import bisq.core.trade.messages.PublishDepositTxRequest;
-import bisq.core.trade.protocol.TradingPeer;
-import bisq.core.trade.protocol.tasks.TradeTask;
-
-import bisq.common.taskrunner.TaskRunner;
-
-import lombok.extern.slf4j.Slf4j;
-
-import static bisq.core.util.Validator.checkTradeId;
-import static bisq.core.util.Validator.nonEmptyStringOf;
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-@Slf4j
-public class TakerProcessPublishDepositTxRequest extends TradeTask {
- @SuppressWarnings({"unused"})
- public TakerProcessPublishDepositTxRequest(TaskRunner taskHandler, Trade trade) {
- super(taskHandler, trade);
- }
-
- @Override
- protected void run() {
- try {
- runInterceptHook();
- log.debug("current trade state " + trade.getState());
- PublishDepositTxRequest publishDepositTxRequest = (PublishDepositTxRequest) processModel.getTradeMessage();
- checkTradeId(processModel.getOfferId(), publishDepositTxRequest);
- checkNotNull(publishDepositTxRequest);
-
- final TradingPeer tradingPeer = processModel.getTradingPeer();
- tradingPeer.setPaymentAccountPayload(checkNotNull(publishDepositTxRequest.getMakerPaymentAccountPayload()));
- tradingPeer.setAccountId(nonEmptyStringOf(publishDepositTxRequest.getMakerAccountId()));
- tradingPeer.setMultiSigPubKey(checkNotNull(publishDepositTxRequest.getMakerMultiSigPubKey()));
- tradingPeer.setContractAsJson(nonEmptyStringOf(publishDepositTxRequest.getMakerContractAsJson()));
- tradingPeer.setContractSignature(nonEmptyStringOf(publishDepositTxRequest.getMakerContractSignature()));
- tradingPeer.setPayoutAddressString(nonEmptyStringOf(publishDepositTxRequest.getMakerPayoutAddressString()));
- tradingPeer.setRawTransactionInputs(checkNotNull(publishDepositTxRequest.getMakerInputs()));
- final byte[] preparedDepositTx = publishDepositTxRequest.getPreparedDepositTx();
- processModel.setPreparedDepositTx(checkNotNull(preparedDepositTx));
-
- // Maker has to sign preparedDepositTx. He cannot manipulate the preparedDepositTx - so we avoid to have a
- // challenge protocol for passing the nonce we want to get signed.
- tradingPeer.setAccountAgeWitnessNonce(publishDepositTxRequest.getPreparedDepositTx());
- tradingPeer.setAccountAgeWitnessSignature(publishDepositTxRequest.getAccountAgeWitnessSignatureOfPreparedDepositTx());
-
- tradingPeer.setCurrentDate(publishDepositTxRequest.getCurrentDate());
-
- checkArgument(publishDepositTxRequest.getMakerInputs().size() > 0);
-
- // update to the latest peer address of our peer if the message is correct
- trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
- trade.setState(Trade.State.TAKER_RECEIVED_PUBLISH_DEPOSIT_TX_REQUEST);
-
- complete();
- } catch (Throwable t) {
- failed(t);
- }
- }
-}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessesInputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessesInputsForDepositTxResponse.java
new file mode 100644
index 0000000000..ba1b80b530
--- /dev/null
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessesInputsForDepositTxResponse.java
@@ -0,0 +1,84 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.core.trade.protocol.tasks.taker;
+
+import bisq.core.trade.Trade;
+import bisq.core.trade.messages.InputsForDepositTxResponse;
+import bisq.core.trade.protocol.TradingPeer;
+import bisq.core.trade.protocol.tasks.TradeTask;
+
+import bisq.common.taskrunner.TaskRunner;
+
+import lombok.extern.slf4j.Slf4j;
+
+import static bisq.core.util.Validator.checkTradeId;
+import static bisq.core.util.Validator.nonEmptyStringOf;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Slf4j
+public class TakerProcessesInputsForDepositTxResponse extends TradeTask {
+ @SuppressWarnings({"unused"})
+ public TakerProcessesInputsForDepositTxResponse(TaskRunner taskHandler, Trade trade) {
+ super(taskHandler, trade);
+ }
+
+ @Override
+ protected void run() {
+ try {
+ runInterceptHook();
+ log.debug("current trade state " + trade.getState());
+ InputsForDepositTxResponse inputsForDepositTxResponse = (InputsForDepositTxResponse) processModel.getTradeMessage();
+ checkTradeId(processModel.getOfferId(), inputsForDepositTxResponse);
+ checkNotNull(inputsForDepositTxResponse);
+
+ TradingPeer tradingPeer = processModel.getTradingPeer();
+ tradingPeer.setPaymentAccountPayload(checkNotNull(inputsForDepositTxResponse.getMakerPaymentAccountPayload()));
+ tradingPeer.setAccountId(nonEmptyStringOf(inputsForDepositTxResponse.getMakerAccountId()));
+ tradingPeer.setMultiSigPubKey(checkNotNull(inputsForDepositTxResponse.getMakerMultiSigPubKey()));
+ tradingPeer.setContractAsJson(nonEmptyStringOf(inputsForDepositTxResponse.getMakerContractAsJson()));
+ tradingPeer.setContractSignature(nonEmptyStringOf(inputsForDepositTxResponse.getMakerContractSignature()));
+ tradingPeer.setPayoutAddressString(nonEmptyStringOf(inputsForDepositTxResponse.getMakerPayoutAddressString()));
+ tradingPeer.setRawTransactionInputs(checkNotNull(inputsForDepositTxResponse.getMakerInputs()));
+ byte[] preparedDepositTx = inputsForDepositTxResponse.getPreparedDepositTx();
+ processModel.setPreparedDepositTx(checkNotNull(preparedDepositTx));
+ long lockTime = inputsForDepositTxResponse.getLockTime();
+ //todo for dev testing deactivated
+ //checkArgument(lockTime >= processModel.getBtcWalletService().getBestChainHeight() + 144 * 20);
+ trade.setLockTime(lockTime);
+ log.info("lockTime={}, delay={}", lockTime, (processModel.getBtcWalletService().getBestChainHeight() - lockTime));
+
+ // Maker has to sign preparedDepositTx. He cannot manipulate the preparedDepositTx - so we avoid to have a
+ // challenge protocol for passing the nonce we want to get signed.
+ tradingPeer.setAccountAgeWitnessNonce(inputsForDepositTxResponse.getPreparedDepositTx());
+ tradingPeer.setAccountAgeWitnessSignature(inputsForDepositTxResponse.getAccountAgeWitnessSignatureOfPreparedDepositTx());
+
+ tradingPeer.setCurrentDate(inputsForDepositTxResponse.getCurrentDate());
+
+ checkArgument(inputsForDepositTxResponse.getMakerInputs().size() > 0);
+
+ // update to the latest peer address of our peer if the message is correct
+ trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
+ trade.setState(Trade.State.TAKER_RECEIVED_PUBLISH_DEPOSIT_TX_REQUEST);
+
+ complete();
+ } catch (Throwable t) {
+ failed(t);
+ }
+ }
+}
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendPayDepositRequest.java b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendInputsForDepositTxRequest.java
similarity index 87%
rename from core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendPayDepositRequest.java
rename to core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendInputsForDepositTxRequest.java
index 58f8591d47..f9d0651383 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendPayDepositRequest.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendInputsForDepositTxRequest.java
@@ -21,7 +21,7 @@ import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.trade.Trade;
-import bisq.core.trade.messages.PayDepositRequest;
+import bisq.core.trade.messages.InputsForDepositTxRequest;
import bisq.core.trade.protocol.tasks.TradeTask;
import bisq.core.user.User;
@@ -45,9 +45,9 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
-public class TakerSendPayDepositRequest extends TradeTask {
+public class TakerSendInputsForDepositTxRequest extends TradeTask {
@SuppressWarnings({"unused"})
- public TakerSendPayDepositRequest(TaskRunner taskHandler, Trade trade) {
+ public TakerSendInputsForDepositTxRequest(TaskRunner taskHandler, Trade trade) {
super(taskHandler, trade);
}
@@ -61,8 +61,10 @@ public class TakerSendPayDepositRequest extends TradeTask {
checkNotNull(user, "User must not be null");
final List acceptedArbitratorAddresses = user.getAcceptedArbitratorAddresses();
final List acceptedMediatorAddresses = user.getAcceptedMediatorAddresses();
- checkNotNull(acceptedArbitratorAddresses, "acceptedArbitratorAddresses must not be null");
+ final List acceptedRefundAgentAddresses = user.getAcceptedRefundAgentAddresses();
+ // We don't check for arbitrators as they should vanish soon
checkNotNull(acceptedMediatorAddresses, "acceptedMediatorAddresses must not be null");
+ // We also don't check for refund agents yet as we don't want to restict us too much. They are not mandatory.
BtcWalletService walletService = processModel.getBtcWalletService();
String id = processModel.getOffer().getId();
@@ -85,7 +87,7 @@ public class TakerSendPayDepositRequest extends TradeTask {
final PaymentAccountPayload paymentAccountPayload = checkNotNull(processModel.getPaymentAccountPayload(trade), "processModel.getPaymentAccountPayload(trade) must not be null");
byte[] sig = Sig.sign(processModel.getKeyRing().getSignatureKeyPair().getPrivate(), offerId.getBytes(Charsets.UTF_8));
- PayDepositRequest message = new PayDepositRequest(
+ InputsForDepositTxRequest message = new InputsForDepositTxRequest(
offerId,
processModel.getMyNodeAddress(),
trade.getTradeAmount().value,
@@ -102,10 +104,12 @@ public class TakerSendPayDepositRequest extends TradeTask {
paymentAccountPayload,
processModel.getAccountId(),
trade.getTakerFeeTxId(),
- new ArrayList<>(acceptedArbitratorAddresses),
+ acceptedArbitratorAddresses == null ? new ArrayList<>() : new ArrayList<>(acceptedArbitratorAddresses),
new ArrayList<>(acceptedMediatorAddresses),
+ acceptedRefundAgentAddresses == null ? new ArrayList<>() : new ArrayList<>(acceptedRefundAgentAddresses),
trade.getArbitratorNodeAddress(),
trade.getMediatorNodeAddress(),
+ trade.getRefundAgentNodeAddress(),
UUID.randomUUID().toString(),
Version.getP2PMessageVersion(),
sig,
diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java
index 879a9ac6e9..c8134b5913 100644
--- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java
+++ b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java
@@ -56,8 +56,8 @@ public class TakerVerifyAndSignContract extends TradeTask {
checkNotNull(trade.getTakerFeeTxId(), "TakeOfferFeeTxId must not be null");
TradingPeer maker = processModel.getTradingPeer();
- PaymentAccountPayload makerPaymentAccountPayload = maker.getPaymentAccountPayload();
- PaymentAccountPayload takerPaymentAccountPayload = processModel.getPaymentAccountPayload(trade);
+ PaymentAccountPayload makerPaymentAccountPayload = checkNotNull(maker.getPaymentAccountPayload());
+ PaymentAccountPayload takerPaymentAccountPayload = checkNotNull(processModel.getPaymentAccountPayload(trade));
boolean isBuyerMakerAndSellerTaker = trade instanceof SellerAsTakerTrade;
NodeAddress buyerNodeAddress = isBuyerMakerAndSellerTaker ? processModel.getTempTradingPeerNodeAddress() : processModel.getMyNodeAddress();
@@ -85,7 +85,6 @@ public class TakerVerifyAndSignContract extends TradeTask {
trade.getTakerFeeTxId(),
buyerNodeAddress,
sellerNodeAddress,
- trade.getArbitratorNodeAddress(),
trade.getMediatorNodeAddress(),
isBuyerMakerAndSellerTaker,
maker.getAccountId(),
@@ -97,7 +96,9 @@ public class TakerVerifyAndSignContract extends TradeTask {
maker.getPayoutAddressString(),
takerPayoutAddressString,
maker.getMultiSigPubKey(),
- takerMultiSigPubKey
+ takerMultiSigPubKey,
+ trade.getLockTime(),
+ trade.getRefundAgentNodeAddress()
);
String contractAsJson = Utilities.objectToJson(contract);
log.trace("Contract as json:{}", contractAsJson);
diff --git a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2.java b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2.java
index 1210de64c8..feb0b6ed14 100644
--- a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2.java
+++ b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2.java
@@ -24,9 +24,12 @@ import bisq.core.monetary.Volume;
import bisq.core.offer.OfferPayload;
import bisq.core.offer.OfferUtil;
+import bisq.network.p2p.storage.payload.CapabilityRequiringPayload;
import bisq.network.p2p.storage.payload.LazyProcessedPayload;
import bisq.network.p2p.storage.payload.PersistableNetworkPayload;
+import bisq.common.app.Capabilities;
+import bisq.common.app.Capability;
import bisq.common.crypto.Hash;
import bisq.common.proto.persistable.PersistableEnvelope;
import bisq.common.util.ExtraDataMapValidator;
@@ -60,9 +63,14 @@ import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
@Value
-public final class TradeStatistics2 implements LazyProcessedPayload, PersistableNetworkPayload, PersistableEnvelope {
+public final class TradeStatistics2 implements LazyProcessedPayload, PersistableNetworkPayload, PersistableEnvelope, CapabilityRequiringPayload {
+
+ //We don't support arbitrators anymore so this entry will be only for pre v1.2. trades
+ @Deprecated
public static final String ARBITRATOR_ADDRESS = "arbAddr";
+
public static final String MEDIATOR_ADDRESS = "medAddr";
+ public static final String REFUND_AGENT_ADDRESS = "refAddr";
private final OfferPayload.Direction direction;
private final String baseCurrency;
@@ -81,7 +89,8 @@ public final class TradeStatistics2 implements LazyProcessedPayload, Persistable
private final long tradeDate;
private final String depositTxId;
- // hash get set in constructor from json of all the other data fields (with hash = null).
+ // Hash get set in constructor from json of all the other data fields (with hash = null).
+ @JsonExclude
private final byte[] hash;
// PB field signature_pub_key_bytes not used anymore from v0.6 on
@@ -89,6 +98,7 @@ public final class TradeStatistics2 implements LazyProcessedPayload, Persistable
// at the P2P network storage checks. The hash of the object will be used to verify if the data is valid. Any new
// field in a class would break that hash and therefore break the storage mechanism.
@Nullable
+ @JsonExclude
private Map extraDataMap;
public TradeStatistics2(OfferPayload offerPayload,
@@ -151,12 +161,14 @@ public final class TradeStatistics2 implements LazyProcessedPayload, Persistable
this.depositTxId = depositTxId;
this.extraDataMap = ExtraDataMapValidator.getValidatedExtraDataMap(extraDataMap);
- if (hash == null)
- // We create hash from all fields excluding hash itself. We use json as simple data serialisation.
- // tradeDate is different for both peers so we ignore it for hash.
- this.hash = Hash.getSha256Ripemd160hash(Utilities.objectToJson(this).getBytes(Charsets.UTF_8));
- else
- this.hash = hash;
+ this.hash = hash == null ? createHash() : hash;
+ }
+
+ public byte[] createHash() {
+ // We create hash from all fields excluding hash itself. We use json as simple data serialisation.
+ // TradeDate is different for both peers so we ignore it for hash. ExtraDataMap is ignored as well as at
+ // software updates we might have different entries which would cause a different hash.
+ return Hash.getSha256Ripemd160hash(Utilities.objectToJson(this).getBytes(Charsets.UTF_8));
}
@Override
@@ -202,7 +214,7 @@ public final class TradeStatistics2 implements LazyProcessedPayload, Persistable
proto.getTradeAmount(),
proto.getTradeDate(),
proto.getDepositTxId(),
- proto.getHash().toByteArray(),
+ null, // We want to clean up the hashes with the changed hash method in v.1.2.0 so we don't use the value from the proto
CollectionUtils.isEmpty(proto.getExtraDataMap()) ? null : proto.getExtraDataMap());
}
@@ -222,6 +234,16 @@ public final class TradeStatistics2 implements LazyProcessedPayload, Persistable
return hash.length == 20;
}
+ // With v1.2.0 we changed the way how the hash is created. To not create too heavy load for seed nodes from
+ // requests from old nodes we use the TRADE_STATISTICS_HASH_UPDATE capability to send trade statistics only to new
+ // nodes. As trade statistics are only used for informational purpose it will not have any critical issue for the
+ // old nodes beside that they don't see the latest trades. We added TRADE_STATISTICS_HASH_UPDATE in v1.2.2 to fix a
+ // problem of not handling the hashes correctly.
+ @Override
+ public Capabilities getRequiredCapabilities() {
+ return new Capabilities(Capability.TRADE_STATISTICS_HASH_UPDATE);
+ }
+
///////////////////////////////////////////////////////////////////////////////////////////
// Getters
@@ -258,7 +280,7 @@ public final class TradeStatistics2 implements LazyProcessedPayload, Persistable
// Since the trade wasn't executed it's better to filter it out to avoid it having an undue influence on the
// BSQ trade stats.
boolean excludedFailedTrade = offerId.equals("6E5KOI6O-3a06a037-6f03-4bfa-98c2-59f49f73466a-112");
- return tradeAmount > 0 && tradePrice > 0 && !excludedFailedTrade;
+ return tradeAmount > 0 && tradePrice > 0 && !excludedFailedTrade && !depositTxId.isEmpty();
}
@Override
diff --git a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2StorageService.java b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2StorageService.java
index cb684ec935..60673e0732 100644
--- a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2StorageService.java
+++ b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2StorageService.java
@@ -33,8 +33,6 @@ import java.util.Map;
import lombok.extern.slf4j.Slf4j;
-import static com.google.common.base.Preconditions.checkArgument;
-
@Slf4j
public class TradeStatistics2StorageService extends MapStoreService {
private static final String FILE_NAME = "TradeStatistics2Store";
@@ -83,8 +81,5 @@ public class TradeStatistics2StorageService extends MapStoreService observableTradeStatisticsSet = FXCollections.observableSet();
@@ -69,12 +60,11 @@ public class TradeStatisticsManager {
PriceFeedService priceFeedService,
TradeStatistics2StorageService tradeStatistics2StorageService,
AppendOnlyDataStoreService appendOnlyDataStoreService,
- ReferralIdService referralIdService,
@Named(Storage.STORAGE_DIR) File storageDir,
@Named(AppOptionKeys.DUMP_STATISTICS) boolean dumpStatistics) {
this.p2PService = p2PService;
this.priceFeedService = priceFeedService;
- this.referralIdService = referralIdService;
+ this.tradeStatistics2StorageService = tradeStatistics2StorageService;
this.dumpStatistics = dumpStatistics;
jsonFileManager = new JsonFileManager(storageDir);
@@ -82,6 +72,44 @@ public class TradeStatisticsManager {
}
public void onAllServicesInitialized() {
+ p2PService.getP2PDataStorage().addAppendOnlyDataStoreListener(payload -> {
+ if (payload instanceof TradeStatistics2)
+ addToSet((TradeStatistics2) payload);
+ });
+
+ Set collect = tradeStatistics2StorageService.getMap().values().stream()
+ .filter(e -> e instanceof TradeStatistics2)
+ .map(e -> (TradeStatistics2) e)
+ .filter(TradeStatistics2::isValid)
+ .collect(Collectors.toSet());
+ observableTradeStatisticsSet.addAll(collect);
+
+ priceFeedService.applyLatestBisqMarketPrice(observableTradeStatisticsSet);
+
+ dump();
+ }
+
+ public ObservableSet getObservableTradeStatisticsSet() {
+ return observableTradeStatisticsSet;
+ }
+
+ private void addToSet(TradeStatistics2 tradeStatistics) {
+ if (!observableTradeStatisticsSet.contains(tradeStatistics)) {
+ if (observableTradeStatisticsSet.stream().anyMatch(e -> e.getOfferId().equals(tradeStatistics.getOfferId()))) {
+ return;
+ }
+
+ if (!tradeStatistics.isValid()) {
+ return;
+ }
+
+ observableTradeStatisticsSet.add(tradeStatistics);
+ priceFeedService.applyLatestBisqMarketPrice(observableTradeStatisticsSet);
+ dump();
+ }
+ }
+
+ private void dump() {
if (dumpStatistics) {
ArrayList fiatCurrencyList = CurrencyUtil.getAllSortedFiatCurrencies().stream()
.map(e -> new CurrencyTuple(e.getCode(), e.getName(), 8))
@@ -93,88 +121,7 @@ public class TradeStatisticsManager {
.collect(Collectors.toCollection(ArrayList::new));
cryptoCurrencyList.add(0, new CurrencyTuple(Res.getBaseCurrencyCode(), Res.getBaseCurrencyName(), 8));
jsonFileManager.writeToDisc(Utilities.objectToJson(cryptoCurrencyList), "crypto_currency_list");
- }
- p2PService.getP2PDataStorage().addAppendOnlyDataStoreListener(payload -> {
- if (payload instanceof TradeStatistics2)
- addToMap((TradeStatistics2) payload, true);
- });
-
- Map map = new HashMap<>();
- p2PService.getP2PDataStorage().getAppendOnlyDataStoreMap().values().stream()
- .filter(e -> e instanceof TradeStatistics2)
- .map(e -> (TradeStatistics2) e)
- .filter(TradeStatistics2::isValid)
- .forEach(e -> addToMap(e, map));
- observableTradeStatisticsSet.addAll(map.values());
-
- priceFeedService.applyLatestBisqMarketPrice(observableTradeStatisticsSet);
-
- dump();
- }
-
- public void publishTradeStatistics(List trades) {
- for (int i = 0; i < trades.size(); i++) {
- Trade trade = trades.get(i);
-
- Map extraDataMap = null;
- if (referralIdService.getOptionalReferralId().isPresent()) {
- extraDataMap = new HashMap<>();
- extraDataMap.put(OfferPayload.REFERRAL_ID, referralIdService.getOptionalReferralId().get());
- }
- Offer offer = trade.getOffer();
- checkNotNull(offer, "offer must not ne null");
- checkNotNull(trade.getTradeAmount(), "trade.getTradeAmount() must not ne null");
- TradeStatistics2 tradeStatistics = new TradeStatistics2(offer.getOfferPayload(),
- trade.getTradePrice(),
- trade.getTradeAmount(),
- trade.getDate(),
- (trade.getDepositTx() != null ? trade.getDepositTx().getHashAsString() : ""),
- extraDataMap);
- addToMap(tradeStatistics, true);
-
- // We only republish trades from last 10 days
- if ((new Date().getTime() - trade.getDate().getTime()) < TimeUnit.DAYS.toMillis(10)) {
- long delay = 5000;
- long minDelay = (i + 1) * delay;
- long maxDelay = (i + 2) * delay;
- UserThread.runAfterRandomDelay(() -> {
- p2PService.addPersistableNetworkPayload(tradeStatistics, true);
- }, minDelay, maxDelay, TimeUnit.MILLISECONDS);
- }
- }
- }
-
- public ObservableSet getObservableTradeStatisticsSet() {
- return observableTradeStatisticsSet;
- }
-
- private void addToMap(TradeStatistics2 tradeStatistics, boolean storeLocally) {
- if (!observableTradeStatisticsSet.contains(tradeStatistics)) {
-
- if (observableTradeStatisticsSet.stream()
- .anyMatch(e -> (e.getOfferId().equals(tradeStatistics.getOfferId()))))
- return;
-
- if (!tradeStatistics.isValid())
- return;
-
- observableTradeStatisticsSet.add(tradeStatistics);
- if (storeLocally) {
- priceFeedService.applyLatestBisqMarketPrice(observableTradeStatisticsSet);
- dump();
- }
- }
- }
-
- private void addToMap(TradeStatistics2 tradeStatistics, Map map) {
- TradeStatistics2 prevValue = map.putIfAbsent(tradeStatistics.getOfferId(), tradeStatistics);
- if (prevValue != null)
- log.trace("We have already an item with the same offer ID. That might happen if both the maker and the taker published the tradeStatistics");
- }
-
- private void dump() {
- if (dumpStatistics) {
// We store the statistics as json so it is easy for further processing (e.g. for web based services)
// TODO This is just a quick solution for storing to one file.
// 1 statistic entry has 500 bytes as json.
diff --git a/core/src/main/java/bisq/core/user/Preferences.java b/core/src/main/java/bisq/core/user/Preferences.java
index 71019d4c60..d022eb9dae 100644
--- a/core/src/main/java/bisq/core/user/Preferences.java
+++ b/core/src/main/java/bisq/core/user/Preferences.java
@@ -395,6 +395,11 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid
persist();
}
+ public void setTacAcceptedV120(boolean tacAccepted) {
+ prefPayload.setTacAcceptedV120(tacAccepted);
+ persist();
+ }
+
private void persist() {
if (initialReadDone)
storage.queueUpForSave(prefPayload);
@@ -952,5 +957,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid
String getRpcPw();
int getBlockNotifyPort();
+
+ void setTacAcceptedV120(boolean tacAccepted);
}
}
diff --git a/core/src/main/java/bisq/core/user/PreferencesPayload.java b/core/src/main/java/bisq/core/user/PreferencesPayload.java
index 998378b61d..1cddc32178 100644
--- a/core/src/main/java/bisq/core/user/PreferencesPayload.java
+++ b/core/src/main/java/bisq/core/user/PreferencesPayload.java
@@ -125,6 +125,7 @@ public final class PreferencesPayload implements PersistableEnvelope {
private int ignoreDustThreshold = 600;
private double buyerSecurityDepositAsPercentForCrypto = getDefaultBuyerSecurityDepositAsPercent(new CryptoCurrencyAccount());
private int blockNotifyPort;
+ private boolean tacAcceptedV120;
///////////////////////////////////////////////////////////////////////////////////////////
@@ -185,7 +186,8 @@ public final class PreferencesPayload implements PersistableEnvelope {
.setBuyerSecurityDepositAsPercent(buyerSecurityDepositAsPercent)
.setIgnoreDustThreshold(ignoreDustThreshold)
.setBuyerSecurityDepositAsPercentForCrypto(buyerSecurityDepositAsPercentForCrypto)
- .setBlockNotifyPort(blockNotifyPort);
+ .setBlockNotifyPort(blockNotifyPort)
+ .setTacAcceptedV120(tacAcceptedV120);
Optional.ofNullable(backupDirectory).ifPresent(builder::setBackupDirectory);
Optional.ofNullable(preferredTradeCurrency).ifPresent(e -> builder.setPreferredTradeCurrency((protobuf.TradeCurrency) e.toProtoMessage()));
Optional.ofNullable(offerBookChartScreenCurrencyCode).ifPresent(builder::setOfferBookChartScreenCurrencyCode);
@@ -271,7 +273,8 @@ public final class PreferencesPayload implements PersistableEnvelope {
proto.getBuyerSecurityDepositAsPercent(),
proto.getIgnoreDustThreshold(),
proto.getBuyerSecurityDepositAsPercentForCrypto(),
- proto.getBlockNotifyPort());
+ proto.getBlockNotifyPort(),
+ proto.getTacAcceptedV120());
}
}
diff --git a/core/src/main/java/bisq/core/user/User.java b/core/src/main/java/bisq/core/user/User.java
index d197a802c9..75891395d2 100644
--- a/core/src/main/java/bisq/core/user/User.java
+++ b/core/src/main/java/bisq/core/user/User.java
@@ -26,6 +26,7 @@ import bisq.core.notifications.alerts.price.PriceAlertFilter;
import bisq.core.payment.PaymentAccount;
import bisq.core.support.dispute.arbitration.arbitrator.Arbitrator;
import bisq.core.support.dispute.mediation.mediator.Mediator;
+import bisq.core.support.dispute.refund.refundagent.RefundAgent;
import bisq.network.p2p.NodeAddress;
@@ -44,7 +45,6 @@ import javafx.collections.FXCollections;
import javafx.collections.ObservableSet;
import javafx.collections.SetChangeListener;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
@@ -126,13 +126,6 @@ public class User implements PersistedDataHost {
// API
///////////////////////////////////////////////////////////////////////////////////////////
- /* public Optional getPaymentAccountForCurrency(TradeCurrency tradeCurrency) {
- return getPaymentAccounts().stream()
- .flatMap(e -> e.getTradeCurrencies().stream())
- .filter(e -> e.equals(tradeCurrency))
- .findFirst();
- }*/
-
@Nullable
public Arbitrator getAcceptedArbitratorByAddress(NodeAddress nodeAddress) {
final List acceptedArbitrators = userPayload.getAcceptedArbitrators();
@@ -159,6 +152,19 @@ public class User implements PersistedDataHost {
}
}
+ @Nullable
+ public RefundAgent getAcceptedRefundAgentByAddress(NodeAddress nodeAddress) {
+ final List acceptedRefundAgents = userPayload.getAcceptedRefundAgents();
+ if (acceptedRefundAgents != null) {
+ Optional refundAgentOptional = acceptedRefundAgents.stream()
+ .filter(e -> e.getNodeAddress().equals(nodeAddress))
+ .findFirst();
+ return refundAgentOptional.orElse(null);
+ } else {
+ return null;
+ }
+ }
+
@Nullable
public PaymentAccount findFirstPaymentAccountWithCurrency(TradeCurrency tradeCurrency) {
if (userPayload.getPaymentAccounts() != null) {
@@ -174,21 +180,6 @@ public class User implements PersistedDataHost {
}
}
- public boolean hasMatchingLanguage(Arbitrator arbitrator) {
- final List codes = userPayload.getAcceptedLanguageLocaleCodes();
- if (arbitrator != null && codes != null) {
- for (String acceptedCode : codes) {
- for (String itemCode : arbitrator.getLanguageCodes()) {
- if (acceptedCode.equals(itemCode))
- return true;
- }
- }
- return false;
- } else {
- return false;
- }
- }
-
public boolean hasPaymentAccountForCurrency(TradeCurrency tradeCurrency) {
return findFirstPaymentAccountWithCurrency(tradeCurrency) != null;
}
@@ -222,26 +213,6 @@ public class User implements PersistedDataHost {
persist();
}
- public boolean addAcceptedLanguageLocale(String localeCode) {
- final List codes = userPayload.getAcceptedLanguageLocaleCodes();
- if (codes != null && !codes.contains(localeCode)) {
- boolean changed = codes.add(localeCode);
- if (changed)
- persist();
- return changed;
- } else {
- return false;
- }
- }
-
- public boolean removeAcceptedLanguageLocale(String languageLocaleCode) {
- boolean changed = userPayload.getAcceptedLanguageLocaleCodes() != null &&
- userPayload.getAcceptedLanguageLocaleCodes().remove(languageLocaleCode);
- if (changed)
- persist();
- return changed;
- }
-
public boolean addAcceptedArbitrator(Arbitrator arbitrator) {
final List arbitrators = userPayload.getAcceptedArbitrators();
if (arbitrators != null && !arbitrators.contains(arbitrator) && !isMyOwnRegisteredArbitrator(arbitrator)) {
@@ -254,19 +225,6 @@ public class User implements PersistedDataHost {
}
}
- public boolean addAcceptedMediator(Mediator mediator) {
- final List mediators = userPayload.getAcceptedMediators();
- if (mediators != null && !mediators.contains(mediator) && !isMyOwnRegisteredMediator(mediator)) {
- boolean changed = mediators.add(mediator);
- if (changed)
- persist();
- return changed;
- } else {
- return false;
- }
- }
-
-
public void removeAcceptedArbitrator(Arbitrator arbitrator) {
if (userPayload.getAcceptedArbitrators() != null) {
boolean changed = userPayload.getAcceptedArbitrators().remove(arbitrator);
@@ -282,6 +240,18 @@ public class User implements PersistedDataHost {
}
}
+ public boolean addAcceptedMediator(Mediator mediator) {
+ final List mediators = userPayload.getAcceptedMediators();
+ if (mediators != null && !mediators.contains(mediator) && !isMyOwnRegisteredMediator(mediator)) {
+ boolean changed = mediators.add(mediator);
+ if (changed)
+ persist();
+ return changed;
+ } else {
+ return false;
+ }
+ }
+
public void removeAcceptedMediator(Mediator mediator) {
if (userPayload.getAcceptedMediators() != null) {
boolean changed = userPayload.getAcceptedMediators().remove(mediator);
@@ -297,6 +267,33 @@ public class User implements PersistedDataHost {
}
}
+ public boolean addAcceptedRefundAgent(RefundAgent refundAgent) {
+ final List refundAgents = userPayload.getAcceptedRefundAgents();
+ if (refundAgents != null && !refundAgents.contains(refundAgent) && !isMyOwnRegisteredRefundAgent(refundAgent)) {
+ boolean changed = refundAgents.add(refundAgent);
+ if (changed)
+ persist();
+ return changed;
+ } else {
+ return false;
+ }
+ }
+
+ public void removeAcceptedRefundAgent(RefundAgent refundAgent) {
+ if (userPayload.getAcceptedRefundAgents() != null) {
+ boolean changed = userPayload.getAcceptedRefundAgents().remove(refundAgent);
+ if (changed)
+ persist();
+ }
+ }
+
+ public void clearAcceptedRefundAgents() {
+ if (userPayload.getAcceptedRefundAgents() != null) {
+ userPayload.getAcceptedRefundAgents().clear();
+ persist();
+ }
+ }
+
///////////////////////////////////////////////////////////////////////////////////////////
// Setters
@@ -317,6 +314,11 @@ public class User implements PersistedDataHost {
persist();
}
+ public void setRegisteredRefundAgent(@Nullable RefundAgent refundAgent) {
+ userPayload.setRegisteredRefundAgent(refundAgent);
+ persist();
+ }
+
public void setDevelopersFilter(@Nullable Filter developersFilter) {
userPayload.setDevelopersFilter(developersFilter);
persist();
@@ -385,6 +387,12 @@ public class User implements PersistedDataHost {
return paymentAccountsAsObservable;
}
+
+ /**
+ * If this user is an arbitrator it returns the registered arbitrator.
+ *
+ * @return The arbitrator registered for this user
+ */
@Nullable
public Arbitrator getRegisteredArbitrator() {
return userPayload.getRegisteredArbitrator();
@@ -395,20 +403,41 @@ public class User implements PersistedDataHost {
return userPayload.getRegisteredMediator();
}
+ @Nullable
+ public RefundAgent getRegisteredRefundAgent() {
+ return userPayload.getRegisteredRefundAgent();
+ }
+
+
//TODO
@Nullable
public List getAcceptedArbitrators() {
return userPayload.getAcceptedArbitrators();
}
+ @Nullable
+ public List getAcceptedMediators() {
+ return userPayload.getAcceptedMediators();
+ }
+
+ @Nullable
+ public List getAcceptedRefundAgents() {
+ return userPayload.getAcceptedRefundAgents();
+ }
+
@Nullable
public List getAcceptedArbitratorAddresses() {
return userPayload.getAcceptedArbitrators() != null ? userPayload.getAcceptedArbitrators().stream().map(Arbitrator::getNodeAddress).collect(Collectors.toList()) : null;
}
@Nullable
- public List getAcceptedMediators() {
- return userPayload.getAcceptedMediators();
+ public List getAcceptedMediatorAddresses() {
+ return userPayload.getAcceptedMediators() != null ? userPayload.getAcceptedMediators().stream().map(Mediator::getNodeAddress).collect(Collectors.toList()) : null;
+ }
+
+ @Nullable
+ public List getAcceptedRefundAgentAddresses() {
+ return userPayload.getAcceptedRefundAgents() != null ? userPayload.getAcceptedRefundAgents().stream().map(RefundAgent::getNodeAddress).collect(Collectors.toList()) : null;
}
public boolean hasAcceptedArbitrators() {
@@ -419,13 +448,8 @@ public class User implements PersistedDataHost {
return getAcceptedMediators() != null && !getAcceptedMediators().isEmpty();
}
- @Nullable
- public List getAcceptedMediatorAddresses() {
- return userPayload.getAcceptedMediators() != null ? userPayload.getAcceptedMediators().stream().map(Mediator::getNodeAddress).collect(Collectors.toList()) : null;
- }
-
- public List getAcceptedLanguageLocaleCodes() {
- return userPayload.getAcceptedLanguageLocaleCodes() != null ? userPayload.getAcceptedLanguageLocaleCodes() : new ArrayList<>();
+ public boolean hasAcceptedRefundAgents() {
+ return getAcceptedRefundAgents() != null && !getAcceptedRefundAgents().isEmpty();
}
@Nullable
@@ -451,6 +475,10 @@ public class User implements PersistedDataHost {
return mediator.equals(userPayload.getRegisteredMediator());
}
+ public boolean isMyOwnRegisteredRefundAgent(RefundAgent refundAgent) {
+ return refundAgent.equals(userPayload.getRegisteredRefundAgent());
+ }
+
public List getMarketAlertFilters() {
return userPayload.getMarketAlertFilters();
}
diff --git a/core/src/main/java/bisq/core/user/UserPayload.java b/core/src/main/java/bisq/core/user/UserPayload.java
index 878a711df9..1edd8f37da 100644
--- a/core/src/main/java/bisq/core/user/UserPayload.java
+++ b/core/src/main/java/bisq/core/user/UserPayload.java
@@ -25,6 +25,7 @@ import bisq.core.payment.PaymentAccount;
import bisq.core.proto.CoreProtoResolver;
import bisq.core.support.dispute.arbitration.arbitrator.Arbitrator;
import bisq.core.support.dispute.mediation.mediator.Mediator;
+import bisq.core.support.dispute.refund.refundagent.RefundAgent;
import bisq.common.proto.ProtoUtil;
import bisq.common.proto.persistable.PersistableEnvelope;
@@ -73,6 +74,12 @@ public class UserPayload implements PersistableEnvelope {
@Nullable
private List marketAlertFilters = new ArrayList<>();
+ // Added v1.2.0
+ @Nullable
+ private RefundAgent registeredRefundAgent;
+ @Nullable
+ private List acceptedRefundAgents = new ArrayList<>();
+
public UserPayload() {
}
@@ -105,6 +112,12 @@ public class UserPayload implements PersistableEnvelope {
Optional.ofNullable(priceAlertFilter).ifPresent(priceAlertFilter -> builder.setPriceAlertFilter(priceAlertFilter.toProtoMessage()));
Optional.ofNullable(marketAlertFilters)
.ifPresent(e -> builder.addAllMarketAlertFilters(ProtoUtil.collectionToProto(marketAlertFilters)));
+
+ Optional.ofNullable(registeredRefundAgent)
+ .ifPresent(registeredRefundAgent -> builder.setRegisteredRefundAgent(registeredRefundAgent.toProtoMessage().getRefundAgent()));
+ Optional.ofNullable(acceptedRefundAgents)
+ .ifPresent(e -> builder.addAllAcceptedRefundAgents(ProtoUtil.collectionToProto(acceptedRefundAgents,
+ message -> ((protobuf.StoragePayload) message).getRefundAgent())));
return protobuf.PersistableEnvelope.newBuilder().setUserPayload(builder).build();
}
@@ -130,6 +143,11 @@ public class UserPayload implements PersistableEnvelope {
PriceAlertFilter.fromProto(proto.getPriceAlertFilter()),
proto.getMarketAlertFiltersList().isEmpty() ? new ArrayList<>() : new ArrayList<>(proto.getMarketAlertFiltersList().stream()
.map(e -> MarketAlertFilter.fromProto(e, coreProtoResolver))
- .collect(Collectors.toSet())));
+ .collect(Collectors.toSet())),
+ proto.hasRegisteredRefundAgent() ? RefundAgent.fromProto(proto.getRegisteredRefundAgent()) : null,
+ proto.getAcceptedRefundAgentsList().isEmpty() ? new ArrayList<>() : new ArrayList<>(proto.getAcceptedRefundAgentsList().stream()
+ .map(RefundAgent::fromProto)
+ .collect(Collectors.toList()))
+ );
}
}
diff --git a/core/src/main/java/bisq/core/util/BSFormatter.java b/core/src/main/java/bisq/core/util/BSFormatter.java
index 98ed6f0d5a..00eb5e23a5 100644
--- a/core/src/main/java/bisq/core/util/BSFormatter.java
+++ b/core/src/main/java/bisq/core/util/BSFormatter.java
@@ -43,6 +43,7 @@ import org.apache.commons.lang3.time.DurationFormatUtils;
import java.text.DateFormat;
import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
import java.math.BigDecimal;
@@ -356,6 +357,13 @@ public class BSFormatter {
}
}
+ public static String getDateFromBlockHeight(long blockHeight) {
+ long now = new Date().getTime();
+ SimpleDateFormat dateFormatter = new SimpleDateFormat("dd MMM", Locale.getDefault());
+ SimpleDateFormat timeFormatter = new SimpleDateFormat("HH:mm", Locale.getDefault());
+ return BSFormatter.formatDateTime(new Date(now + blockHeight * 10 * 60 * 1000L), dateFormatter, timeFormatter);
+ }
+
public static String formatToPercentWithSymbol(double value) {
return formatToPercent(value) + "%";
}
diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties
index 00a85fc556..5471e26fb0 100644
--- a/core/src/main/resources/i18n/displayStrings.properties
+++ b/core/src/main/resources/i18n/displayStrings.properties
@@ -152,11 +152,11 @@ shared.save=Save
shared.onionAddress=Onion address
shared.supportTicket=support ticket
shared.dispute=dispute
+shared.mediationCase=mediation case
shared.seller=seller
shared.buyer=buyer
shared.allEuroCountries=All Euro countries
shared.acceptedTakerCountries=Accepted taker countries
-shared.arbitrator=Selected arbitrator
shared.tradePrice=Trade price
shared.tradeAmount=Trade amount
shared.tradeVolume=Trade volume
@@ -208,8 +208,13 @@ shared.learnMore=Learn more
shared.dismiss=Dismiss
shared.selectedArbitrator=Selected arbitrator
shared.selectedMediator=Selected mediator
+shared.selectedRefundAgent=Selected arbitrator
shared.mediator=Mediator
-shared.arbitrator2=Arbitrator
+shared.arbitrator=Arbitrator
+shared.refundAgent=Arbitrator
+shared.refundAgentForSupportStaff=Refund agent
+shared.delayedPayoutTxId=Refund collateral transaction ID
+
####################################################################
# UI views
@@ -329,6 +334,21 @@ offerbook.offerersAcceptedBankSeats=Accepted seat of bank countries (taker):\n {
offerbook.availableOffers=Available offers
offerbook.filterByCurrency=Filter by currency
offerbook.filterByPaymentMethod=Filter by payment method
+offerbook.timeSinceSigning=Time since signing
+offerbook.timeSinceSigning.info=This account was verified and {0}
+offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
+offerbook.timeSinceSigning.info.peer=signed by a peer, waiting for limits to be lifted
+offerbook.timeSinceSigning.info.peerLimitLifted=signed by a peer and limits were lifted
+offerbook.timeSinceSigning.info.signer=signed by peer and can sign peer accounts (limits lifted)
+offerbook.timeSinceSigning.daysSinceSigning={0} days
+offerbook.timeSinceSigning.daysSinceSigning.long={0} since signing
+
+offerbook.timeSinceSigning.help=When you successfully complete a trade with a peer who has a signed payment account, your payment account is signed.\n\
+ {0} days later, the initial limit of {1} is lifted and your account can sign other peers'' payment accounts.
+offerbook.timeSinceSigning.notSigned=Not signed yet
+offerbook.timeSinceSigning.notSigned.noNeed=N/A
+shared.notSigned=This account hasn't been signed yet
+shared.notSigned.noNeed=This account type doesn't use signing
offerbook.nrOffers=No. of offers: {0}
offerbook.volume={0} (min - max)
@@ -354,25 +374,20 @@ offerbook.warning.noTradingAccountForCurrency.msg=You don't have a trading accou
offerbook.warning.noMatchingAccount.headline=No matching trading account.
offerbook.warning.noMatchingAccount.msg=To take this offer, you will need to set up a payment account using this payment method.\n\nWould you like to do this now?
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=This offer cannot be taken because of security restrictions based on the following criteria:\n\
- - The maker''s payment account was created after March 1st 2019\n\
- - The minimum trade amount is above 0.01 BTC\n\
- - The payment method for the offer is considered risky for bank chargebacks\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=This offer cannot be taken because of security restrictions based on the following criteria:\n\
- - Your payment account was created after March 1st 2019\n\
- - The minimum trade amount is above 0.01 BTC\n\
- - The payment method for this offer is considered risky for bank chargebacks\n\n{0}
+offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\n\
+ After successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\n\
+ For more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=We needed to deploy this restriction as a short-term measure for enhanced security.\n\n\
- The next software release will provide more robust protection tools so that offers with this risk profile can be traded again.
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to 0.01 BTC because of security restrictions based on the following criteria:\n\
- - The buyers account was created after March 1st 2019\n\
- - The payment method for this offer is considered risky for bank chargebacks\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to 0.01 BTC because of security restrictions based on the following criteria:\n\
- - Your payment account was created after March 1st 2019\n\
- - The payment method for this offer is considered risky for bank chargebacks\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n\
+ - The buyer''s account has not been signed by an arbitrator or a peer\n\
+ - The time since signing of the buyer''s account is not at least 30 days\n\
+ - The payment method for this offer is considered risky for bank chargebacks\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n\
+ - Your account has not been signed by an arbitrator or a peer\n\
+ - The time since signing of your account is not at least 30 days\n\
+ - The payment method for this offer is considered risky for bank chargebacks\n\n{1}
offerbook.warning.wrongTradeProtocol=That offer requires a different protocol version as the one used in your version of the software.\n\nPlease check if you have the latest version installed, otherwise the user who created the offer has used an older version.\n\nUsers cannot trade with an incompatible trade protocol version.
offerbook.warning.userIgnored=You have added that user's onion address to your ignore list.
@@ -680,9 +695,9 @@ portfolio.pending.step3_seller.westernUnion=The buyer has to send you the MTCN (
portfolio.pending.step3_seller.halCash=The buyer has to send you the HalCash code as text message. Beside that you will receive a message from HalCash with the required information to withdraw the EUR from a HalCash supporting ATM.\n\n\
After you have picked up the money from the ATM please confirm here the receipt of the payment!
-portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the sender's name in your bank statement matches that one from the trade contract:\nSender's name: {0}\n\n\
- If the name is not the same as the one displayed here, {1}
-portfolio.pending.step3_seller.openDispute=please don't confirm but open a dispute by entering \"alt + o\" or \"option + o\".
+portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\n\
+ If the names are not exactly the same, {1}
+portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=Confirm payment receipt
portfolio.pending.step3_seller.amountToReceive=Amount to receive
portfolio.pending.step3_seller.yourAddress=Your {0} address
@@ -704,10 +719,13 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=Have you received the {0}
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=The trade ID (\"reason for payment\" text) of the transaction is: \"{0}\"\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the sender's name in your bank statement matches that one from the trade contract:\nSender's name: {0}\n\nIf the name is not the same as the one displayed here, please don't confirm but open a dispute by entering \"alt + o\" or \"option + o\".\n\n
-portfolio.pending.step3_seller.onPaymentReceived.note=Please note, that as soon you have confirmed the receipt, the locked trade amount will be released to the BTC buyer and the security deposit will be refunded.
+portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Please note, that as soon you have confirmed the receipt, the locked trade amount will be released to the BTC buyer and the security deposit will be refunded.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Confirm that you have received the payment
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Yes, I have received the payment
+portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANT: By confirming receipt of payment, you are also \
+ verifying the account of the counterparty and signing it accordingly. Since the account of the counterparty hasn't been signed yet, \
+ you should delay confirmation of the payment as long as possible to reduce the risk of a chargeback.
portfolio.pending.step5_buyer.groupTitle=Summary of completed trade
portfolio.pending.step5_buyer.tradeFee=Trade fee
@@ -716,6 +734,8 @@ portfolio.pending.step5_buyer.takersMiningFee=Total mining fees
portfolio.pending.step5_buyer.refunded=Refunded security deposit
portfolio.pending.step5_buyer.withdrawBTC=Withdraw your bitcoin
portfolio.pending.step5_buyer.amount=Amount to withdraw
+portfolio.pending.step5_buyer.signer=By withdrawing your bitcoins, you verify that the \
+ counterparty has acted according to the trade protocol.
portfolio.pending.step5_buyer.withdrawToAddress=Withdraw to address
portfolio.pending.step5_buyer.moveToBisqWallet=Move funds to Bisq wallet
portfolio.pending.step5_buyer.withdrawExternal=Withdraw to external wallet
@@ -754,6 +774,8 @@ portfolio.pending.openSupportTicket.msg=Please use this function only in emergen
\"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and \
handled by a mediator or arbitrator.
+portfolio.pending.timeLockNotOver=You have to wait until ≈{0} ({1} more blocks) before you can open an arbitration dispute.
+
portfolio.pending.notification=Notification
portfolio.pending.support.headline.getHelp=Need help?
@@ -767,15 +789,12 @@ portfolio.pending.support.button.getHelp=Get support
portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support \
ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\n\
Are you sure you want to open a support ticket?
-portfolio.pending.support.popup.info.arbitrator=If your issue with the trade remains unsolved, you can open a support \
- ticket to request help from an arbitrator. If you have not received the payment, please wait until the trade period is over.\n\n\
- Are you sure you want to open a support ticket?
portfolio.pending.support.popup.button=Open support ticket
portfolio.pending.support.headline.halfPeriodOver=Check payment
portfolio.pending.support.headline.periodOver=Trade period is over
-portfolio.pending.arbitrationRequested=Arbitration requested
portfolio.pending.mediationRequested=Mediation requested
+portfolio.pending.refundRequested=Refund requested
portfolio.pending.openSupport=Open support ticket
portfolio.pending.supportTicketOpened=Support ticket opened
portfolio.pending.requestSupport=Request support
@@ -801,15 +820,20 @@ portfolio.pending.mediationResult.popup.headline=Mediation result for trade with
portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0}
portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\n\
You receive: {0}\n\
- Your trade peer receives: {1}\n\n\
+ Your trading peer receives: {1}\n\n\
You can accept or reject this suggested payout.\n\n\
- By accepting it, you sign the proposed payout transaction. \
- If your trade peer also accepts and signs, the payout will be completed, and the trade is closed.\n\n\
- If one or both parties reject the suggestion, a dispute with an arbitrator will be opened. \
- The arbitrator will investigate the case again and do a payout based on their findings.\n\n\
- Please note that arbitrators are not always online and may take longer to respond than mediators. \
- It can take up to 5 business days for them to respond to messages.
+ By accepting, you sign the proposed payout transaction. \
+ If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\n\
+ If one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a \
+ second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\n\
+ The arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. \
+ Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for \
+ exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion \
+ (or if the other peer is unresponsive).\n\n\
+ More details about the new arbitration model:\n\
+ https://docs.bisq.network/trading-rules.html#arbitration
portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
portfolio.closed.completed=Completed
portfolio.closed.ticketClosed=Arbitrated
@@ -877,6 +901,9 @@ funds.tx.multiSigDeposit=Multisig deposit: {0}
funds.tx.multiSigPayout=Multisig payout: {0}
funds.tx.disputePayout=Dispute payout: {0}
funds.tx.disputeLost=Lost dispute case: {0}
+funds.tx.collateralForRefund=Refund collateral: {0}
+funds.tx.timeLockedPayoutTx=Time locked payout tx: {0}
+funds.tx.refund=Refund from arbitration: {0}
funds.tx.unknown=Unknown reason: {0}
funds.tx.noFundsFromDispute=No refund from dispute
funds.tx.receivedFunds=Received funds
@@ -904,6 +931,7 @@ funds.tx.dustAttackTx.popup=This transaction is sending a very small BTC amount
support.tab.mediation.support=Mediation
support.tab.arbitration.support=Arbitration
+support.tab.legacyArbitration.support=Legacy Arbitration
support.tab.ArbitratorsSupportTickets={0}'s tickets
support.filter=Filter list
support.filter.prompt=Enter trade ID, date, onion address or account data
@@ -941,7 +969,6 @@ support.sellerOfferer=BTC seller/Maker
support.buyerTaker=BTC buyer/Taker
support.sellerTaker=BTC seller/Taker
-# TODO @m52go could you provide a good text here?
support.backgroundInfo=Bisq is not a company, so it handles disputes differently.\n\n\
Traders can communicate within the application via a secure chat on the open trades screen to attempt solving a dispute on their own. \
If that is not sufficient, a mediator can step in to help. The mediator will evaluate the situation and give a recommendation for the \
@@ -970,8 +997,12 @@ You can read more about the dispute process at: {2}
support.systemMsg=System message: {0}
support.youOpenedTicket=You opened a request for support.\n\n{0}\n\nBisq version: {1}
support.youOpenedDispute=You opened a request for a dispute.\n\n{0}\n\nBisq version: {1}
-support.peerOpenedTicket=Your trading peer has requested support due to technical problems.\n\n{0}
-support.peerOpenedDispute=Your trading peer has requested a dispute.\n\n{0}
+support.youOpenedDisputeForMediation=You requested mediation.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedTicket=Your trading peer has requested support due to technical problems.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDispute=Your trading peer has requested a dispute.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDisputeForMediation=Your trading peer has requested mediation.\n\n{0}\n\nBisq version: {1}
+support.mediatorsDisputeSummary=System message:\nMediator''s dispute summary:\n{0}
+support.mediatorsAddress=Mediator''s node address: {0}
####################################################################
@@ -1107,6 +1138,7 @@ setting.about.subsystems.val=Network version: {0}; P2P message version: {1}; Loc
account.tab.arbitratorRegistration=Arbitrator registration
account.tab.mediatorRegistration=Mediator registration
+account.tab.refundAgentRegistration=Refund agent registration
account.tab.account=Account
account.info.headline=Welcome to your Bisq Account
account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\n\
@@ -2225,8 +2257,18 @@ Payout amount for BTC buyer: {1}\n\
Payout amount for BTC seller: {2}\n\n\
Summary notes:\n{3}
disputeSummaryWindow.close.nextStepsForMediation=\n\nNext steps:\n\
-Open ongoing trade and accept or reject the suggested mediation
+Open trade and accept or reject suggestion from mediator
+disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\n\nNext steps:\n\
+No further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions
disputeSummaryWindow.close.closePeer=You need to close also the trading peers ticket!
+disputeSummaryWindow.close.txDetails.headline=Publish refund transaction
+disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails=Spending: {0}\n\
+ {1}{2}\
+ Transaction fee: {3} ({4} satoshis/byte)\n\
+ Transaction size: {5} Kb\n\n\
+ Are you sure you want to publish this transaction?
emptyWalletWindow.headline={0} emergency wallet tool
emptyWalletWindow.info=Please use that only in emergency case if you cannot access your fund from the UI.\n\n\
@@ -2253,6 +2295,7 @@ filterWindow.bannedCurrencies=Filtered currency codes (comma sep.)
filterWindow.bannedPaymentMethods=Filtered payment method IDs (comma sep.)
filterWindow.arbitrators=Filtered arbitrators (comma sep. onion addresses)
filterWindow.mediators=Filtered mediators (comma sep. onion addresses)
+filterWindow.refundAgents=Filtered refund agents (comma sep. onion addresses)
filterWindow.seedNode=Filtered seed nodes (comma sep. onion addresses)
filterWindow.priceRelayNode=Filtered price relay nodes (comma sep. onion addresses)
filterWindow.btcNode=Filtered Bitcoin nodes (comma sep. addresses + port)
@@ -2489,20 +2532,38 @@ popup.shutDownInProgress.msg=Shutting down application can take a few seconds.\n
popup.attention.forTradeWithId=Attention required for trade with ID {0}
-popup.roundedFiatValues.headline=New privacy feature: Rounded fiat values
-popup.roundedFiatValues.msg=To increase privacy of your trade the {0} amount was rounded.\n\nDepending on the client version you''ll pay or receive either values with decimals or rounded ones.\n\nBoth values do comply from now on with the trade protocol.\n\nAlso be aware that BTC values are changed automatically to match the rounded fiat amount as close as possible.
-
popup.info.multiplePaymentAccounts.headline=Multiple payment accounts available
popup.info.multiplePaymentAccounts.msg=You have multiple payment accounts available for this offer. Please make sure you've picked the right one.
-popup.dao.launch.headline=The complete vision, realized
-popup.dao.launch.governance.title=Governance
-popup.dao.launch.governance=Bisq’s trading network was already decentralized. \nWith the Bisq DAO, Bisq’s leadership is now decentralized too, making Bisq exceptionally resistant to censorship.
-popup.dao.launch.trading.title=Trade
-popup.dao.launch.trading=Trade BSQ (colored bitcoin) to participate in Bisq governance. You can buy and sell BSQ just like any other asset on Bisq.
-popup.dao.launch.cheaperFees.title=Cheaper fees
-# suppress inspection "TrailingSpacesInProperty"
-popup.dao.launch.cheaperFees=Get a 90% discount on trading fees when you use BSQ. Save money and support the project at the same time!\n\n
+popup.news.launch.headline=Two Major Updates
+popup.news.launch.accountSigning.headline=ACCOUNT SIGNING
+popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer.
+popup.news.launch.ntp.headline=NEW TRADE PROTOCOL
+popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant.
+
+popup.accountSigning.selectAccounts.headline=Select payment accounts
+popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign.
+popup.accountSigning.selectAccounts.signAll=Sign all payment methods
+popup.accountSigning.selectAccounts.datePicker=Select point of time until which accounts will be signed
+
+popup.accountSigning.confirmSelectedAccounts.headline=Confirm selected payment accounts
+popup.accountSigning.confirmSelectedAccounts.description=Based on your input, {0} payment accounts will be selected.
+popup.accountSigning.confirmSelectedAccounts.button=Confirm payment accounts
+popup.accountSigning.signAccounts.headline=Confirm signing of payment accounts
+popup.accountSigning.signAccounts.description=Based on your selection, {0} payment accounts will be signed.
+popup.accountSigning.signAccounts.button=Sign payment accounts
+popup.accountSigning.signAccounts.ECKey=Enter private arbitrator key
+popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey
+
+popup.accountSigning.success.headline=Congratulations
+popup.accountSigning.success.description=All {0} payment accounts were successfully signed!
+popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\n\
+ For further information, please visit https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0}
+popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1}
+popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0}
+popup.accountSigning.peerSigner=One of your accounts is mature enough to sign other payment accounts \
+ and the initial limit for one of your accounts has been lifted.\n\n{0}
####################################################################
# Notifications
@@ -2597,7 +2658,8 @@ peerInfo.title=Peer info
peerInfo.nrOfTrades=Number of completed trades
peerInfo.notTradedYet=You have not traded with that user so far.
peerInfo.setTag=Set tag for that peer
-peerInfo.age=Payment account age
+peerInfo.age.noRisk=Payment account age
+peerInfo.age.chargeBackRisk=Time since signing
peerInfo.unknownAge=Age not known
addressTextField.openWallet=Open your default Bitcoin wallet
@@ -2770,6 +2832,7 @@ payment.accepted.banks=Accepted banks (ID)
payment.mobile=Mobile no.
payment.postal.address=Postal address
payment.national.account.id.AR=CBU number
+shared.accountSigningState=Account signing status
#new
payment.altcoin.address.dyn={0} address
@@ -2778,7 +2841,7 @@ payment.accountNr=Account number
payment.emailOrMobile=Email or mobile nr
payment.useCustomAccountName=Use custom account name
payment.maxPeriod=Max. allowed trade period
-payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. trade limit: {1} / Account age: {2}
+payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3}
payment.maxPeriodAndLimitCrypto=Max. trade duration: {0} / Max. trade limit: {1}
payment.currencyWithSymbol=Currency: {0}
payment.nameOfAcceptedBank=Name of accepted bank
@@ -2844,6 +2907,22 @@ payment.limits.info=Please be aware that all bank transfers carry a certain amou
● After the 2nd month, your per-trade limit will be {2}\n\
\n\
Please note that there are no limits on the total number of times you can trade.
+payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade buy limits based on the following 2 factors:\n\
+ \n\
+ 1. General chargeback risk for the payment method\n\
+ 2. Account signing status\n\
+ \n\
+ This payment account you just created carries some chargeback risk and is not yet signed by an arbitrator or trusted peer, \
+ so it is limited to buying {0} per trade. \
+ After it is signed, buy limits will increase as follows:\n\
+ \n\
+ ● Before signing, and up to 30 days after signing, your per-trade buy limit will be {0}\n\
+ ● 30 days after signing, your per-trade buy limit will be {1}\n\
+ ● 60 days after signing, your per-trade buy limit will be {2}\n\
+ \n\
+ Sell limits are not affected by account signing, and increase merely as account age increases. More information is at https://docs.bisq.network/payment-methods#account-signing.\n\
+ \n\
+ There are no limits on the number of trades you can make.
payment.cashDeposit.info=Please confirm your bank allows you to send cash deposits into other peoples' accounts. \
For example, Bank of America and Wells Fargo no longer allow such deposits.
diff --git a/core/src/main/resources/i18n/displayStrings_de.properties b/core/src/main/resources/i18n/displayStrings_de.properties
index b7117fad48..e644705e01 100644
--- a/core/src/main/resources/i18n/displayStrings_de.properties
+++ b/core/src/main/resources/i18n/displayStrings_de.properties
@@ -62,6 +62,10 @@ shared.priceWithCur=Preis in {0}
shared.priceInCurForCur=Preis in {0} für 1 {1}
shared.fixedPriceInCurForCur=Festpreis in {0} für 1 {1}
shared.amount=Betrag
+shared.txFee=Transaktionsgebühr
+shared.makerFee=Erstellergebühr
+shared.buyerSecurityDeposit=Käufer-Kaution
+shared.sellerSecurityDeposit=Verkäufer-Kaution
shared.amountWithCur=Betrag in {0}
shared.volumeWithCur=Volumen in {0}
shared.currency=Währung
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=Bitte senden Sie die Bestätigung erneut
shared.exportCSV=In CSV exportieren
shared.exportJSON=Exportiere als JSON
shared.noDateAvailable=Kein Datum verfügbar
-shared.arbitratorsFee=Vergütung des Vermittlers
shared.noDetailsAvailable=Keine Details vorhanden
shared.notUsedYet=Noch ungenutzt
shared.date=Datum
@@ -149,11 +152,11 @@ shared.save=Speichern
shared.onionAddress=Onion-Adresse
shared.supportTicket=Support-Ticket
shared.dispute=Konflikt
+shared.mediationCase=Mediationsfall
shared.seller=Verkäufer
shared.buyer=Käufer
shared.allEuroCountries=Alle Euroländer
shared.acceptedTakerCountries=Akzeptierte Länder für Abnehmer
-shared.arbitrator=Gewählte Vermittler
shared.tradePrice=Handelspreis
shared.tradeAmount=Handelsbetrag
shared.tradeVolume=Handelsvolumen
@@ -203,6 +206,15 @@ shared.proposal=Vorschlag
shared.votes=Stimmen
shared.learnMore=Mehr erfahren
shared.dismiss=Verwerfen
+shared.selectedArbitrator=Gewählte Vermittler
+shared.selectedMediator=Gewählter Vermittler
+shared.selectedRefundAgent=Gewählte Vermittler
+shared.mediator=Mediator
+shared.arbitrator=Vermittler
+shared.refundAgent=Vermittler
+shared.refundAgentForSupportStaff=Rückerstattung des Agenten
+shared.delayedPayoutTxId=Rückerstattung von Sicherheiten Transaktion-ID
+
####################################################################
# UI views
@@ -244,7 +256,7 @@ mainView.footer.btcInfo.synchronizingWith=Synchronisiere mit
mainView.footer.btcInfo.synchronizedWith=Synchronisiert mit
mainView.footer.btcInfo.connectingTo=Verbinde mit
mainView.footer.btcInfo.connectionFailed=Verbindung fehlgeschlagen
-mainView.footer.p2pInfo=P2P-Netzwerk-Peers: {0}
+mainView.footer.p2pInfo=Bisq-Netzwerk-Peers: {0}
mainView.footer.daoFullNode=DAO Full Node
mainView.bootstrapState.connectionToTorNetwork=(1/4) Verbinde mit Tor-Netzwerk...
@@ -254,10 +266,10 @@ mainView.bootstrapState.initialDataReceived=(4/4) Anfangsdaten erhalten
mainView.bootstrapWarning.noSeedNodesAvailable=Keine Seed-Knoten verfügbar
mainView.bootstrapWarning.noNodesAvailable=Keine Seed-Knoten und Peers verfügbar
-mainView.bootstrapWarning.bootstrappingToP2PFailed=Bootstrapping zum P2P-Netzwerk fehlgeschlagen
+mainView.bootstrapWarning.bootstrappingToP2PFailed=Bootstrapping zum Bisq-Netzwerk fehlgeschlagen
mainView.p2pNetworkWarnMsg.noNodesAvailable=Es sind keine Seed-Knoten oder bestehenden Peers verfügbar, um Daten anzufordern.\nÜberprüfen Sie bitte Ihre Internetverbindung oder versuchen Sie die Anwendung neu zu starten.
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Verbinden mit P2P-Netzwerk fehlgeschlagen (gemeldeter Fehler: {0}).\nBitte überprüfen Sie Ihre Internetverbindungen oder versuchen Sie die Anwendung neu zu starten.
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Verbinden mit Bisq-Netzwerk fehlgeschlagen (gemeldeter Fehler: {0}).\nBitte überprüfen Sie Ihre Internetverbindungen oder versuchen Sie die Anwendung neu zu starten.
mainView.walletServiceErrorMsg.timeout=Verbindung mit Bitcoin-Netzwerk aufgrund einer Zeitüberschreitung fehlgeschlagen.
mainView.walletServiceErrorMsg.connectionError=Verbindung mit Bitcoin-Netzwerk aufgrund eines Fehlers fehlgeschlagen: {0}
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=Abschluss:
market.trades.tooltip.candle.high=Hoch:
market.trades.tooltip.candle.low=Niedrig:
market.trades.tooltip.candle.average=Durchschnitt:
+market.trades.tooltip.candle.median=Median:
market.trades.tooltip.candle.date=Datum:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=Als Banksitz akzeptierte Länder (Abnehmer):
offerbook.availableOffers=Verfügbare Angebote
offerbook.filterByCurrency=Nach Währung filtern
offerbook.filterByPaymentMethod=Nach Zahlungsmethode filtern
+offerbook.timeSinceSigning=Zeit seit der Unterzeichnung
+offerbook.timeSinceSigning.info=Dieses Konto wurde verifiziert und {0}
+offerbook.timeSinceSigning.info.arbitrator=von einem Vermittler unterzeichnet und kann Partner-Konten unterzeichnen
+offerbook.timeSinceSigning.info.peer=von einem Partner unterzeichnet, der darauf wartet, dass die Limits aufgehoben werden
+offerbook.timeSinceSigning.info.peerLimitLifted=von einem Partner unterzeichnet und Limits wurden aufgehoben
+offerbook.timeSinceSigning.info.signer=vom Partner unterzeichnet und kann Partner-Konten unterzeichnen (Limits aufgehoben)
+offerbook.timeSinceSigning.daysSinceSigning={0} Tage
+offerbook.timeSinceSigning.daysSinceSigning.long={0} seit der Unterzeichnung
+
+offerbook.timeSinceSigning.help=Wenn Sie einen Trade mit einem Partner erfolgreich abschließen, der ein unterzeichnetes Zahlungskonto hat, wird Ihr Zahlungskonto unterzeichnet.\n{0} Tage später wird das anfängliche Limit von {1} aufgehoben und Ihr Konto kann die Zahlungskonten anderer Partner unterzeichnen.
+offerbook.timeSinceSigning.notSigned=Noch nicht unterzeichnet
+offerbook.timeSinceSigning.notSigned.noNeed=N/A
+shared.notSigned=DIeses Konto wurde noch nicht unterzeichnet
+shared.notSigned.noNeed=Dieser Kontotyp verwendet keine Unterzeichnung
offerbook.nrOffers=Anzahl der Angebote: {0}
offerbook.volume={0} (min - max)
@@ -345,14 +372,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=Sie haben kein Handelskonto f
offerbook.warning.noMatchingAccount.headline=Kein passendes Handelskonto vorhanden.
offerbook.warning.noMatchingAccount.msg=Um dieses Angebot anzunehmen, müssen Sie ein Zahlungskonto für diese Zahlungsmethode erstellen.\n\nMöchten Sie dies jetzt tun?
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=Dieses Angebot kann nicht angenommen werden, aufgrund von Sicherheitseinschränkungen basierend auf folgenden Kriterien:\n- Das Zahlungskonto des Erstellers wurde nach dem 1. März 2019 angelegt\n- Der minimale Handelsbetrag liegt über 0,01 BTC\n- Die Zahlungsmethode für das Angebot gilt als riskant für Bankrückbuchungen\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=Dieses Angebot kann aufgrund von Handelsbeschränkungen der Gegenpartei nicht angenommen werden
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=Dieses Angebot kann nicht angenommen werden, aufgrund von Sicherheitseinschränkungen basierend auf folgenden Kriterien:\n- Ihr Zahlungskonto wurde nach dem 1. März 2019 angelegt\n- Der minimale Handelsbetrag liegt über 0,01 BTC\n- Die Zahlungsmethode für das Angebot gilt als riskant für Bankrückbuchungen\n\n{0}
+offerbook.warning.newVersionAnnouncement=Mit dieser Version der Software können Trading-Partner die Zahlungskonten der anderen verifizieren und unterzeichnen, um ein Netzwerk von vertrauenswürdigen Zahlungskonten zu erstellen.\n\nNach erfolgreichem Trading mit einem Partner mit einem verifizierten Zahlungskonto wird Ihr Zahlungskonto unterzeichnet und die Handelslimits werden nach einem bestimmten Zeitintervall aufgehoben (die Länge dieses Intervalls basiert auf der Verifizierungsmethode).\n\nWeitere Informationen zur Kontounterzeichnung finden Sie in der Dokumentation unter https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=Wir mussten diese Einschränkung als kurzfristige Maßnahme für mehr Sicherheit einsetzen.\n\nDer nächste Software-Release wird robustere Schutzmaßnahmen bieten, so dass Angebote mit diesem Risikoprofil wieder gehandelt werden können.
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=Der zulässige Handelsbetrag ist aufgrund von Sicherheitseinschränkungen, die auf den folgenden Kriterien basieren, auf 0,01 BTC begrenzt:\n- Das Käuferkonto wurde nach dem 1. März 2019 erstellt\n- Die Zahlungsmethode für dieses Angebot gilt als riskant für Bankrückbuchungen\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=Der zulässige Handelsbetrag ist aufgrund von Sicherheitseinschränkungen, die auf den folgenden Kriterien basieren, auf 0,01 BTC begrenzt:\n- Ihr Zahlungskonto wurde nach dem 1. März 2019 erstellt\n- Die Zahlungsmethode für dieses Angebot gilt als riskant für Bankrückbuchungen\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=Der zulässige Handelsbetrag ist aufgrund von Sicherheitseinschränkungen, die auf den folgenden Kriterien basieren, auf {0} begrenzt:\n- Das Konto des Käufers wurde nicht von einem Vermittler oder einem Partner unterzeichnet\n- Die Zeit seit der Unterzeichnung des Kontos des Käufers beträgt nicht mindestens 30 Tage\n- Die Zahlungsmethode für dieses Angebot gilt als riskant für Bankrückbuchungen\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=Der zulässige Trade-Betrag ist aufgrund von Sicherheitseinschränkungen, die auf den folgenden Kriterien basieren, auf {0} begrenzt:\n- Ihr Konto wurde nicht von einem Vermittler oder einem Partner unterzeichnet\n- Die Zeit seit der Unterzeichnung Ihres Kontos beträgt nicht mindestens 30 Tage\n- Die Zahlungsmethode für dieses Angebot gilt als riskant für Bankrückbuchungen\n\n{1}
offerbook.warning.wrongTradeProtocol=Dieses Angebot benötigt eine andere Protokollversion, als die Version Ihrer Software.\n\nBitte überprüfen Sie, ob Sie die aktuellste Version installiert haben. Andernfalls hat der Nutzer, der das Angebot erstellt hat, eine ältere Version benutzt.\n\nNutzer können nicht mit inkompatiblen Protokollversionen handeln.
offerbook.warning.userIgnored=Sie haben die Onion-Adresse dieses Nutzers zu Ihrer Liste ignorierter Adressen hinzugefügt.
@@ -478,7 +503,7 @@ takeOffer.failed.offerTaken=Sie können dieses Angebot nicht annehmen, da es ber
takeOffer.failed.offerRemoved=Sie können dieses Angebot nicht annehmen, da es inzwischen entfernt wurde.
takeOffer.failed.offererNotOnline=Die Angebotsannahme ist fehlgeschlagen, da der Ersteller nicht mehr online ist.
takeOffer.failed.offererOffline=Sie können das Angebot nicht annehmen, da der Ersteller offline ist.
-takeOffer.warning.connectionToPeerLost=Sie haben die Verbindung zum Ersteller verloren.\nEr könnte offline gegangen sein oder die Verbindung zu Ihnen aufgrund zu vieler Verbindungen geschlossen haben.\n\nFalls Sie das Angebot noch im Angebotsbuch sehen, können Sie versuchen das Angebot erneut anzunehmen.
+takeOffer.warning.connectionToPeerLost=Sie haben die Verbindung zum Ersteller verloren.\nEr ist möglicherweise offline gegangen oder hat die Verbindung zu Ihnen wegen zu vieler offener Verbindungen geschlossen.\n\nFalls Sie das Angebot noch im Angebotsbuch sehen, können Sie versuchen das Angebot erneut anzunehmen.
takeOffer.error.noFundsLost=\n\nEs haben noch keine Gelder Ihre Wallet verlassen.\nVersuchen Sie bitte Ihre Anwendung neu zu starten und überprüfen Sie Ihre Netzwerkverbindung, um zu sehen ob Sie das Problem beheben können.
takeOffer.error.feePaid=\n\nVersuchen Sie bitte die Anwendung neu zu starten und überprüfen Sie Ihre Netzwerkverbindung um zu sehen, ob Sie das Problem beheben können.
@@ -516,8 +541,8 @@ portfolio.pending.step3_seller.confirmPaymentReceived=Zahlungseingang bestätige
portfolio.pending.step5.completed=Abgeschlossen
portfolio.pending.step1.info=Die Kautionstransaktion wurde veröffentlicht.\n{0} muss auf wenigstens eine Blockchain-Bestätigung warten, bevor die Zahlung beginnt.
-portfolio.pending.step1.warn=Die Kautionstransaktion wurde noch nicht bestätigt.\nDies kann in seltenen Fällen passieren, wenn die Finanzierungsgebühr von der externen Wallet eines Händlers zu niedrig war.
-portfolio.pending.step1.openForDispute=Die Kautionstransaktion wurde noch nicht bestätigt.\nDies kann in seltenen Fällen passieren, wenn die Finanzierungsgebühr, von der externen Wallet eines Händlers, zu niedrig war.\nDie maximale Dauer des Handels wurde überschritten.\n\nBitte kontaktieren Sie den Vermittler, um einen Konflikt zu öffnen.
+portfolio.pending.step1.warn=Die Kautionstransaktion ist noch nicht bestätigt. Dies geschieht manchmal in seltenen Fällen, wenn die Finanzierungsgebühr aus der externen Wallet eines Traders zu niedrig war.
+portfolio.pending.step1.openForDispute=Die Kautionstransaktion ist noch nicht bestätigt. Sie können länger warten oder den Vermittler um Hilfe bitten.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=Ihr Handel hat wenigstens eine Blockchain-Bestätigung erreicht.\n(Falls Sie möchten können Sie weitere Bestätigungen abwarten. 6 Bestätigungen werden als sehr sicher angesehen.)\n\n
@@ -535,8 +560,10 @@ portfolio.pending.step2_buyer.altcoin=Bitte überweisen Sie von Ihrer externen {
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=Bitte gehen Sie zu einer Bank und zahlen Sie {0} an den BTC-Verkäufer.\n\n
portfolio.pending.step2_buyer.cash.extra=WICHTIGE VORAUSSETZUNG:\nNachdem Sie die Zahlung getätigt haben, schreiben Sie auf die Quittung: NO REFUNDS.\nReißen Sie diese in zwei Teile und machen Sie ein Foto, das Sie an die E-Mail-Adresse des BTC-Verkäufers senden.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=Bitte zahlen Sie {0} an den BTC-Verkäufer mit MoneyGram.\n\n
portfolio.pending.step2_buyer.moneyGram.extra=WICHTIGE VORAUSSETZUNG: \nNachdem Sie die Zahlung getätigt haben, senden Sie die Authorisierungs-Nummer und ein Foto der Quittung per E-Mail an den BTC-Verkäufer.\nDie Quittung muss den vollständigen Namen, das Land, Bundesland des Verkäufers und den Betrag deutlich zeigen. Die E-Mail-Adresse des Verkäufers lautet: {0}.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=Bitte zahlen Sie {0} an den BTC-Verkäufer mit Western Union.\n\n
portfolio.pending.step2_buyer.westernUnion.extra=WICHTIGE VORAUSSETZUNG: \nNachdem Sie die Zahlung getätigt haben, senden Sie die MTCN (Tracking-Nummer) und ein Foto der Quittung per E-Mail an den BTC-Verkäufer.\nDie Quittung muss den vollständigen Namen, die Stadt, das Land des Verkäufers und den Betrag deutlich zeigen. Die E-Mail-Adresse des Verkäufers lautet: {0}.
@@ -544,14 +571,15 @@ portfolio.pending.step2_buyer.westernUnion.extra=WICHTIGE VORAUSSETZUNG: \nNachd
portfolio.pending.step2_buyer.postal=Bitte senden Sie {0} per \"US Postal Money Order\" an den BTC-Verkäufer.\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.bank=Bitte besuchen Sie Ihre Online-Banking-Website und zahlen Sie {0} an den BTC-Verkäufer.\n\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=Bitte kontaktieren Sie den BTC-Verkäufer, mit den bereitgestellten Daten und organisieren Sie ein Treffen um {0} zu zahlen.\n\n
portfolio.pending.step2_buyer.startPaymentUsing=Zahlung per {0} beginnen
portfolio.pending.step2_buyer.amountToTransfer=Zu überweisender Betrag
portfolio.pending.step2_buyer.sellersAddress={0}-Adresse des Verkäufers
portfolio.pending.step2_buyer.buyerAccount=Ihr zu verwendendes Zahlungskonto
portfolio.pending.step2_buyer.paymentStarted=Zahlung begonnen
-portfolio.pending.step2_buyer.warn=Sie haben Ihre {0}-Zahlung noch nicht getätigt!\nBeachten Sie bitte, dass der Handel bis {1} abgeschlossen werden muss, da dieser sonst vom Vermittler untersucht wird.
-portfolio.pending.step2_buyer.openForDispute=Sie haben Ihre Zahlung nicht abgeschlossen!\nDie maximale Handelsdauer wurde überschritten.\n\nBitte kontaktieren Sie den Vermittler, um einen Konflikt zu öffnen.
+portfolio.pending.step2_buyer.warn=Sie haben Ihre {0} Zahlung noch nicht getätigt!\nBeachten Sie bitte, dass der Handel bis {1} abgeschlossen werden muss.
+portfolio.pending.step2_buyer.openForDispute=Sie haben Ihre Zahlung noch nicht abgeschlossen!\nDie maximale Frist für den Handel ist abgelaufen, bitte wenden Sie sich an den Vermittler, um Hilfe zu erhalten.
portfolio.pending.step2_buyer.paperReceipt.headline=Haben Sie die Quittung an den BTC-Verkäufer gesendet?
portfolio.pending.step2_buyer.paperReceipt.msg=Erinnerung:\nSie müssen folgendes auf die Quittung schreiben: NO REFUNDS.\nZerreißen Sie diese dann in zwei Teile und machen Sie ein Foto, das Sie an die E-Mail-Adresse des BTC-Verkäufers senden.
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=Authorisierungs-Nummer und Quittung senden
@@ -569,7 +597,11 @@ portfolio.pending.step2_seller.waitPayment.headline=Auf Zahlung warten
portfolio.pending.step2_seller.f2fInfo.headline=Kontaktinformation des Käufers
portfolio.pending.step2_seller.waitPayment.msg=Die Kautionstransaktion hat mindestens eine Blockchain-Bestätigung.\nSie müssen warten bis der BTC-Käufer die {0}-Zahlung beginnt.
portfolio.pending.step2_seller.warn=Der BTC-Käufer hat die {0}-Zahlung noch nicht getätigt.\nSie müssen warten bis die Zahlung begonnen wurde.\nWenn der Handel nicht bis {1} abgeschlossen wurde, wird der Vermittler diesen untersuchen.
-portfolio.pending.step2_seller.openForDispute=Der BTC-Käufer hat seine Zahlung noch nicht begonnen!\nDie maximale Handelsdauer wurde überschritten.\nSie können länger warten um dem Handelspartner mehr Zeit zu geben oder den Vermittler kontaktieren, um einen Konflikt zu öffnen.
+portfolio.pending.step2_seller.openForDispute=Der BTC-Käufer hat seine Zahlung nicht begonnen!\nDie maximal zulässige Frist für den Handel ist abgelaufen.\nSie können länger warten und dem Handelspartner mehr Zeit geben oder den Vermittler um Hilfe bitten.
+
+tradeChat.chatWindowTitle=Chat-Fenster für Trade mit ID ''{0}''
+tradeChat.openChat=Chat-Fenster öffnen
+tradeChat.rules=Sie können mit Ihrem Trade-Partner kommunizieren, um mögliche Probleme mit diesem Trade zu lösen.\nEs ist nicht zwingend erforderlich, im Chat zu antworten.\nWenn ein Trader gegen eine der folgenden Regeln verstößt, eröffnen Sie einen Streitfall und melden Sie ihn dem Mediator oder Vermittler.\n\nChat-Regeln:\n\t● Senden Sie keine Links (Risiko von Malware). Sie können die Transaktions-ID und den Namen eines Block-Explorers senden.\n\t● Senden Sie keine Seed-Wörter, Private Keys, Passwörter oder andere sensible Informationen!\n\t● Traden Sie nicht außerhalb von Bisq (keine Sicherheit).\n\t● Beteiligen Sie sich nicht an Betrugsversuchen in Form von Social Engineering.\n\t● Wenn ein Partner nicht antwortet und es vorzieht, nicht über den Chat zu kommunizieren, respektieren Sie seine Entscheidung.\n\t● Beschränken Sie Ihre Kommunikation auf das Traden. Dieser Chat ist kein Messenger-Ersatz oder eine Trollbox.\n\t● Bleiben Sie im Gespräch freundlich und respektvoll.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=Undefiniert
@@ -578,7 +610,7 @@ message.state.SENT=Nachricht gesendet
# suppress inspection "UnusedProperty"
message.state.ARRIVED=Nachricht beim Peer angekommen
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=Nachricht in Postfach gespeichert.
+message.state.STORED_IN_MAILBOX=Nachricht über die gesendete Zahlung wurde verschickt, aber vom Peer noch nicht erhalten
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=Peer hat Nachrichtenerhalt bestätigt
# suppress inspection "UnusedProperty"
@@ -589,22 +621,23 @@ portfolio.pending.step3_buyer.wait.info=Auf Bestätigung des BTC-Verkäufers zum
portfolio.pending.step3_buyer.wait.msgStateInfo.label=Zahlungsbeginn-Nachricht-Status
portfolio.pending.step3_buyer.warn.part1a=in der {0}-Blockchain
portfolio.pending.step3_buyer.warn.part1b=bei Ihrem Zahlungsanbieter (z.B. Bank)
-portfolio.pending.step3_buyer.warn.part2=Der BTC-Verkäufer hat Ihre Zahlung noch nicht bestätigt!\nBitte überprüfen Sie {0} ob Ihre Zahlung erfolgreich gesendet wurde.\nSollte der BTC-Verkäufer den Erhalt Ihrer Zahlung nicht bis {1} bestätigen, wird der Vermittler den Handel untersuchen.
-portfolio.pending.step3_buyer.openForDispute=Der BTC-Verkäufer hat Ihre Zahlung noch nicht bestätigt!\nDie maximale Handelsdauer wurde überschritten.\nSie können länger warten um dem Handelspartner mehr Zeit zu geben oder den Vermittler kontaktieren, um einen Konflikt zu öffnen.
+portfolio.pending.step3_buyer.warn.part2=Der BTC-Verkäufer hat Ihre Zahlung noch nicht bestätigt. Bitte überprüfen Sie {0}, ob der Zahlungsvorgang erfolgreich war.
+portfolio.pending.step3_buyer.openForDispute=Der BTC-Verkäufer hat Ihre Zahlung nicht bestätigt! Die maximale Frist für den Handel ist abgelaufen. Sie können länger warten und dem Trading-Partner mehr Zeit geben oder den Vermittler um Hilfe bitten.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=Ihr Handelspartner hat bestätigt, die {0}-Zahlung begonnen zu haben.\n\n
portfolio.pending.step3_seller.altcoin.explorer=in ihrem bevorzugten {0} Blockchain Explorer
portfolio.pending.step3_seller.altcoin.wallet=in ihrer {0} Wallet
portfolio.pending.step3_seller.altcoin={0}Bitte überprüfen Sie mit Ihrem bevorzugten {1}-Blockchain-Explorer, ob die Transaktion zu Ihrer Empfangsadresse\n{2}\nschon genug Blockchain-Bestätigungen hat.\nDer Zahlungsbetrag muss {3} sein\n\nSie können Ihre {4}-Adresse vom Hauptbildschirm kopieren und woanders einfügen, nachdem dieser Dialog geschlossen wurde.
portfolio.pending.step3_seller.postal={0}Bitte überprüfen Sie, ob Sie {1} per \"US Postal Money Order\" vom BTC-Käufer erhalten haben.\n\nDie Handels-ID (\"Verwendungszweck\") der Transaktion ist: \"{2}\"
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=Ihr Handelspartner hat den Beginn der {0}-Zahlung bestätigt.\n\nBitte gehen Sie auf Ihre Online-Banking-Website und überprüfen Sie, ob Sie {1} vom BTC-Käufer erhalten haben.\n\nDie Handels-ID (\"Verwendungszweck\") der Transaktion ist: \"{2}\"\n\n
portfolio.pending.step3_seller.cash=Da die Zahlung per Cash Deposit ausgeführt wurde, muss der BTC-Käufer \"NO REFUND\" auf die Quittung schreiben, diese in 2 Teile reißen und Ihnen ein Foto per E-Mail schicken.\n\nUm die Gefahr einer Rückbuchung zu vermeiden bestätigen Sie nur, wenn Sie die E-Mail erhalten haben und Sie sicher sind, dass die Quittung gültig ist.\nWenn Sie nicht sicher sind, {0}
portfolio.pending.step3_seller.moneyGram=Der Käufer muss Ihnen die Authorisierungs-Nummer und ein Foto der Quittung per E-Mail zusenden.\nDie Quittung muss deutlich Ihren vollständigen Namen, Ihr Land, Ihr Bundesland und den Betrag enthalten. Bitte überprüfen Sie Ihre E-Mail, wenn Sie die Authorisierungs-Nummer erhalten haben.\n\nNach dem Schließen dieses Pop-ups sehen Sie den Namen und die Adresse des BTC-Käufers, um das Geld von MoneyGram abzuholen.\n\nBestätigen Sie den Erhalt erst, nachdem Sie das Geld erfolgreich abgeholt haben!
portfolio.pending.step3_seller.westernUnion=Der Käufer muss Ihnen die MTCN (Sendungsnummer) und ein Foto der Quittung per E-Mail zusenden.\nDie Quittung muss deutlich Ihren vollständigen Namen, Ihre Stadt, Ihr Land und den Betrag enthalten. Bitte überprüfen Sie Ihre E-Mail, wenn Sie die MTCN erhalten haben.\n\nNach dem Schließen dieses Pop-ups sehen Sie den Namen und die Adresse des BTC-Käufers, um das Geld von Western Union abzuholen.\n\nBestätigen Sie den Erhalt erst, nachdem Sie das Geld erfolgreich abgeholt haben!
portfolio.pending.step3_seller.halCash=Der Käufer muss Ihnen den HalCash-Code als SMS zusenden. Außerdem erhalten Sie eine Nachricht von HalCash mit den erforderlichen Informationen, um EUR an einem HalCash-fähigen Geldautomaten abzuheben.\n\nNachdem Sie das Geld am Geldautomaten abgeholt haben, bestätigen Sie bitte hier den Zahlungseingang!
-portfolio.pending.step3_seller.bankCheck=\n\nÜberprüfen Sie auch, ob der Name des Senders auf Ihrem Kontoauszug mit dem des Handelskontaktes übereinstimmt:\nSendername: {0}\n\nFalls der Name nicht derselbe wie der hier angezeigte ist, {1}
-portfolio.pending.step3_seller.openDispute=bestätigen Sie bitte nicht, sondern öffnen Sie einen Konflikt, indem Sie \"alt + o\" oder \"option + o\" drücken.
+portfolio.pending.step3_seller.bankCheck=Bitte überprüfen Sie auch, ob der Name des im Trading-Vertrag angegebenen Absenders mit dem Namen auf Ihrem Kontoauszug übereinstimmt:\nName des Absenders, pro Trade-Vertrag: {0}\n\nWenn die Namen nicht genau gleich sind, {1}
+portfolio.pending.step3_seller.openDispute=bestätigen Sie den Zahlungseingang nicht. Eröffnen Sie stattdessen einen Konflikt, indem Sie \"alt + o\" oder \"option + o\" drücken.\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=Zahlungserhalt bestätigen
portfolio.pending.step3_seller.amountToReceive=Zu erhaltender Betrag
portfolio.pending.step3_seller.yourAddress=Ihre {0}-Adresse
@@ -617,17 +650,18 @@ portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Überprüfen Sie Ihre
portfolio.pending.step3_seller.buyerStartedPayment.fiat=Prüfen Sie Ihr Handelskonto (z.B. Bankkonto) und bestätigen Sie, wenn Sie die Zahlung erhalten haben.
portfolio.pending.step3_seller.warn.part1a=in der {0}-Blockchain
portfolio.pending.step3_seller.warn.part1b=bei Ihrem Zahlungsanbieter (z.B. Bank)
-portfolio.pending.step3_seller.warn.part2=Sie haben den Erhalt der Zahlung noch nicht bestätigt!\nBitte überprüfen Sie {0} ob Sie die Zahlung erhalten haben.\nSollten Sie die Zahlung nicht bis {1} bestätigen, wird der Handel vom Vermittler untersucht.
-portfolio.pending.step3_seller.openForDispute=Sie haben den Erhalt der Zahlung nicht bestätigt!\nDie maximale Handelsdauer wurde überschritten.\nBitte bestätigen Sie, oder kontaktieren Sie den Vermittler, um einen Konflikt zu öffnen.
+portfolio.pending.step3_seller.warn.part2=Sie haben den Eingang der Zahlung noch nicht bestätigt. Bitte überprüfen Sie {0} ob Sie die Zahlung erhalten haben.
+portfolio.pending.step3_seller.openForDispute=Sie haben den Eingang der Zahlung nicht bestätigt!\nDie maximale Frist für den Handel ist abgelaufen.\nBitte bestätigen Sie oder bitten Sie den Vermittler um Unterstützung.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=Ist die {0}-Zahlung Ihres Handelspartners eingegangen?\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=Die Handels-ID (\"Verwendungszweck\") der Transaktion ist: \"{0}\"\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=Überprüfen Sie bitte auch, ob der Name des Senders auf Ihrem Kontoauszug mit dem vom Handelsvertrag übereinstimmt:\nSendername: {0}\n\nFalls der Name nicht der hier angezeigt ist, bestätigen Sie bitte nicht, sondern öffnen Sie einen Konflikt indem Sie \"alt + o\" oder \"option + o\" drücken.\n\n
-portfolio.pending.step3_seller.onPaymentReceived.note=Bitte beachten Sie, dass sobald Sie den Erhalt bestätigt haben, der eingesperrte Handelsbetrag an den BTC-Käufer freigegeben und die Kaution zurückerstattet wird.
+portfolio.pending.step3_seller.onPaymentReceived.name=Bitte überprüfen Sie auch, ob der Name des im Trade-Vertrag angegebenen Absenders mit dem Namen auf Ihrem Kontoauszug übereinstimmt:\nName des Absenders, pro Trade-Vertrag: {0}\n\nWenn die Namen nicht genau gleich sind, bestätigen Sie den Zahlungseingang nicht. Eröffnen Sie stattdessen einen Konflikt, indem Sie \"alt + o\" oder \"option + o\" drücken.\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Bitte beachten Sie, dass, sobald Sie den Erhalt bestätigt haben, der gesperrte Trade-Betrag an den BTC-Käufer freigegeben wird und die Kaution zurückerstattet wird.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Bestätigen Sie, die Zahlung erhalten zu haben
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Ja, ich habe die Zahlung erhalten
+portfolio.pending.step3_seller.onPaymentReceived.signer=WICHTIG: Mit der Bestätigung des Zahlungseingangs verifizieren Sie auch das Konto der Gegenpartei und unterzeichnen es entsprechend. Da das Konto der Gegenpartei noch nicht unterzeichnet ist, sollten Sie die Bestätigung der Zahlung so lange wie möglich hinauszögern, um das Risiko einer Rückbelastung zu reduzieren.
portfolio.pending.step5_buyer.groupTitle=Zusammenfassung des abgeschlossenen Handels
portfolio.pending.step5_buyer.tradeFee=Handelsgebühr
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=Gesamte Mining-Gebühr
portfolio.pending.step5_buyer.refunded=Rückerstattete Kaution
portfolio.pending.step5_buyer.withdrawBTC=Ihre Bitcoins abheben
portfolio.pending.step5_buyer.amount=Abzuhebender Betrag
+portfolio.pending.step5_buyer.signer=Indem Sie Ihre Bitcoins auszahlen, verifizieren Sie, dass die Gegenpartei gemäß dem Handelsprotokoll gehandelt hat.
portfolio.pending.step5_buyer.withdrawToAddress=An diese Adresse abheben
portfolio.pending.step5_buyer.moveToBisqWallet=Gelder in Bisq-Wallet bewegen
portfolio.pending.step5_buyer.withdrawExternal=An externe Wallet abheben
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=Die Handelsdauer beginnt mit der ersten Blockc
portfolio.pending.tradePeriodWarning=Wird die Dauer überschritten, können beide Händler einen Konflikt öffnen.
portfolio.pending.tradeNotCompleted=Maximale Handelsdauer wurde überschritten (bis {0})
portfolio.pending.tradeProcess=Handelsprozess
-portfolio.pending.openAgainDispute.msg=Falls Sie nicht sicher sind, ob Ihre Nachricht den Vermittler erreicht hat (z.B. wenn Sie nach einem Tag noch keine Rückmeldung erhalten haben) können Sie gerne erneut einen Konflikt öffnen.
+portfolio.pending.openAgainDispute.msg=Falls Sie nicht sicher sind, ob Ihre Nachricht den Mediator oder Vermittler erreicht hat (z.B. wenn Sie nach 1 Tag noch keine Antwort erhalten haben), können Sie mit Cmd/Ctrl+o erneut einen Konflikt eröffnen. Sie können auch im Bisq-Forum unter https://bisq.community um zusätzliche Hilfe bitten.
portfolio.pending.openAgainDispute.button=Konflikt erneut öffnen
portfolio.pending.openSupportTicket.headline=Support-Ticket öffnen
-portfolio.pending.openSupportTicket.msg=Nutzen Sie dies bitte nur in Notfällen, wenn Ihnen die \"Support öffnen\"- oder \"Konflikt öffnen\"-Schaltflächen nicht angezeigt wird.\n\nSollten Sie ein Support-Ticket öffnen, wird der Handel unterbrochen und vom Vermittler bearbeitet.
+portfolio.pending.openSupportTicket.msg=Bitte verwenden Sie diese Funktion nur in Notfällen, wenn Sie keinen \"Open support\" oder \"Open dispute\" Button sehen.\n\nWenn Sie ein Support-Ticket öffnen, wird der Trade unterbrochen und von einem Mediator oder Vermittler bearbeitet.
+
+portfolio.pending.timeLockNotOver=Sie müssen ≈{0} ({1} weitere Blöcke) warten, bevor Sie einen Vermittlungskonflikt eröffnen können.
+
portfolio.pending.notification=Benachrichtigung
-portfolio.pending.openDispute=Einen Konflikt öffnen
-portfolio.pending.arbitrationRequested=Konflikt geöffnet
+
+portfolio.pending.support.headline.getHelp=Brauchen Sie Hilfe?
+portfolio.pending.support.text.getHelp=Wenn Sie irgendwelche Probleme haben, können Sie versuchen, den Trade-Partner im Trade-Chat zu kontaktieren oder die Bisq-Community unter https://bisq.community zu fragen. Wenn Ihr Problem immer noch nicht gelöst ist, können Sie weitere Hilfe von einem Mediator anfordern.
+portfolio.pending.support.text.getHelp.arbitrator=Wenn Sie irgendwelche Probleme haben, können Sie versuchen, den Trade-Partner im Trade-Chat zu kontaktieren oder die Bisq-Community unter https://bisq.community zu fragen. Wenn Ihr Problem immer noch nicht gelöst ist, können Sie weitere Hilfe von einem Vermittler anfordern.
+portfolio.pending.support.button.getHelp=Hilfe erhalten
+portfolio.pending.support.popup.info=Wenn Ihr Problem mit dem Trade weiterhin ungelöst bleibt, können Sie ein Support-Ticket eröffnen, um Hilfe von einem Mediator anzufordern. Wenn Sie die Zahlung nicht erhalten haben, warten Sie bitte, bis die Trading-Periode abgelaufen ist.\n\nSind Sie sicher, dass Sie ein Support-Ticket eröffnen möchten?
+portfolio.pending.support.popup.button=Support-Ticket öffnen
+portfolio.pending.support.headline.halfPeriodOver=Zahlung überprüfen
+portfolio.pending.support.headline.periodOver=Die Handelsdauer ist abgelaufen
+
+portfolio.pending.mediationRequested=Mediation beantragt
+portfolio.pending.refundRequested=Rückerstattung beantragt
portfolio.pending.openSupport=Support-Ticket öffnen
portfolio.pending.supportTicketOpened=Support-Ticket geöffnet
portfolio.pending.requestSupport=Support anfordern
-portfolio.pending.error.requestSupport=Bitte melden Sie das Problem Ihrem Vermittler.\n\nEr wird die Informationen an die Entwickler weitergeben, damit das Problem untersucht wird.\nNachdem das Problem analysiert wurde, werden Sie all Ihre eingesperrten Gelder zurückerhalten.
+portfolio.pending.error.requestSupport=Bitte melden Sie das Problem Ihrem Mediator oder Vermittler.\n\nDiese werden die Informationen an die Entwickler weiterleiten, um das Problem zu untersuchen.\nNachdem das Problem analysiert wurde, erhalten Sie alle gesperrten Gelder zurück.
portfolio.pending.communicateWithArbitrator=Bitte setzen Sie sich im \"Support\"-Bildschirm mit dem Vermittler in Verbindung.
+portfolio.pending.communicateWithMediator=Bitte kommunizieren Sie im \"Support\" Bildschirm mit dem Mediator.
portfolio.pending.supportTicketOpenedMyUser=Sie haben bereits ein Support-Ticket geöffnet.\n{0}
portfolio.pending.disputeOpenedMyUser=Sie haben bereits einen Konflikt geöffnet.\n{0}
portfolio.pending.disputeOpenedByPeer=Ihr Handelspartner hat einen Konflikt geöffnet\n{0}
portfolio.pending.supportTicketOpenedByPeer=Ihr Handelspartner hat ein Support-Ticket geöffnet.\n{0}
portfolio.pending.noReceiverAddressDefined=Keine Empfangsadresse festgelegt
-portfolio.pending.removeFailedTrade=Falls der Vermittler diesen Handel nicht schließen konnte, können Sie diesen selbst zu den fehlgeschlagenen Händel verschieben.\nMöchten Sie diesen fehlgeschlagenen Handel aus den ausstehenden Händel entfernen?
+portfolio.pending.removeFailedTrade=Ist dies ein gescheiterter Trade? Wenn ja, möchten Sie diesen manuell schließen, so dass er nicht mehr als offener Trade angezeigt wird?
+
+portfolio.pending.mediationResult.headline=Vorgeschlagene Auszahlung aus der Mediation
+portfolio.pending.mediationResult.info.noneAccepted=Schließen Sie den Trade ab, indem Sie den Vorschlag des Mediators für die Trade-Auszahlung annehmen.
+portfolio.pending.mediationResult.info.selfAccepted=Sie haben den Vorschlag des Mediators angenommen. Warten Sie darauf, dass auch der Partner akzeptiert.
+portfolio.pending.mediationResult.info.peerAccepted=Ihr Trade-Partner hat den Vorschlag des Mediators angenommen. Akzeptieren Sie ihn auch?
+portfolio.pending.mediationResult.button=Lösungsvorschlag ansehen
+portfolio.pending.mediationResult.popup.headline=Mediationsergebnis für Trade mit ID: {0}
+portfolio.pending.mediationResult.popup.headline.peerAccepted=Ihr Trade-Partner hat den Vorschlag des Mediators akzeptiert für Trade {0}
+portfolio.pending.mediationResult.popup.info=Der Mediator hat die folgende Auszahlung vorgeschlagen:\nSie erhalten: {0}\nIhr Trading-Partner erhält: {1}\n\nSie können diese vorgeschlagene Auszahlung akzeptieren oder ablehnen.\n\nMit der Annahme unterzeichnen Sie die vorgeschlagene Auszahlungstransaktion. Wenn Ihr Trading-Partner auch akzeptiert und unterzeichnet, wird die Auszahlung abgeschlossen und der Trade geschlossen.\n\nWenn einer oder beide von Ihnen den Vorschlag ablehnen, müssen Sie bis {2} (Block {3}) warten, um einen Konflikt in der zweiten Runde mit einem Vermittler zu eröffnen, der den Fall erneut untersuchen und eine Auszahlung auf der Grundlage seiner Erkenntnisse vornehmen wird.\n\nDer Vermittler kann eine geringe Gebühr (Gebühr maximal: die Kaution des Traders) als Entschädigung für seine Arbeit erheben. Der Idealfall wäre, dass beide Trader dem Vorschlag des Mediators zustimmen, da das Schlichtungsverfahren für außergewöhnliche Umstände gedacht ist, z.B. wenn ein Trader sicher ist, dass der Mediator keinen fairen Auszahlungsvorschlag gemacht hat (oder wenn der andere Trader nicht reagiert).\n\nMehr Details zum neuen Vermittlungsmodell:\nhttps://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=Ablehnen und Vermittler hinzuziehen
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=Abgeschlossen
-portfolio.closed.ticketClosed=Ticket geschlossen
+portfolio.closed.ticketClosed=Vermittelt
+portfolio.closed.mediationTicketClosed=Mediiert
portfolio.closed.canceled=Abgebrochen
portfolio.failed.Failed=Fehlgeschlagen
@@ -745,6 +807,9 @@ funds.tx.multiSigDeposit=MultiSig-Kaution: {0}
funds.tx.multiSigPayout=MultiSig-Auszahlung: {0}
funds.tx.disputePayout=Konfliktauszahlung: {0}
funds.tx.disputeLost=Verlorener Konflikt: {0}
+funds.tx.collateralForRefund=Sicherheiten für die Rückerstattung: {0}
+funds.tx.timeLockedPayoutTx=Zeitgesperrte Auszahlung tx: {0}
+funds.tx.refund=Erstattung aus dem Vermittlungsverfahren: {0}
funds.tx.unknown=Unbekannter Grund: {0}
funds.tx.noFundsFromDispute=Keine Rückzahlung vom Konflikt
funds.tx.receivedFunds=Gelder erhalten
@@ -765,14 +830,15 @@ funds.tx.dustAttackTx.popup=Diese Transaktion sendet einen sehr kleinen BTC Betr
# Support
####################################################################
-support.tab.mediation.support=Support-Tickets
-support.tab.ArbitratorsSupportTickets=Support-Tickets des Vermittlers
-support.tab.TradersSupportTickets=Support-Tickets des Händlers
+support.tab.mediation.support=Mediation
+support.tab.arbitration.support=Vermittlung
+support.tab.legacyArbitration.support=Legacy-Vermittlung
+support.tab.ArbitratorsSupportTickets={0}s Tickets
support.filter=Liste filtern
support.filter.prompt=Tragen sie Handel ID, Datum, Onion Adresse oder Kontodaten
support.noTickets=Keine offenen Tickets vorhanden
support.sendingMessage=Nachricht wird gesendet...
-support.receiverNotOnline=Der Empfänger ist nicht online. Die Nachricht wurde in seinem Postfach gespeichert.
+support.receiverNotOnline=Empfänger ist nicht online. Nachricht wird in der Mailbox gespeichert.
support.sendMessageError=Senden der Nachricht fehlgeschlagen. Fehler: {0}
support.wrongVersion=Das Angebot im Konflikt wurde mit einer älteren Bisq-Version erstellt.\nSie können den Konflikt nicht mir Ihrer Version der Anwendung schließen.\n\nNutzen Sie bitte eine ältere Version mit der Protokollversion {0}
support.openFile=Anzufügende Datei öffnen (max. Dateigröße: {0} kb)
@@ -782,7 +848,7 @@ support.attachment=Anhang
support.tooManyAttachments=Sie können nicht mehr als 3 Anhänge mit einer Nachricht senden.
support.save=Datei auf Festplatte speichern
support.messages=Nachrichten
-support.input.prompt=Geben Sie hier bitte Ihre Nachricht an den Vermittler ein
+support.input.prompt=Nachricht eingeben...
support.send=Senden
support.addAttachments=Anhang anfügen
support.closeTicket=Ticket schließen
@@ -801,14 +867,18 @@ support.buyerOfferer=BTC-Käufer/Ersteller
support.sellerOfferer=BTC-Verkäufer/Ersteller
support.buyerTaker=BTC-Käufer/Abnehmer
support.sellerTaker=BTC-Verkäufer/Abnehmer
-support.backgroundInfo=Bisq ist keine Firma und betreibt keine Form von Kundendienst.\n\nFalls es während des Handelsprozess (z.B. ein Händler befolgt nicht das Handelsprotokoll) zu Konflikten kommen sollte, wird die Anwendung nach der Handelsdauer eine \"Konflikt öffnen\"-Schaltfläche anzeigen, um den Vermittler zu kontaktieren.\n\nIm Falle von Softwarefehlern oder anderen Problemen, die von der Anwendung entdeckt werden, wird eine \"Support-Ticket öffnen\" Schaltfläche angezeigt, um den Vermittler zu kontaktieren, der die Probleme an die Entwickler weiterleitet.\n\nFalls Sie ein Problem haben, aber die \"Support-Ticket öffnen\"-Schaltfläche nicht angezeigt wird, können Sie manuell ein Support-Ticket öffnen indem Sie den Probleme bereitende Handel unter \"Mappe/Offene Händel\" wählen und die Tastenkombination \"alt + o\" oder \"option + o\" drücken.. Bitte nutzen Sie diese nur, wenn Sie sicher sind, dass sich die Software nicht wie erwartet verhält. Falls Sie nicht wissen wie man Bisq verwendet oder andere Fragen haben, überprüfen Sie bitte die FAQ auf der bisq.io-Website oder erstellen Sie einen Post im Support-Abschnitt des Bisq-Forums.
-support.initialInfo=Bitte geben Sie eine Beschreibung Ihres Problems im Textfeld unterhalb ein. Fügen Sie so viele Informationen wie möglich ein, damit der Konflikt schnell gelöst wird.\n\nHier eine Liste an Informationen, die Sie bereitstellen sollten:\n\t● Falls Sie der BTC Käufer sind: Haben Sie den Fiat- oder Altcoin-Transfer durchgeführt? Falls ja, haben Sie den 'Zahlung begonnen' Knopf in der Anwendung geklickt?\n\t● Falls Sie der BTC Verkäufer sind: Haben Sie die Fiat- oder Altcoin-Zahlung erhalten? Falls ja, haben Sie den 'Zahlung erhalten' Knopf in der Anwendung geklickt?\n\t● Welche Version von Bisq nutzen Sie?\n\t● Welches Betriebsystem nutzen Sie?\n\t● Falls Sie Probleme mit einer fehlgeschlagenen Transaktion haben, sollten Sie in ein neues Datenverzeichnis wechseln.\n\t Manchmal wird das Datenverzeichnis beschädigt, was zu seltsamen Fehlern führt. \n\t Beachte: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nBitte machen Sie sich mit den Grundregeln des Konfliktprozesses vertraut:\n\t● Sie müssen innerhalb von 2 Tagen auf Anfragen vom Vermittler reagieren.\n\t● Die maximale Dauer eines Konflikts sind 14 Tage.\n\t● Sie müssen mit dem Vermittler kooperieren und die angefragten Informationen bereitstellen um Ihren Fall darzustellen.\n\t● Sie haben die Regeln das Konfliktdokuments in den Nutzungsbedingungen akzeptiert, als Sie die Anwendung das erste Mal gestartet haben.\n\nSie können mehr über den Konfliktprozess erfahren, auf: https://bisq.network/docs/exchange/arbitration-system
+support.backgroundInfo=Bisq ist kein Unternehmen, daher behandelt es Konflikte auf andere Weise.\n\nTrader können innerhalb der Anwendung über einen sicheren Chat auf dem Bildschirm für offene Trades kommunizieren, um zu versuchen, einen Konflikt selbst zu lösen. Wenn das nicht ausreicht, kann ein Mediator einschreiten und helfen. Der Mediator bewertet die Situation und gibt eine Empfehlung für die Auszahlung der Trade Funds. Wenn beide Händler diesen Vorschlag annehmen, ist die Auszahlungstransaktion abgeschlossen und der Trade geschlossen. Wenn einer oder beide Trader mit der vom Mediator empfohlenen Auszahlung nicht einverstanden sind, können sie ein Schiedsverfahren beantragen: Der Vermittler hat den dritten Schlüssel der Einzahlungstransaktion und wird die Auszahlung auf der Grundlage seiner Ergebnisse vornehmen.
+support.initialInfo=Bitte geben Sie eine Beschreibung Ihres Problems in das untenstehende Textfeld ein. Fügen Sie so viele Informationen wie möglich hinzu, um die Zeit für die Konfliktlösung zu verkürzen.\n\nHier ist eine Checkliste für Informationen, die Sie angeben sollten:\n\t● Wenn Sie der BTC-Käufer sind: Haben Sie die Fiat- oder Altcoin-Überweisung gemacht? Wenn ja, haben Sie in der Anwendung auf die Schaltfläche "Zahlung gestartet" geklickt?\n\t● Wenn Sie der BTC-Verkäufer sind: Haben Sie die Fiat- oder Altcoin-Zahlung erhalten? Wenn ja, haben Sie in der Anwendung auf die Schaltfläche "Zahlung erhalten" geklickt?\n\t● Welche Version von Bisq verwenden Sie?\n\t● Welches Betriebssystem verwenden Sie?\n\t● Wenn Sie ein Problem mit fehlgeschlagenen Transaktionen hatten, überlegen Sie bitte, in ein neues Datenverzeichnis zu wechseln.\n\t Manchmal wird das Datenverzeichnis beschädigt und führt zu seltsamen Fehlern. \n\t Siehe: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nBitte machen Sie sich mit den Grundregeln für den Konfliktprozess vertraut:\n\t● Sie müssen auf die Anfragen der {0}'' innerhalb von 2 Tagen antworten.\n\t● Mediatoren antworten innerhalb von 2 Tagen. Die Vermittler antworten innerhalb von 5 Werktagen.\n\t● Die maximale Frist für einen Konflikt beträgt 14 Tage.\n\t● Sie müssen mit den {1} zusammenarbeiten und die Informationen zur Verfügung stellen, die sie anfordern, um Ihren Fall zu bearbeiten.\n\t● Mit dem ersten Start der Anwendung haben Sie die Regeln des Konfliktdokuments in der Nutzervereinbarung akzeptiert.\n\nSie können mehr über den Konfliktprozess erfahren unter: {2}
support.systemMsg=Systemnachricht: {0}
support.youOpenedTicket=Sie haben eine Anfrage auf Support geöffnet.\n\n{0}\n\nBisq-Version: {1}
support.youOpenedDispute=Sie haben eine Anfrage für einen Konflikt geöffnet.\n\n{0}\n\nBisq-version: {1}
-support.peerOpenedTicket=Ihr Handelspartner hat aufgrund technischer Probleme Support angefragt.\n\n{0}
-support.peerOpenedDispute=Ihr Handelspartner hat einen Konflikt angefragt.\n\n{0}
+support.youOpenedDisputeForMediation=Sie haben um Mediation gebeten.\n\n{0}\n\nBisq-Version: {1}
+support.peerOpenedTicket=Ihr Trading-Partner hat aufgrund technischer Probleme Unterstützung angefordert.\n\n{0}\n\nBisq-Version: {1}
+support.peerOpenedDispute=Ihr Trading-Partner hat einen Konflikt eröffnet.\n\n{0}\n\nBisq-Version: {1}
+support.peerOpenedDisputeForMediation=Ihr Trading-Partner hat eine Mediation beantragt.\n\n{0}\n\nBisq-Version: {1}
+support.mediatorsDisputeSummary=Systemmeldung:\nKonflikt-Zusammenfassung des Mediators:\n{0}
+support.mediatorsAddress=Node-Adresse des Mediators: {0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=Altcoin hinzufügen
setting.preferences.displayOptions=Darstellungsoptionen
setting.preferences.showOwnOffers=Eigenen Angebote im Angebotsbuch zeigen
setting.preferences.useAnimations=Animationen abspielen
+setting.preferences.useDarkMode=Dark Mode (Beta) verwenden
setting.preferences.sortWithNumOffers=Marktlisten nach Anzahl der Angebote/Händel sortieren
setting.preferences.resetAllFlags=Alle \"Nicht erneut anzeigen\"-Häkchen zurücksetzen
setting.preferences.reset=Zurücksetzen
@@ -852,7 +923,7 @@ settings.preferences.selectCurrencyNetwork=Netzwerk auswählen
setting.preferences.daoOptions=DAO-Optionen
setting.preferences.dao.resync.label=Zustand der DAO von der Genesis-Tx erneut herstellen
setting.preferences.dao.resync.button=Erneut synchronisieren
-setting.preferences.dao.resync.popup=Nach einem Neustart der Anwendung werden die P2P-Netzwerkdaten von den Seed-Knoten neu eingelesen, um ausgehend von der Genesis-Transaktion den BSQ-Konsens-Status wiederherzustellen.
+setting.preferences.dao.resync.popup=Nach einem Neustart der Anwendung werden die Bisq-Netzwerk-Governance-Daten von den Seed-Knoten neu geladen und der BSQ-Konsensstatus aus der Genesis-Transaktion neu aufgebaut.
setting.preferences.dao.isDaoFullNode=Bisq als DAO Full Node betreiben
setting.preferences.dao.rpcUser=RPC Benutzername
setting.preferences.dao.rpcPw=RPC Passwort
@@ -862,7 +933,7 @@ setting.preferences.dao.fullNodeInfo.ok=Dokumentationsseite öffnen
setting.preferences.dao.fullNodeInfo.cancel=Nein, ich möchte weiterhin den Lite Node Modus verwenden
settings.net.btcHeader=Bitcoin-Netzwerk
-settings.net.p2pHeader=P2P-Netzwerk
+settings.net.p2pHeader=Bisq-Netzwerk
settings.net.onionAddressLabel=Meine Onion-Adresse
settings.net.btcNodesLabel=Spezifische Bitcoin-Core-Knoten verwenden
settings.net.bitcoinPeersLabel=Verbundene Peers
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=Erhalten
settings.net.peerTypeColumn=Peer-Typ
settings.net.openTorSettingsButton=Tor-Netzwerkeinstellungen öffnen
+settings.net.versionColumn=Version
+settings.net.subVersionColumn=Subversion
+settings.net.heightColumn=Höhe
+
settings.net.needRestart=Sie müssen die Anwendung neustarten, um die Änderungen anzuwenden.\nMöchten Sie jetzt neustarten?
settings.net.notKnownYet=Noch nicht bekannt...
settings.net.sentReceived=Gesendet: {0}, erhalten: {1}
@@ -928,9 +1003,11 @@ setting.about.subsystems.val=Netzwerkversion: {0}; P2P-Nachrichtenversion: {1};
####################################################################
account.tab.arbitratorRegistration=Vermittler-Registrierung
+account.tab.mediatorRegistration=Mediator-Registrierung
+account.tab.refundAgentRegistration=Registrierung des Rückerstattungsbeauftragten
account.tab.account=Konto
account.info.headline=Willkommen in Ihrem Bisq-Konto
-account.info.msg=Hier können Sie Handelskonten für nationale Währungen & Altcoins konfigurieren, Vermittler auswählen und Backups für Ihre Wallets & Kontodaten erstellen.\n\nEine leere Bitcoinwallet wurde erstellt, als Sie das erste Mal Bisq gestartet haben.\nWir empfehlen, dass Sie Ihre Bitcoin-Wallet-Keimwörter aufschreiben (siehe Schaltfläche links) und sich überlegen ein Passwort hinzuzufügen, bevor Sie einzahlen. Bitcoin-Kautionen und Abhebungen werden unter \"Gelder\" verwaltet.\n\nPrivatsphäre & Sicherheit:\nBisq ist ein dezentralisierte Börse, was bedeutet, dass all Ihre Daten auf ihrem Computer bleiben. Es gibt keine Server und wir haben keinen Zugriff auf Ihre persönlichen Informationen, Ihre Gelder oder selbst Ihre IP Adresse. Daten wie Bankkontonummern, Altcoin- & Bitcoinadressen, etc werden nur mit Ihrem Handelspartner geteilt, um Händel abzuschließen, die Sie gestartet haben (im Falle eines Konflikts wird der Vermittler die selben Daten sehen wie Ihr Handelspartner).
+account.info.msg=Hier können Sie Trading-Konten für nationale Währungen und Altcoins hinzufügen und Backups für Ihre Wallets & Kontodaten erstellen.\n\nEine leere Bitcoinwallet wurde erstellt, als Sie das erste Mal Bisq gestartet haben.\n\nWir empfehlen, dass Sie Ihre Bitcoin-Wallet-Seed-Wörter aufschreiben (siehe Tab oben) und sich überlegen ein Passwort hinzuzufügen, bevor Sie einzahlen. Bitcoin-Einzahlungen und Auszahlungen werden unter \"Gelder\" verwaltet.\n\nHinweis zu Privatsphäre & Sicherheit: da Bisq eine dezentralisierte Börse ist, bedeutet dies, dass all Ihre Daten auf ihrem Computer bleiben. Es gibt keine Server und wir haben keinen Zugriff auf Ihre persönlichen Informationen, Ihre Gelder oder selbst Ihre IP Adresse. Daten wie Bankkontonummern, Altcoin- & Bitcoinadressen, etc werden nur mit Ihrem Trading-Partner geteilt, um Trades abzuschließen, die Sie initiiert haben (im Falle eines Konflikts wird der Vermittler die selben Daten sehen wie Ihr Handelspartner).
account.menu.paymentAccount=Nationale Währungskonten
account.menu.altCoinsAccountView=Altcoin-Konten
@@ -939,42 +1016,39 @@ account.menu.seedWords=Wallet-Seed
account.menu.backup=Backup
account.menu.notifications=Benachrichtigungen
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=Öffentlicher Schlüssel
-account.arbitratorRegistration.register=Vermittler registrieren
-account.arbitratorRegistration.revoke=Registrierung widerrufen
-account.arbitratorRegistration.info.msg=Beachten Sie bitte, dass Sie nach dem Widerrufen für 15 Tage verfügbar bleiben müssen, da es Händel geben kann, die Sie als Vermittler nutzen. Die maximal erlaubte Handelsdauer ist 8 Tage und der Konfliktprozess kann bis zu 7 Tage dauern.
+account.arbitratorRegistration.register=Registrieren
+account.arbitratorRegistration.registration={0} Registrierung
+account.arbitratorRegistration.revoke=Widerrufen
+account.arbitratorRegistration.info.msg=Beachten Sie bitte, dass Sie nach dem Widerrufen für 15 Tage verfügbar bleiben müssen, da es Trades geben kann, die Sie als {0} nutzen. Die maximal erlaubte Trade-Dauer ist 8 Tage und der Konfliktprozess kann bis zu 7 Tage dauern.
account.arbitratorRegistration.warn.min1Language=Sie müssen wenigstens 1 Sprache festlegen.\nWir haben Ihre Standardsprache für Sie hinzugefügt.
-account.arbitratorRegistration.removedSuccess=Sie haben Ihren Vermittler erfolgreich aus dem P2P-Netzwerk entfernt.
-account.arbitratorRegistration.removedFailed=Der Vermittler konnte nicht entfernt werden.{0}
-account.arbitratorRegistration.registerSuccess=Sie haben Ihren Vermittler erfolgreich im P2P-Netzwerk registriert.
-account.arbitratorRegistration.registerFailed=Vermittler konnte nicht registriert werden.{0}
-
-account.arbitratorSelection.minOneArbitratorRequired=Sie müssen wenigstens 1 Sprache festlegen.\nWir haben Ihre Standardsprache für Sie hinzugefügt.
-account.arbitratorSelection.whichLanguages=Welche Sprachen sprechen Sie?
-account.arbitratorSelection.whichDoYouAccept=Welche Vermittler akzeptieren Sie
-account.arbitratorSelection.autoSelect=Alle Vermittler mit passender Sprache automatisch wählen
-account.arbitratorSelection.regDate=Registrierungsdatum
-account.arbitratorSelection.languages=Sprachen
-account.arbitratorSelection.cannotSelectHimself=Ein Vermittler kann sich nicht selbst zum Handeln wählen.
-account.arbitratorSelection.noMatchingLang=Keine passende Sprache gefunden.
-account.arbitratorSelection.noLang=Sie können nur Vermittler wählen, die wenigstens 1 gemeinsame Sprache sprechen.
-account.arbitratorSelection.minOne=Sie müssen wenigstens einen Vermittler auswählen.
+account.arbitratorRegistration.removedSuccess=Sie haben Ihre Registrierung erfolgreich aus dem Bisq-Netzwerk entfernt.
+account.arbitratorRegistration.removedFailed=Die Registrierung konnte nicht entfernt werden.{0}
+account.arbitratorRegistration.registerSuccess=Sie haben sich erfolgreich im Bisq-Netzwerk registriert.
+account.arbitratorRegistration.registerFailed=Die Registrierung konnte nicht abgeschlossen werden.{0}
account.altcoin.yourAltcoinAccounts=Ihre Altcoin-Konten
-account.altcoin.popup.wallet.msg=Bitte stellen Sie sicher, dass Sie die Anforderungen für die Nutzung von {0}-Wallets befolgen, die auf der {1}-Website beschrieben werden.\nDie Verwendung von Wallets zentraler Börsen, bei denen Sie (a) Ihre Schlüssel nicht selber verwalten, oder (b) das Nutzen inkompatibler Wallet-Software können zum Verlust der gehandelten Gelder führen!\nDer Vermittler ist kein {2}-Spezialist und kann Ihnen in einem solchen Fall nicht helfen.
+account.altcoin.popup.wallet.msg=Bitte stellen Sie sicher, dass Sie die Anforderungen für die Verwendung von {0} Wallets wie auf der {1} Webseite beschrieben erfüllen.\nDie Verwendung von Wallets von zentralisierten Börsen, bei denen (a) Sie Ihre Keys nicht kontrollieren oder (b) die keine kompatible Wallet-Software verwenden, ist riskant: Es kann zum Verlust der gehandelten Gelder führen!\nDer Mediator oder Vermittler ist kein {2} Spezialist und kann in solchen Fällen nicht helfen.
account.altcoin.popup.wallet.confirm=Ich verstehe und bestätige, dass ich weiß, welche Wallet ich benutzen muss.
-account.altcoin.popup.arq.msg=ARQ auf Bisq zu Handel verlangt, dass Sie die folgenden Bedingungen verstehen:\n\nUm ARQ zu senden, müssen Sie entweder die offizielle ArQmA GUI Wallet oder ArQmA CLI Wallet mit der store-tx-info Flag aktiv (Standard in neuen Versionen). Bitte stellen Sie sicher, dass Sie Zugriff auf die Tx Schlüssel haben, weil diese im Falle eines Konflikts benötigt werden. \narqma-wallet-cli (Nutzen Sie das Kommando get_tx_key)\narqma-wallet-gui (Wählen Sie den Verlauf Reiter und klicken Sie auf den (P) Knopf, für Zahlungsbeweis)\n\nIn normalen Blockforschern ist die Transaktion nicht überprüfbar.\n\nSie müssen dem Vermittler die folgenden Daten bereitstellen, im Fall eines Konflikts:\n- Der private Schlüssel der Tx\n- Den Transaktionhash\n- Die öffentliche Adresse des Empfängers \n\nSollten Sie die Daten nicht übergeben können oder eine inkompatible Wallet verwendet haben, werden Sie den Konflikt verlieren. Der ARQ Sender ist in der Verantwortung die Übertragung der ARQ gegenüber dem Vermittler, im Falle eines Konflikts, zu beweisen.\n\nEs wird keine Zahlungskennung benötigt, nur eine normale öffentliche Adresse.\nFalls Sie sich über diesen Prozess im Unklaren sind, besuchen Sie ArQmA Discord Kanal (https://discord.gg/s9BQpJT) oder das ArQmA Forum (https://labs.arqma.com) für weiter Informationen.
-account.altcoin.popup.xmr.msg=Wenn Sie XMR auf Bisq handeln wollen, stellen Sie bitte sicher, dass Sie die folgenden Bedingungen verstehen und erfüllen:\n\nUm XMR zu senden, brauchen Sie entweder die offizielle Monero GUI Wallet oder die einfache Monero CLI Wallet mit aktivierter store-tx-info (Standard in neuen Versionen).\nStellen Sie bitte sicher, dass Sie auf den Tx-Schlüssel zugreifen können.\nmonero-wallet-cli: (nutzen Sie das get_tx_key Kommando)\nmonero-wallet-gui: (gehen sie zum Verlauf Tab und klicken Sie die (P) Schaltfläche um die Zahlungsbestätigung anzuzeigen)\n\nZusätzlich zum XMR checktx Werkzeug (https://xmr.llcoins.net/checktx.html) kann die Überprüfung auch innerhalb der Wallet durchgeführt werden. \nmonero-wallet-cli: verwenden Sie den Befehl (check_tx_key)\nmonero-wallet-gui: gehen Sie zur Erweitert > Beweisen/Prüfen-Seite\n\nIn normalen Blockexplorern ist die Übertragung nicht überprüfbar.\n\nIm Fall eines Konflikts müssen Sie dem Vermittler folgende Daten übergeben:\n- Der private Schlüssel der Tx\n- Den Transaktionshash\n- Die öffentliche Adresse des Empfängers\n\nSollten Sie die Daten nicht übergeben können oder eine inkompatible Wallet verwendet haben, werden Sie den Konflikt verlieren. Der XMR Sender ist in der Verantwortung die Übertragung der XMR gegenüber dem Vermittler im Falle eines Konflikts zu beweisen.\n\nEs wird keine Zahlungskennung benötigt, nur eine normale öffentliche Adresse.\n\nFalls Sie sich über diesen Prozess im Unklaren sind, besuchen Sie (https://www.getmonero.org/resources/user-guides/prove-payment.html) oder das Moneroforum (https://forum.getmonero.org) um weitere Informationen zu finden.
-account.altcoin.popup.blur.msg=Stellen Sie sicher, die folgenden Bedingungen verstanden zu haben, falls Sie BLUR auf Bisq handeln möchten:\n\nUm BLUR zu senden, müssen sie die Blur CLI Wallet oder Blur Netzwerk GUI Wallet nutzen.\n\nNach dem Senden der Zahlung, wird die Wallet den Transaktions-Hash (Tx ID). Diese müssen Sie speichern. Sie müssen auch das 'get_tx_key' Kommando ausführen damit der private Schlüssel angezeigt wird. Sie können diese INformationen nicht später erhalten.\n\nNutzen Sie die Blur Netzwerk GUI Wallet, können der private Schlüssel und Transaktion ID im "History" Tab gefunden werden. Sofort nach dem Senden, finden Sie die Transaktion. Klicken Sie auf das "?" Symbol in der unteren rechten Ecke der Box mit der Transaktion. Sie brauchen diese Informationen.\n\nIm Fall, dass Vermittlung nötig ist, müssen Sie folgendes dem Vermittler vorzeigen: 1.) Die Transaktion ID 2.) Der private Schlüssel der Transaktion und 3.) Die Adresse des Empfängers. Der Vermittler wird die BLUR Transaktion mithilfe des Transaktions Sichters (https://blur.cash/#tx-viewer) überprüfen.\n\nSollten Sie die benötigten Daten dem Vermittler nicht bereitstellen, verlieren Sie den Konflikt. Der BLUR Sender ist 100% verantwortlich den BLUR Transfer dem Vermittler, im Falle eines Konflikts, zu beweisen.\n\nSollten Sie diese Bedingungen nicht verstehen, suchen Sie Hilfe im Blur Network Discord (https://discord.gg/dMWaqVW).
-account.altcoin.popup.cash2.msg=Stellen Sie sicher, die folgenden Bedingungen verstanden zu haben, falls Sie CASH2 auf Bisq handeln möchten:\n\nUm CASH2 zu senden, müssen sie die CASH2 Wallet Version 3 oder höher nutzen.\n\nNach dem Senden der Zahlung, wird die Transaktions-ID angezeigt. Diese müssen Sie speichern. Sofort nach der Zahlung müssen Sie das 'get_tx_key' Kommando in simplewallet ausführen, um den geheimen Transaktionsschlüssel zu erhalten, den Sie auch speichern müssen.\n\nIm Falle eines Konflikts müssen Sie folgendes vorzeigen: 1) die Transaktion-ID, 2) den geheimen Transaktionsschlüssel und 3) die Cash2-Adresse des Empfängers. Der Vermittler wird den CASH2 Transfer mithilfe des Cash2 Blockforscher überprüfen (https://blocks.cash2.org).\n\nSollten Sie die benötigten Daten nicht dem Vermittler bereitstellen, verlieren Sie den Konflikt. In jedem Fall eines Konflikts, ist der CASH2-Sender 100% verantwortlich die Transaktion dem Vermittler zu beweisen.\n\nSollten Sie diese Bedingungen nicht verstehen, handeln Sie nicht auf Bisq. Suchen Sie erst Hilfe im Cash2 Discord (https://discord.gg/FGfXAYN).
-account.altcoin.popup.qwertycoin.msg=Stellen Sie sicher, die folgenden Bedingungen verstanden zu haben, falls Sie Qwertycoin auf Bisq handeln möchten:\n\nUm QWC zu senden, müssen sie die offizielle QWC Wallet Version 5.1.3 oder höher nutzen.\n\nNach dem Senden der Zahlung, wird die Transaktions-ID angezeigt. Diese müssen Sie speichern. Sofort nach der Zahlung müssen Sie das 'get_tx_key' Kommando in simplewallet ausführen, um den geheimen Transaktionsschlüssel zu erhalten, den Sie auch speichern müssen.\n\nIm Falle eines Konflikts müssen Sie folgendes vorzeigen: 1) die Transaktion-ID, 2) den geheimen Transaktionsschlüssel und 3) die QWC-Adresse des Empfängers. Der Vermittler wird den QWC Transfer mithilfe des QWC Blockforscher überprüfen (https://explorer.qwertycoin.org).\n\nSollten Sie die benötigten Daten nicht dem Vermittler bereitstellen, verlieren Sie den Konflikt. In jedem Fall eines Konflikts, ist der QWC-Sender 100% verantwortlich die Transaktion dem Vermittler zu beweisen.\n\nSollten Sie diese Bedingungen nicht verstehen, handeln Sie nicht auf Bisq. Suchen Sie erst Hilfe im QWC Discord (https://discord.gg/rUkfnpC).
-account.altcoin.popup.drgl.msg=Dragonglass auf Bisq zu Handel verlangt, dass Sie die folgenden Bedingungen verstehen:\n\nAufgrund der privatsphäre, die Dragonglass ermöglicht, ist eine Transaktion nicht in der öffentlichen Blockchain überprüfbar. Falls benötigt, können Sie Ihre Zahlung mithilfe des TXN private Schlüssel beweisen.\nDer TXN private Schlüssel ist ein für jede Transaktion einmalig automatisch generierter Schlüssel, der nur aus Ihrer DRGL Wallet erreichbar ist.\nEntweder mit DRGL-wallet GUI (in Transaktionendetails Dialog) oder mit der Dragonglass CLI simplewallet (nutze Kommando "get_tx_key").\n\nDRGL Version 'Oathkeeper' und höher sind für beides BENÖTIGT.\n\nSie müssen dem Vermittler die folgenden Daten bereitstellen, im Fall eines Konflikts:\n- Der private Schlüssel der TXN\n- Den Transaktionhash\n- Die öffentliche Adresse des Empfängers \n\nÜberprüfen der Zahlung erfolgt mithilfe der obigen Daten als Eingabe auf (http://drgl.info/#check_txn).\n\nSollten Sie die Daten nicht übergeben können oder eine inkompatible Wallet verwendet haben, werden Sie den Konflikt verlieren. Der Dragonglass Sender ist in der Verantwortung die Übertragung der DRGL gegenüber dem Vermittler, im Falle eines Konflikts, zu beweisen. Nutzen der PaymentID ist nicht nötig\n\nSind Sie nicht sicher über das Vorgehen. besuchen Sie Dragonglass auf Discord (http://discord.drgl.info) für Hilfe.
-account.altcoin.popup.ZEC.msg=Wenn Sie Zcash verwenden, können Sie nur die transparenten Adressen verwenden (die mit t beginnen), nicht die z-Adressen (privat), da der Vermittler die Transaktionen mit z-Adressen nicht überprüfen könnte.
-account.altcoin.popup.XZC.msg=Wenn Sie Zcoin verwenden, können Sie nur die transparenten (verfolgbaren) Adressen verwenden, nicht die unverfolgbaren, da der Vermittler Transaktionen mit unverfolgbaren Adressen in einem Block Explorer nicht überprüfen könnte.
+account.altcoin.popup.upx.msg=Der Handel mit UPX auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nFür das Senden von UPX müssen Sie entweder das offizielle uPlexa GUI-Wallet oder das uPlexa CLI-Wallet mit aktiviertem store-tx-info Flag verwenden (Standard in neuen Versionen). Bitte stellen Sie sicher, dass Sie auf den tx key zugreifen können, da dies bei einem Konfliktfall erforderlich wäre.\nuplexa-wallet-cli (verwenden Sie den Befehl get_tx_key)\nuplexa-wallet-gui (gehen Sie zum History Tab und klicken Sie auf (P) für den Zahlungsnachweis)\n\nBei normalen Blockexplorern ist der Transfer nicht verifizierbar.\n\nSie müssen dem Vermittler im Konfliktfall die folgenden Daten zur Verfügung stellen:\n- Der tx Private Key\n- Der Transaktionshash\n- Die öffentliche Adresse des Empfängers\n\nWenn Sie die oben genannten Daten nicht angeben oder wenn Sie eine inkompatible Wallet verwendet haben, verlieren Sie den Konfliktfall. Der UPX-Sender ist dafür verantwortlich, im Konfliktfall dem Vermittler die Verifizierung des UPX-Transfers nachzuweisen.\n\nEs ist keine Zahlungs-ID erforderlich, sondern nur die normale öffentliche Adresse.\nWenn Sie sich über diesen Prozess nicht sicher sind, besuchen Sie den uPlexa discord channel (https://discord.gg/vhdNSrV) oder den uPlexa Telegram Chat (https://t.me/uplexaOfficial), um weitere Informationen zu erhalten.
+account.altcoin.popup.arq.msg=Der Handel mit ARQ auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nFür den Versand von ARQ müssen Sie entweder das offizielle ArQmA GUI-Wallet oder das ArQmA CLI-Wallet mit aktiviertem store-tx-info Flag verwenden (Standard in neuen Versionen). Bitte stellen Sie sicher, dass Sie auf den tx Key zugreifen können, da dies im Falle eines Konfliktes erforderlich wäre.\narqma-wallet-cli (verwenden Sie den Befehl get_tx_key)\narqma-wallet-gui (gehen Sie zur History Tab und klicken Sie auf (P) für den Zahlungsnachweis)\n\nBei normalen Blockexplorern ist der Transfer nicht verifizierbar.\n\nSie müssen dem Mediator oder Vermittler im Konfliktfall die folgenden Daten zur Verfügung stellen:\n- Der tx Private Key\n- Der Transaktionshash\n- Die öffentliche Adresse des Empfängers\n\nWenn Sie die oben genannten Daten nicht angeben oder wenn Sie eine inkompatible Wallet verwendet haben, verlieren Sie den Konfliktfall. Der ARQ-Sender ist im Fall eines Konflikts dafür verantwortlich, die Verifizierung des ARQ-Transfers dem Mediator oder Vermittler nachzuweisen.\n\nEs ist keine Zahlungs-ID erforderlich, sondern nur die normale öffentliche Adresse.\nWenn Sie sich über diesen Prozess nicht sicher sind, besuchen Sie den ArQmA Discord Channel (https://discord.gg/s9BQpJT) oder das ArQmA Forum (https://labs.arqma.com), um weitere Informationen zu erhalten.
+account.altcoin.popup.xmr.msg=Der Handel mit XMR auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nFür das Senden von XMR müssen Sie entweder das offizielle Monero GUI-Wallet oder das Monero CLI-Wallet mit aktiviertem store-tx-info Flag verwenden (Standard in neuen Versionen). Bitte stellen Sie sicher, dass Sie auf den tx Key zugreifen können, da dies im Falle eines Konfliktes erforderlich wäre.\nmonero-wallet-cli (verwenden Sie den Befehl get_tx_key)\nmonero-wallet-gui (gehen Sie zur History Tab und klicken Sie auf (P) für den Zahlungsnachweis)\n\nZusätzlich zum XMR checktx tool (https://xmr.llcoins.net/checktx.html) kann die Verifizierung auch im Wallet durchgeführt werden.\nmonero-wallet-cli : mit dem Befehl (check_tx_key).\nmonero-wallet-gui : auf der Seite Advanced > Prove/Check.\nBei normalen Blockexplorern ist der Transfer nicht verifizierbar.\n\nSie müssen dem Mediator oder Vermittler im Konfliktfall die folgenden Daten zur Verfügung stellen:\n- Den tx Private Key\n- Den Transaktionshash\n- Die öffentliche Adresse des Empfängers\n\nWenn Sie die oben genannten Daten nicht angeben oder wenn Sie eine inkompatible Wallet verwendet haben, verlieren Sie den Konfliktfall. Der XMR-Sender ist im Fall eines Konflikts dafür verantwortlich, die Verifizierung des XMR-Transfers dem Mediator oder Schiedsrichter nachzuweisen.\n\nEs ist keine Zahlungs-ID erforderlich, sondern nur die normale öffentliche Adresse.\nWenn Sie sich über diesen Prozess nicht sicher sind, besuchen Sie (https://www.getmonero.org/resources/user-guides/prove-payment.html) oder das Monero-Forum (https://forum.getmonero.org), um weitere Informationen zu erhalten.
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=Der Handel mit MSR auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nFür den Versand von MSR müssen Sie entweder das offizielle Masari GUI Wallet, das Masari CLI Wallet mit dem aktivierten store-tx-info Flag (standardmäßig aktiviert) oder das Masari Web Wallet (https://wallet.getmasari.org) verwenden. Bitte stellen Sie sicher, dass Sie auf den tx Key zugreifen können, da dies im Falle eines Konfliktes erforderlich wäre.\nmasari-wallet-cli (verwenden Sie den Befehl get_tx_key)\nmasari-wallet-gui (gehen Sie zur History Tab und klicken Sie auf (P) für den Zahlungsnachweis).\n\nMasari Web Wallet (gehen Sie zum Konto -> Transaktionshistorie und lassen Sie Details zu Ihrer gesendeten Transaktion anzeigen)\n\nDie Verifizierung kann im Wallet durchgeführt werden.\nmasari-wallet-cli : mit dem Befehl (check_tx_key).\nmasari-wallet-gui : auf der Seite Advanced > Prove/Check.\nDie Verifizierung kann im Block-Explorer durchgeführt werden. \nÖffnen Sie den Block-Explorer (https://explorer.getmasari.org), verwenden Sie die Suchleiste, um Ihren Transaktionshash zu finden.\nSobald die Transaktion gefunden wurde, scrollen Sie nach unten zum Bereich 'Prove Sending' und geben Sie bei Bedarf Details ein.\nSie müssen dem Mediator oder Vermittler im Konfliktfall die folgenden Daten zur Verfügung stellen:\n- Den tx Private Key\n- Den Transaktionshash\n- Die öffentliche Adresse des Empfängers\n\nWenn Sie die oben genannten Daten nicht angeben oder wenn Sie eine inkompatible Wallet verwendet haben, verlieren Sie den Konfliktfall. Der MSR-Sender ist im Fall eines Konflikts dafür verantwortlich, die Verifizierung des MSR-Transfers dem Mediator oder Vermittler nachzuweisen.\n\nEs ist keine Zahlungs-ID erforderlich, sondern nur die normale öffentliche Adresse.\nWenn Sie sich über diesen Prozess nicht sicher sind, fragen Sie um Hilfe auf der offiziellen Masari Discord (https://discord.gg/sMCwMqs).
+account.altcoin.popup.blur.msg=Der Handel mit BLUR auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nUm BLUR zu senden, müssen Sie die Blur Network CLI oder GUI Wallet verwenden. \n\nWenn Sie die CLI-Wallet verwenden, wird nach dem Senden eines Transfers ein Transaktionshash (tx ID) angezeigt. Sie müssen diese Informationen speichern. Unmittelbar nach dem Senden des Transfers müssen Sie den Private Key der Transaktion mit dem Befehl 'get_tx_key' ermitteln. Wenn Sie diesen Schritt nicht ausführen, können Sie den Key möglicherweise später nicht mehr abrufen. \n\nWenn Sie das Blur Network GUI Wallet verwenden, können Sie problemlos den Private Key der Transaktion und die Transaktion-ID im "History" Tab finden. Suchen Sie sofort nach dem Absenden die Transaktion, die von Interesse ist. Klicken Sie auf das Symbol "?" in der unteren rechten Ecke des Feldes, das die Transaktion enthält. Sie müssen diese Informationen speichern. \n\nFalls ein Vermittlungsverfahren erforderlich ist, müssen Sie einem Mediator oder Vermittler Folgendes vorlegen: 1.) die Transaktions-ID, 2.) den Private Key der Transaktion und 3.) die Adresse des Empfängers. Der Mediator oder Vermittler überprüft dann den BLUR-Transfer mit dem Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nWenn Sie dem Mediator oder Vermittler nicht die erforderlichen Informationen zur Verfügung stellen, verlieren Sie den Konfliktfall. In allen Konfliktfällen trägt der BLUR-Sender 100% der Verantwortung für die Verifizierung von Transaktionen gegenüber einem Mediator oder Vermittler. \n\nWenn Sie diese Anforderungen nicht verstehen, handeln Sie nicht auf Bisq. Als Erstes suchen Sie Hilfe im Blur Network Discord (https://discord.gg/dMWaqVW).
+account.altcoin.popup.solo.msg=Der Handel mit Solo auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nUm Solo zu senden, müssen Sie das Solo Network CLI Wallet verwenden. \n\nWenn Sie das CLI-Wallet verwenden, wird nach dem Senden eines Transfers ein Transaktionshash (tx ID) angezeigt. Sie müssen diese Informationen speichern. Unmittelbar nach dem Senden des Transfers müssen Sie den Private Key der Transaktion mit dem Befehl 'get_tx_key' ermitteln. Wenn Sie diesen Schritt nicht ausführen, können Sie den Key möglicherweise später nicht mehr abrufen.\n\nFalls ein Vermittlungsverfahren erforderlich ist, müssen Sie einem Mediator oder Vermittler Folgendes vorlegen: 1.) die Transaktion-ID, 2.) den Private Key der Transaktion und 3.) die Adresse des Empfängers. Der Mediator oder Vermittler überprüft dann den Solo-Transfer mit dem Solo Block Explorer, indem er nach der Transaktion sucht und dann die Funktion "Senden nachweisen" (https://explorer.minesolo.com/) verwendet.\n\nWenn Sie dem Mediator oder Vermittler nicht die erforderlichen Informationen zur Verfügung stellen, verlieren Sie den Konfliktfall. In allen Konfliktfällen trägt der Solo-Sender 100% der Verantwortung für die Verifizierung von Transaktionen gegenüber einem Mediator oder Vermittler. \n\nWenn Sie diese Anforderungen nicht verstehen, handeln Sie nicht auf Bisq. Suchen Sie zuerst Hilfe im Solo Network Discord (https://discord.minesolo.com/).
+account.altcoin.popup.cash2.msg=Der Handel mit CASH2 auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nUm CASH2 zu versenden, müssen Sie die Cash2 Wallet Version 3 oder höher verwenden. \n\nNachdem eine Transaktion gesendet wurde, wird die Transaktions-ID angezeigt. Sie müssen diese Informationen speichern. Unmittelbar nach dem Senden der Transaktion müssen Sie den Befehl 'getTxKey' in simplewallet verwenden, um den Secret Key der Transaktion abzurufen. \n\nFalls ein Vermittlungsverfahren erforderlich ist, müssen Sie einem Mediator oder Vermittler Folgendes vorlegen: 1) die Transaktions-ID, 2) den Secret Key der Transaktion und 3) die Cash2-Adresse des Empfängers. Der Mediator oder Vermittler überprüft dann den CASH2-Transfer mit dem Cash2 Block Explorer (https://blocks.cash2.org).\n\nWenn Sie dem Mediator oder Vermittler nicht die erforderlichen Informationen zur Verfügung stellen, werden Sie den Konfliktfall verlieren. In allen Konfliktfällen trägt der CASH2-Sender 100% der Verantwortung für die Verifizierung von Transaktionen gegenüber einem Mediator oder Vermittler.\n\nWenn Sie diese Anforderungen nicht verstehen, handeln Sie nicht auf Bisq, sondern suchen Sie zunächst Hilfe im Cash2 Discord (https://discord.gg/FGfXAYN).
+account.altcoin.popup.qwertycoin.msg=Der Handel mit Qwertycoin auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nUm QWC zu versenden, müssen Sie die offizielle QWC Wallet Version 5.1.3 oder höher verwenden. \n\nNachdem eine Transaktion gesendet wurde, wird die Transaktions-ID angezeigt. Sie müssen diese Informationen speichern. Unmittelbar nach dem Senden der Transaktion müssen Sie den Befehl 'get_Tx_Key' in simplewallet verwenden, um den Secret Key der Transaktion abzurufen. \n\nFalls ein Vermittlungsverfahren erforderlich ist, müssen Sie einem Mediator oder Vermittler Folgendes vorlegen: 1) die Transaktions-ID, 2) den Secret Key der Transaktion und 3) die QWC-Adresse des Empfängers. Der Mediator oder Vermittler überprüft dann den QWC-Transfer mit dem QWC Block Explorer (https://explorer.qwertycoin.org).\n\nWenn Sie dem Mediator oder Vermittler nicht die erforderlichen Informationen zur Verfügung stellen, werden Sie den Konfliktfall verlieren. In allen Konfliktfällen trägt der QWC-Sender 100% der Verantwortung für die Verifizierung von Transaktionen gegenüber einem Mediator oder Vermittler.\n\nWenn Sie diese Anforderungen nicht verstehen, handeln Sie nicht auf Bisq, sondern suchen Sie zunächst Hilfe im QWC Discord (https://discord.gg/rUkfnpC).
+account.altcoin.popup.drgl.msg=Der Handel mit Dragonglass auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nAufgrund der Privatsphäre, die Dragonglass bietet, ist eine Transaktion auf der Public Blockchain nicht verifizierbar. Bei Bedarf können Sie Ihre Zahlung durch die Verwendung Ihres TXN-Private-Key nachweisen.\nDer TXN-Private Key ist ein einmaliger Schlüssel, der automatisch für jede Transaktion generiert wird, auf die Sie nur über Ihre DRGL-Wallet zugreifen können - entweder über die DRGL-Wallet GUI (im Transaktionsdetaildialog) oder über die Dragonglass CLI simplewallet (mit dem Befehl "get_tx_key").\n\nDRGL-Version "Oathkeeper" und höher sind für beide ERFORDERLICH.\n\nIm Konfliktfall müssen Sie dem Mediator oder Vermittler die folgenden Daten zur Verfügung stellen:\n- Den TXN-Private-Key\n- Den Transaktionshash\n- Die öffentliche Adresse des Empfängers\n\nDie Verifizierung der Zahlung kann mit den oben genannten Daten als Eingabe unter (http://drgl.info/#check_txn) erfolgen.\n\nWenn Sie die oben genannten Daten nicht angeben oder wenn Sie eine inkompatible Wallet verwendet haben, verlieren Sie den Klärungsfall. Der Dragonglass-Sender ist für die Verifizierung des DRGL-Transfers gegenüber dem Mediator oder Vermittler im Konfliktfall verantwortlich. Die Verwendung einer PaymentID ist nicht erforderlich.\n\nWenn Sie sich über irgendeinen Teil dieses Prozesses unsicher sind, besuchen Sie Dragonglass auf Discord (http://discord.drgl.info) um Hilfe zu erhalten.
+account.altcoin.popup.ZEC.msg=Bei der Verwendung von Zcash können Sie nur die transparenten Adressen (beginnend mit t) verwenden, nicht die z-Adressen (privat), da der Mediator oder Vermittler nicht in der Lage wäre, die Transaktion mit z-Adressen zu verifizieren.
+account.altcoin.popup.XZC.msg=Bei der Verwendung von Zcoin können Sie nur die transparenten (rückverfolgbaren) Adressen verwenden, nicht die nicht rückverfolgbaren Adressen, da der Mediator oder Vermittler nicht in der Lage wäre, die Transaktion mit nicht rückverfolgbaren Adressen in einem Block-Explorer zu verifizieren.
account.altcoin.popup.grin.msg=GRIN benötigt einen interaktiven Prozess zwischen Sender und Empfänger, um die Transaktion zu erstellen. Stellen Sie sicher, den Anweisungen der GRIN Projekt Webseite zu folgen, um zuverlässig GRIN zu senden und empfangen (der Empfänger muss oinline oder wenigstens während eines gewissen Zeitfensters). \n\nBisq unterstützt nur das Grinbox (Wallet713) Wallet URL Format. \n\nDer GRIN Sender muss beweisen können, die GRIN erfolgreich gesendet zu haben. Wenn die Wallet dies nicht kann, wird ein potentieller Konflikt zugunsten des GRIN Empfängers entschieden. Bitte stellen Sie sicher, dass Sie die letzte Grinbox Software nutzen, die den Transaktionsbeweis unterstützt, und Sie den Prozess verstehen, wie GRIN gesendet und empfangen wird, sowie wie man den Beweis erstellt. \n\nBeachten Sie https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only für weitere Informationen über das Grinbox proof tool.
account.altcoin.popup.beam.msg=BEAM benötigt einen interaktiven Prozess zwischen Sender und Empfänger, um die Transaktion zu erstellen.\n\nStellen Sie sicher, den Anweisungen der BEAM Projekt Webseite zu folgen, um zuverlässig BEAM zu senden und empfangen (der Empfänger muss oinline oder wenigstens während eines gewissen Zeitfensters). \n\nDer BEAM Sender muss beweisen können, die BEAM erfolgreich gesendet zu haben. Bitte stellen Sie sicher, dass Sie Wallet Software verwenden, die solche Beweise erstellen kann. Falls Die Wallet den Beweis nicht erstellen kann, wird ein potentieller Konflikt zugunsten des BEAM Empfängers entschieden.
-account.altcoin.popup.pars.msg=Stellen Sie sicher, die folgenden Bedingungen verstanden zu haben, falls Sie ParsiCoin auf Bisq handeln möchten:\n\nUm ParsiCoin zu senden, müssen sie die offizielle ParsiCoin-Wallet Version 3.0.0 oder höher nutzen.\n\nSie können Ihren Transaktions-Hash und Transaktionsschlüssel in der GUI-Wallet (ParsiPay) im Transaktionabschnitt einsehen. Sie müssen auf die Transaktion recht klicken und Details zeigen wählen.\n\nIm Falle eines Konflikts müssen Sie folgendes dem Vermittler vorzeigen: 1) der Transaktion-Hash, 2) den Transaktionsschlüssel und 3) die PARS-Adresse des Empfängers. Der Vermittler wird den PARS-Transfer mithilfe des ParsiCoin Blockforscher überprüfen (http://explorer.parsicoin.net/#check_payment).\n\nSollten Sie die benötigten Daten nicht dem Vermittler bereitstellen, verlieren Sie den Konflikt. In jedem Fall eines Konflikts, ist der ParsiCoin-Sender 100% verantwortlich die Transaktion dem Vermittler zu beweisen.\n\nSollten Sie diese Bedingungen nicht verstehen, handeln Sie nicht auf Bisq. Suchen Sie erst Hilfe im ParsiCoin Discord (https://discord.gg/c7qmFNh).
+account.altcoin.popup.pars.msg=Der Handel mit ParsiCoin auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nUm PARS zu versenden, müssen Sie die offizielle ParsiCoin Wallet Version 3.0.0 oder höher verwenden. \n\nSie können Ihren Transaktionshash und Transaktionsschlüssel im Bereich Transaktionen in Ihrer GUI-Wallet (ParsiPay) überprüfen. Sie müssen mit der rechten Maustaste auf die Transaktion und dann auf Details anzeigen klicken.\n\nFalls ein Vermittlungsverfahren erforderlich ist, müssen Sie einem Mediator oder Vermittler Folgendes vorlegen: 1) den Transaktionshash, 2) den Transaktionsschlüssel und 3) die PARS-Adresse des Empfängers. Der Mediator oder Vermittler überprüft dann den PARS-Transfer mit dem ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nWenn Sie dem Mediator oder Vermittler nicht die erforderlichen Informationen zur Verfügung stellen, werden Sie den Konfliktfall verlieren. In allen Konfliktfällen trägt der ParsiCoin-Sender 100% der Verantwortung für die Verifizierung von Transaktionen gegenüber einem Mediator oder Vermittler. \n\nWenn Sie diese Anforderungen nicht verstehen, handeln Sie nicht auf Bisq, sondern suchen Sie zunächst Hilfe im ParsiCoin Discord (https://discord.gg/c7qmFNh).
+
+account.altcoin.popup.blk-burnt.msg=Um "Burnt Blackcoins" zu handeln, müssen Sie folgendes wissen:\n\nBurnt Blackcoins können nicht ausgegeben werden. Um sie auf Bisq zu handeln, müssen die Ausgabeskripte in der Form vorliegen: OP_RETURN OP_PUSHDATA, gefolgt von zugehörigen Datenbytes, die nach der Hex-Codierung Adressen darstellen. Beispielsweise haben Burnt Blackcoins mit der Adresse 666f6f ("foo" in UTF-8) das folgende Skript:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nUm Burnt Blackcoins zu erstellen, kann man den in einigen Wallets verfügbaren RPC-Befehl "burn" verwenden.\n\nFür mögliche Anwendungsfälle kann man einen Blick auf https://ibo.laboratorium.ee werfen.\n\nDa Burnt Blackcoins nicht ausgegeben werden können, können sie nicht wieder verkauft werden. "Verkaufen" von Burnt Blackcoins bedeutet, gewöhnliche Blackcoins zu verbrennen (mit zugehörigen Daten entsprechend der Zieladresse).\n\nIm Konfliktfall hat der BLK-Verkäufer den Transaktionshash zur Verfügung zu stellen.
account.fiat.yourFiatAccounts=Ihre Nationalen Währungskonten
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=Gebundene Rolle Einheitsfaktor in BSQ
dao.param.ISSUANCE_LIMIT=Ausgabelimit pro Zyklus in BSQ
dao.param.currentValue=Aktueller Wert: {0}
+dao.param.currentAndPastValue=Aktueller Wert: {0} (Wert, als der Vorschlag gemacht wurde: {1})
dao.param.blocks={0} Blöcke
dao.results.cycle.duration.label=Dauer von {0}
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} Blöcke(Block)
dao.results.cycle.value.postFix.isDefaultValue=(Standard Wert)
dao.results.cycle.value.postFix.hasChanged=(Wurde in Wahl geändert)
-dao.results.invalidVotes=Wir hatten ungültige Wahlen in diesem Wahlzyklus. Das kann passieren, wenn eine Wahl im P2P Netzwerk nicht gut verteilt wurde.\n{0}
+dao.results.invalidVotes=Wir hatten in diesem Abstimmungszyklus ungültige Stimmen. Das kann passieren, wenn eine Abstimmung im Bisq-Netzwerk nicht gut verteilt wurde.\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=Undefiniert
@@ -1503,7 +1578,7 @@ dao.proposal.create.publish=Vorschlag veröffentlichen
dao.proposal.create.publishing=Vorschlag wird veröffentlicht ...
dao.proposal=Vorschlag
dao.proposal.display.type=Vorschlagtyp
-dao.proposal.display.name=Name/Spitzname
+dao.proposal.display.name=Exakter GitHub-Benutzername
dao.proposal.display.link=Link zu detaillierten Infos
dao.proposal.display.link.prompt=Link zu Vorschlag
dao.proposal.display.requestedBsq=Gelder in BSQ anfordern
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=Aktuelles Votum: ''{0}''. Votum abän
dao.proposal.display.myVote.accepted=Angenommen
dao.proposal.display.myVote.rejected=Abgelehnt
dao.proposal.display.myVote.ignored=Ignoriert
-dao.proposal.myVote.summary=Gewählt: {0}; Wahlgewicht: {1} (verdient: {2} + Einsatz: {3});
+dao.proposal.display.myVote.unCounted=Stimme wurde nicht in das Ergebnis einbezogen
+dao.proposal.myVote.summary=Gewählt: {0}; Stimmengewicht: {1} (verdient: {2} + Einsatz: {3}) {4}
dao.proposal.myVote.invalid=Wahl war ungültig
dao.proposal.voteResult.success=Angenommen
@@ -1680,6 +1756,7 @@ dao.monitor.daoState.utxoConflicts=UTXO Konflikte
dao.monitor.daoState.utxoConflicts.blockHeight=Blockhöhe: {0}
dao.monitor.daoState.utxoConflicts.sumUtxo=Summe aller UTXO: {0} BSQ
dao.monitor.daoState.utxoConflicts.sumBsq=Summe aller BSQ: {0} BSQ
+dao.monitor.daoState.checkpoint.popup=Der DAO Status ist nicht mit dem Netzwerk synchronisiert. Nach dem Neustart wird der DAO Status neu synchronisiert.
dao.monitor.proposal.headline=Vorschlag Status
dao.monitor.proposal.table.headline=Kette von Vorschlag Status Hashs
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=BSQ Transaktionen
dao.factsAndFigures.dashboard.marketPrice=Marktdaten
dao.factsAndFigures.dashboard.price=Aktueller BSQ/BTC Handelspreis (in Bisq)
+dao.factsAndFigures.dashboard.avgPrice90=90 Tage durchschnittlicher BSQ/BTC-Handelspreis
+dao.factsAndFigures.dashboard.avgPrice30=30 Tage durchschnittlicher BSQ/BTC-Handelspreis
dao.factsAndFigures.dashboard.marketCap=Marktkapitalisierung (basierend auf Handelspreis)
dao.factsAndFigures.dashboard.availableAmount=Insgesamt verfügbare BSQ
@@ -1769,10 +1848,6 @@ displayUpdateDownloadWindow.download.openDir=Downloadverzeichnis öffnen
disputeSummaryWindow.title=Zusammenfassung
disputeSummaryWindow.openDate=Erstellungsdatum des Tickets
disputeSummaryWindow.role=Rolle des Händlers
-disputeSummaryWindow.evidence=Beweis
-disputeSummaryWindow.evidence.tamperProof=Manipulationssichere Beweise
-disputeSummaryWindow.evidence.id=Ausweisüberprüfung
-disputeSummaryWindow.evidence.video=Video/Bildschirmmitschnitt
disputeSummaryWindow.payout=Auszahlung des Handelsbetrags
disputeSummaryWindow.payout.getsTradeAmount=Der BTC-{0} erhält die Auszahlung des Handelsbetrags
disputeSummaryWindow.payout.getsAll=Der BTC-{0} erhält alles
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=Bank
disputeSummaryWindow.summaryNotes=Zusammenfassende Anmerkungen
disputeSummaryWindow.addSummaryNotes=Zusammenfassende Anmerkungen hinzufügen
disputeSummaryWindow.close.button=Ticket schließen
-disputeSummaryWindow.close.msg=Ticket geschlossen am {0}\n\nZusammenfassung:\n{1} übermittelte, manipulatoinssichere Beweise: {2}\n{3} hat Ausweisüberprüfung geleistet: {4}\n{5} hat Bildschirmmitschnitt oder Video erstellt: {6}\nAuszahlungsbetrag für BTC-Käufer: {7}\nAuszahlungsbetrag für BTC-Verkäufer: {8}\n\nZusammenfassende Hinweise:\n{9}
+disputeSummaryWindow.close.msg=Ticket geschlossen am {0}\n\nZusammenfassung:\nAuszahlungsbetrag für BTC-Käufer: {1}\nAuszahlungsbetrag für BTC-Verkäufer: {2}\n\nZusammenfassende Hinweise:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\nNächste Schritte:\nÖffnen Sie den fortlaufenden Trade und akzeptieren Sie die vorgeschlagene Mediation oder lehnen Sie diese ab
disputeSummaryWindow.close.closePeer=Sie müssen auch das Ticket des Handelspartners schließen!
+disputeSummaryWindow.close.txDetails.headline=Rückerstattungstransaktion veröffentlichen
+disputeSummaryWindow.close.txDetails.buyer=Käufer erhält {0} an Adresse: {1}\n
+disputeSummaryWindow.close.txDetails.seller=Verkäufer erhält {0} an Adresse: {1}\n
+disputeSummaryWindow.close.txDetails=Ausgaben: {0}\n{1}{2}Transaktionsgebühr: {3} ({4} Satoshis/Byte)\nTransaktionsgröße: {5} Kb\n\nSind Sie sicher, dass Sie diese Transaktion veröffentlichen möchten?
emptyWalletWindow.headline={0} Notfall-Wallets-Werkzeug
emptyWalletWindow.info=Bitte nur in Notfällen nutzen, wenn Sie vom UI aus nicht auf Ihre Gelder zugreifen können.\n\nBeachten Sie bitte, dass alle offenen Angebote geschlossen werden, wenn Sie dieses Werkzeug verwenden.\n\nErstellen Sie ein Backup Ihres Dateiverzeichnisses, bevor Sie dieses Werkzeug verwenden. Dies können Sie unter \"Konto/Backup\" tun.\n\nBitte melden Sie uns das Problem und erstellen Sie einen Fehlerbericht auf GitHub oder im Bisq-Forum, damit wir feststellen können, was das Problem verursacht hat.
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=Sie haben offene Angebote, die entfernt werden
emptyWalletWindow.openOffers.yes=Ja, ich bin sicher.
emptyWalletWindow.sent.success=Das Guthaben Ihrer Wallet wurde erfolgreich überwiesen.
-enterPrivKeyWindow.headline=Die Registrierung ist nur für eingeladene Vermittler verfügbar
+enterPrivKeyWindow.headline=Private Key für die Registrierung eingeben
filterWindow.headline=Filterliste bearbeiten
filterWindow.offers=Herausgefilterte Angebote (durch Kommas getrennt)
@@ -1815,6 +1895,8 @@ filterWindow.accounts=Herausgefilterte Handelskonten Daten:\nFormat: Komma getre
filterWindow.bannedCurrencies=Herausgefilterte Währungscodes (durch Kommas getrennt)
filterWindow.bannedPaymentMethods=Herausgefilterte Zahlungsmethoden-IDs (durch Kommas getrennt)
filterWindow.arbitrators=Gefilterte Vermittler (mit Komma getr. Onion-Adressen)
+filterWindow.mediators=Gefilterte Mediatoren (mit Komma getr. Onion-Adressen)
+filterWindow.refundAgents=Gefilterte Rückerstattungsagenten (mit Komma getr. Onion-Adressen)
filterWindow.seedNode=Gefilterte Seed-Knoten (Komma getr. Onion-Adressen)
filterWindow.priceRelayNode=Gefilterte Preisrelais Knoten (Komma getr. Onion-Adressen)
filterWindow.btcNode=Gefilterte Bitcoinknoten (Komma getr. Adresse + Port)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(Erstellers Bank ID/BIC/SWIFT)
offerDetailsWindow.offerersBankName=(Bankname des Erstellers)
offerDetailsWindow.bankId=Bankkennung (z.B. BIC oder SWIFT)
offerDetailsWindow.countryBank=Land der Bank des Erstellers
-offerDetailsWindow.acceptedArbitrators=Akzeptierte Vermittler
offerDetailsWindow.commitment=Verpflichtung
offerDetailsWindow.agree=Ich stimme zu
offerDetailsWindow.tac=Geschäftsbedingungen
@@ -1883,6 +1964,7 @@ tradeDetailsWindow.tradeDate=Handelsdatum
tradeDetailsWindow.txFee=Mining-Gebühr
tradeDetailsWindow.tradingPeersOnion=Onion-Adresse des Handelspartners
tradeDetailsWindow.tradeState=Handelsstatus
+tradeDetailsWindow.agentAddresses=Vermittler/Mediator
walletPasswordWindow.headline=Passwort zum Entsperren eingeben
@@ -1945,10 +2027,11 @@ popup.warning.incompatibleDB=Wir haben nicht kompatible Datenbankdateien entdeck
popup.warning.startupFailed.twoInstances=Bisq läuft bereits. Sie können nicht zwei Instanzen von Bisq laufen lassen.
popup.warning.cryptoTestFailed=Es scheint so, als würden Sie selbst kompilierte Binärdateien verwenden und wären nicht den Anweisung auf https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys gefolgt.\n\nWenn dies nicht der Fall ist und Sie die offiziellen Bisq-Binärdateien genutzt haben, erstellen Sie bitte einen Fehlerbericht auf der Github-Seite.\nFehler={0}
popup.warning.tradePeriod.halfReached=Ihr Handel mit der ID {0} hat die Hälfte der maximal erlaubten Handelsdauer erreicht und ist immer noch nicht abgeschlossen.\n\nDie Handelsdauer endet am {1}\n\nBitte überprüfen Sie den Status Ihres Handels unter \"Portfolio/Offene Händel\" für weitere Informationen.
-popup.warning.tradePeriod.ended=Ihr Handel mit der ID {0} hat die maximal erlaubte Handelsdauer erreicht und ist nicht abgeschlossen.\n\nDie Handelsdauer endete am {1}\n\nBitte überprüfen Sie den Status Ihres Handels unter \"Portfolio/Offene Händel\" um den Vermittler zu kontaktieren.
+popup.warning.tradePeriod.ended=Ihr Trade mit der ID {0} hat die maximal zulässige Trade-Periode erreicht und ist nicht abgeschlossen.\n\nDie Trade-Periode endete am {1}.\n\nBitte überprüfen Sie Ihren Trade unter \"Portfolio/Open Trades\", um den Mediator zu kontaktieren.
popup.warning.noTradingAccountSetup.headline=Sie haben kein Handelskonto eingerichtet
popup.warning.noTradingAccountSetup.msg=Sie müssen ein nationales Währung- oder Altcoin-Konto einrichten, bevor Sie ein Angebot erstellen können.\nMöchten Sie ein Konto einrichten?
popup.warning.noArbitratorsAvailable=Momentan sind keine Vermittler verfügbar.
+popup.warning.noMediatorsAvailable=Es sind keine Mediatoren verfügbar.
popup.warning.notFullyConnected=Sie müssen warten, bis Sie vollständig mit dem Netzwerk verbunden sind.\nDas kann bis ungefähr 2 Minuten nach dem Start dauern.
popup.warning.notSufficientConnectionsToBtcNetwork=Sie müssen warten, bis Sie wenigstens {0} Verbindungen zum Bitcoinnetzwerk haben.
popup.warning.downloadNotComplete=Sie müssen warten bis der Download der fehlenden Bitcoinblöcke abgeschlossen ist.
@@ -1958,13 +2041,13 @@ popup.warning.examplePercentageValue=Bitte geben sei einen Prozentsatz wie folgt
popup.warning.noPriceFeedAvailable=Es ist kein Marktpreis für diese Währung verfügbar. Sie können keinen auf Prozent basierenden Preis verwenden.\nBitte wählen Sie den Festpreis.
popup.warning.sendMsgFailed=Das Senden der Nachricht an Ihren Handelspartner ist fehlgeschlagen.\nVersuchen Sie es bitte erneut und falls es weiter fehlschlägt, erstellen Sie bitte einen Fehlerbericht.
popup.warning.insufficientBtcFundsForBsqTx=Sie haben nicht genügend BTC-Gelder, um die Mining-Gebühr für diese Transaktion zu bezahlen.\nBitte finanzieren Sie Ihre BTC-Wallet.\nFehlende Gelder: {0}
-popup.warning.bsqChangeBelowDustException=Diese Transaktion erzeugt eine BSQ-Wechselgeld-Ausgabe, die unter dem Dust-Limit (5.46 BSQ) liegt und vom Bitcoin-Netzwerk abgelehnt würde.\n\nSie müssen entweder einen höheren Betrag senden, um die Wechselgeld-Ausgabe zu vermeiden (z.B. indem Sie den Dust-Betrag zu Ihrem Sende-Betrag hinzufügen) oder mehr BSQ-Guthaben zu Ihrer Wallet hinzufügen, damit Sie vermeiden, eine Dust-Ausgabe zu generieren.\n\nDie Dust-Ausgabe ist {0}.
+popup.warning.bsqChangeBelowDustException=Diese Transaktion erzeugt eine BSQ-Wechselgeld-Ausgabe, die unter dem Dust-Limit (5.46 BSQ) liegt und vom Bitcoin-Netzwerk abgelehnt werden würde.\n\nSie müssen entweder einen höheren Betrag senden, um die Wechselgeld-Ausgabe zu vermeiden (z.B. indem Sie den Dust-Betrag zu Ihrem Sende-Betrag hinzufügen) oder mehr BSQ-Guthaben zu Ihrer Wallet hinzufügen, damit Sie vermeiden, eine Dust-Ausgabe zu generieren.\n\nDie Dust-Ausgabe ist {0}.
popup.warning.btcChangeBelowDustException=Diese Transaktion erzeugt eine Wechselgeld-Ausgabe, die unter dem Dust-Limit (546 Satoshi) liegt und vom Bitcoin-Netzwerk abgelehnt würde.\n\nSie müssen den Dust-Betrag zu Ihrem Sende-Betrag hinzufügen, um zu vermeiden, dass eine Dust-Ausgabe generiert wird.\n\nDie Dust-Ausgabe ist {0}.
popup.warning.insufficientBsqFundsForBtcFeePayment=Sie haben nicht genügend BSQ-Gelder, um die Handels-Gebühr in BSQ zu bezahlen.\nSie können die Gebühr in BTC bezahlen, oder müssen Ihre BSQ-Wallet füllen. Sie können BSQ in Bisq kaufen.\n\nFehlende BSQ Gelder: {0}
popup.warning.noBsqFundsForBtcFeePayment=Ihre BSQ-Wallet hat keine ausreichenden Gelder, um die Handels-Gebühr in BSQ zu bezahlen.
popup.warning.messageTooLong=Ihre Nachricht überschreitet die maximal erlaubte Größe. Sende Sie diese in mehreren Teilen oder laden Sie sie in einen Dienst wie https://pastebin.com hoch.
-popup.warning.lockedUpFunds=Sie haben eingesperrte Gelder von einem fehlgeschlagenen Handel.\nEingesperrtes Guthaben: {0} \nTx-Adresse der Kaution: {1}\nHandels-ID: {2}.\n\nBitte öffnen Sie ein Support-Ticket indem Sie den Handel unter "\"Ausstehende Händel\" auswählen und \"alt + o\" oder \"option + o\" drücken.
+popup.warning.lockedUpFunds=Sie haben gesperrtes Guthaben aus einem gescheiterten Trade.\nGesperrtes Guthaben: {0} \nEinzahlungs-Tx-Adresse: {1}\nTrade ID: {2}.\n\nBitte öffnen Sie ein Support-Ticket, indem Sie den Trade im Bildschirm "Offene Trades" auswählen und auf \"alt + o\" oder \"option + o\" drücken.
popup.warning.nodeBanned=Einer der {0} Knoten wurde gebannt. Bitte starten Sie die Anwendung neu, um sicher zu sein, nicht mit gebannten Knoten verbunden zu werden.
popup.warning.priceRelay=Preisrelais
@@ -1993,19 +2076,36 @@ popup.shutDownInProgress.msg=Das Herunterfahren der Anwendung kann einige Sekund
popup.attention.forTradeWithId=Der Handel mit der ID {0} benötigt Ihre Aufmerksamkeit
-popup.roundedFiatValues.headline=Neues Privatsphären Feature: Gerundete fiat Beträge
-popup.roundedFiatValues.msg=Um die Privatsphäre Ihres Handels zu erhöhen, wurde der {0} Betrag gerundet.\n\nAbhängig von der Version des Clients, werden Sie Beträge mit Nachkommastellen oder gerundet erhalten.\n\nBeide Beträge erfüllen von nun an das Handelsprotokoll.\n\nBeachten Sie auch, dass die BTC Beträge automatisch angepasst werden, um dem gerundeten fiat Betrag so genau wie möglich übereinzustimmen.
-
popup.info.multiplePaymentAccounts.headline=Mehrere Zahlungskonten verfügbar
popup.info.multiplePaymentAccounts.msg=Für dieses Angebot stehen Ihnen mehrere Zahlungskonten zur Verfügung. Bitte stellen Sie sicher, dass Sie das richtige ausgewählt haben.
-popup.dao.launch.headline=Die gesamte Vision, umgesetzt
-popup.dao.launch.governance.title=Führung der DAO
-popup.dao.launch.governance=Das Handelsnetzwerk von Bisq war bereits dezentralisiert. \nMit der Bisq DAO ist nun auch die Führung von Bisq dezentralisiert und widerstandsfähig gegen Zensur.
-popup.dao.launch.trading.title=Handel
-popup.dao.launch.trading=Handeln Sie BSQ (colored Bitcoin), um an der Steuerung von Bisq teilzunehmen. Sie können BSQ wie jedes andere Asset auf Bisq kaufen und verkaufen.
-popup.dao.launch.cheaperFees.title=Geringere Gebühren
-popup.dao.launch.cheaperFees=Erhalten Sie 90% Rabatt auf Handelsgebühren, wenn Sie BSQ verwenden. Sparen Sie Geld und unterstützen Sie gleichzeitig das Projekt!\n
+popup.news.launch.headline=Zwei wichtige Updates
+popup.news.launch.accountSigning.headline=KONTO-UNTERZEICHNUNG
+popup.news.launch.accountSigning.description=Heben Sie das Fiat-Trade-Limit in Höhe von 0.01 BTC auf, indem Sie BTC von einem unterzeichneten Partner kaufen.
+popup.news.launch.ntp.headline=NEUES TRADE-PROTOKOLL
+popup.news.launch.ntp.description=Das neue 2-stufige Konfliktbewältigungssystem macht Bisq sicherer, skalierbarer und zensurresistenter.
+
+popup.accountSigning.selectAccounts.headline=Zahlungskonten auswählen
+popup.accountSigning.selectAccounts.description=Basierend auf der Zahlungsmethode und dem Zeitpunkt werden alle Zahlungskonten, die mit einem Konfliktfall verbunden sind, bei dem eine Auszahlung an den Käufer erfolgt ist, zur Unterzeichnung ausgewählt.
+popup.accountSigning.selectAccounts.signAll=Alle Zahlungsmethoden unterzeichnen
+popup.accountSigning.selectAccounts.datePicker=Zeitpunkt wählen, bis zu dem die Konten unterzeichnet werden sollen
+
+popup.accountSigning.confirmSelectedAccounts.headline=Ausgewählte Zahlungskonten bestätigen
+popup.accountSigning.confirmSelectedAccounts.description=Basierend auf Ihren Eingaben werden {0} Zahlungskonten ausgewählt.
+popup.accountSigning.confirmSelectedAccounts.button=Zahlungskonten bestätigen
+popup.accountSigning.signAccounts.headline=Unterzeichnung der Zahlungskonten bestätigen
+popup.accountSigning.signAccounts.description=Basierend auf Ihrer Auswahl werden {0} Zahlungskonten unterzeichnet.
+popup.accountSigning.signAccounts.button=Zahlungskonten unterzeichnen
+popup.accountSigning.signAccounts.ECKey=Privaten Vermittler-Schlüssel eingeben
+popup.accountSigning.signAccounts.ECKey.error=Ungültiger Vermittler ECKey
+
+popup.accountSigning.success.headline=Glückwunsch
+popup.accountSigning.success.description=Alle {0} Zahlungskonten wurden erfolgreich unterzeichnet!
+popup.accountSigning.generalInformation=Den Unterzeichnungsstatus aller Ihrer Konten finden Sie im Konto-Bereich.\n\nWeitere Informationen finden Sie unter https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=Eines Ihrer Zahlungskonten wurde von einem Vermittler verifiziert und unterzeichnet. Wenn Sie mit diesem Konto traden, wird das Konto Ihres Trade-Partners nach einem erfolgreichen Trade automatisch unterzeichnet.\n\n{0}
+popup.accountSigning.signedByPeer=Eines Ihrer Zahlungskonten wurde von einem Trade-Partner verifiziert und unterzeichnet. Ihr anfängliches Trade-Limit wird aufgehoben und Sie können in {0} Tagen andere Konten unterzeichnen.\n\n{1}
+popup.accountSigning.peerLimitLifted=Das anfängliche Limit für eines Ihrer Konten wurde aufgehoben.\n\n{0}
+popup.accountSigning.peerSigner=Eines Ihrer Konten ist reif genug, um andere Zahlungskonten zu unterzeichnen, und das anfängliche Limit für eines Ihrer Konten wurde aufgehoben.\n\n{0}
####################################################################
# Notifications
@@ -2071,6 +2171,7 @@ list.currency.editList=Währungsliste bearbeiten
table.placeholder.noItems=Momentan sind keine {0} verfügbar
table.placeholder.noData=Momentan sind keine Daten verfügbar
+table.placeholder.processingData=Datenverarbeitung...
peerInfoIcon.tooltip.tradePeer=Handelspartners
@@ -2093,7 +2194,8 @@ peerInfo.title=Peer-Infos
peerInfo.nrOfTrades=Anzahl abgeschlossener Händel
peerInfo.notTradedYet=Sie haben noch nicht mit diesem Nutzer gehandelt.
peerInfo.setTag=Markierung für diesen Peer setzen
-peerInfo.age=Alter des Zahlungskontos
+peerInfo.age.noRisk=Alter des Zahlungskontos
+peerInfo.age.chargeBackRisk=Zeit seit der Unterzeichnung
peerInfo.unknownAge=Alter unbekannt
addressTextField.openWallet=Ihre Standard-Bitcoin-Wallet öffnen
@@ -2154,7 +2256,7 @@ BTC_REGTEST=Bitcoin-Regtest
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=Bitcoin-DAO-Testnetzwerk (veraltet)
# suppress inspection "UnusedProperty"
-BTC_DAO_BETANET=Bitcoin DAO Betanetz (Bitcoin Hauptnetz)
+BTC_DAO_BETANET=Bisq DAO Betanet (Bitcoin Mainnet)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=Bitcoin DAO Regtest
@@ -2253,6 +2355,7 @@ payment.accepted.banks=Akzeptierte Banken (ID)
payment.mobile=Mobil-Tel.-Nr.
payment.postal.address=Postanschrift
payment.national.account.id.AR=CBU Nummer
+shared.accountSigningState=Konto-Unterzeichnungsstatus
#new
payment.altcoin.address.dyn={0} Adresse
@@ -2261,7 +2364,7 @@ payment.accountNr=Kontonummer
payment.emailOrMobile=E-Mail oder Telefonnr.
payment.useCustomAccountName=Spezifischen Kontonamen nutzen
payment.maxPeriod=Max. erlaubte Handelsdauer
-payment.maxPeriodAndLimit=Max. Handelsdauer: {0} / Max. Handelsgrenze: {1} / Konto-Alter: {2}
+payment.maxPeriodAndLimit=Max. Trade-Dauer : {0} / Max. Kaufen: {1} / Max. Verkauf: {2} / Kontoalter: {3}
payment.maxPeriodAndLimitCrypto=Max. Handelsdauer: {0} / Max. Handelsgrenze: {1}
payment.currencyWithSymbol=Währung: {0}
payment.nameOfAcceptedBank=Name der akzeptierten Bank
@@ -2284,12 +2387,13 @@ payment.moneyGram.info=Wenn MoneyGram verwendet wird, muss der BTC Käufer die M
payment.westernUnion.info=Wenn Western Union verwendet wird, muss der BTC Käufer die MTCN (Tracking-Nummer) und ein Foto der Quittung per E-Mail an den BTC-Verkäufer senden. Die Quittung muss den vollständigen Namen, die Stadt, das Land des Verkäufers und den Betrag deutlich zeigen. Der Käufer bekommt die E-Mail-Adresse des Verkäufers im Handelsprozess angezeigt.
payment.halCash.info=Bei Verwendung von HalCash muss der BTC-Käufer dem BTC-Verkäufer den HalCash-Code per SMS vom Mobiltelefon senden.\n\nBitte achten Sie darauf, dass Sie den maximalen Betrag, den Sie bei Ihrer Bank mit HalCash versenden dürfen, nicht überschreiten. Der Mindestbetrag pro Auszahlung beträgt 10 EUR und der Höchstbetrag 600 EUR. Bei wiederholten Abhebungen sind es 3000 EUR pro Empfänger pro Tag und 6000 EUR pro Empfänger pro Monat. Bitte überprüfen Sie diese Limits bei Ihrer Bank, um sicherzustellen, dass sie die gleichen Limits wie hier angegeben verwenden.\n\nDer Auszahlungsbetrag muss ein Vielfaches von 10 EUR betragen, da Sie keine anderen Beträge an einem Geldautomaten abheben können. Die Benutzeroberfläche beim Erstellen und Annehmen eines Angebots passt den BTC-Betrag so an, dass der EUR-Betrag korrekt ist. Sie können keinen marktbasierten Preis verwenden, da sich der EUR-Betrag bei sich ändernden Preisen ändern würde.\n\nIm Streitfall muss der BTC-Käufer den Nachweis erbringen, dass er die EUR geschickt hat.
payment.limits.info=Beachten Sie bitte, dass alle Banküberweisungen ein gewisses Rückbuchungsrisiko mitbringen.\n\nUm diese Risiko zu minimieren, setzt Bisq vor-Handel Grenzen basierend auf zwei Faktoren:\n\n1. Das erwartete Rückbuchungsrisiko für die genutzte Zahlungsmethode\n2. Das Alter des Kontos für diese Zahlungsmethode\n\nDas Konto, das Sie jetzt erstellen, ist neu und sein Alter ist null. So wie Ihr Konto über zwei Monate altert, wächst auch Ihre vor-Handel Grenze:\n\n● Während des 1sten Monats, ist Ihre vor-Handel Grenze {0}\n● Während des 2ten Monats, ist Ihre vor-Handel Grenze {1}\n● Nach dem 2ten Monat, ist Ihre vor-Handel Grenze {2}\n\nBeachten Sie bitte, dass es keine Grenze, wie oft Sie handeln können.
+payment.limits.info.withSigning=Um das Rückbuchungsrisiko zu begrenzen, setzt Bisq Limits für den Kauf pro Trade fest, die auf den folgenden 2 Faktoren basieren:\n\n1. Allgemeines Rückbuchungsrisiko für die Zahlungsmethode\n2. Status der Kontounterzeichnung\n\nDieses Zahlungskonto, das Sie gerade erstellt haben, birgt ein gewisses Rückbuchungsrisiko und ist noch nicht von einem Vermittler oder vertrauenswürdigen Partner unterzeichnet, so dass es auf den Kauf von {0} pro Trade beschränkt ist. Nach der Unterzeichnung erhöhen sich die Kauflimits wie folgt:\n\n● Vor der Unterzeichnung und bis zu 30 Tage nach der Unterzeichnung beträgt Ihr Kauflimit pro Trade {0}.\n● 30 Tage nach der Unterzeichnung wird Ihr Kauflimit pro Trade {1} betragen.\n● 60 Tage nach der Unterzeichnung wird Ihr Kauflimit pro Trade {2} betragen.\n\nVerkaufslimits sind von der Kontounterzeichnung nicht betroffen und steigen lediglich mit zunehmendem Alter des Kontos. Weitere Informationen finden Sie unter https://docs.bisq.network/payment-methods#account-signing.\n\nEs gibt keine Begrenzung der Anzahl der Trades, die Sie tätigen können.
payment.cashDeposit.info=Bitte bestätigen Sie, dass Ihre Bank Bareinzahlungen in Konten von anderen Personen erlaubt. Zum Beispiel werden diese Einzahlungen bei der Bank of America und Wells Fargo nicht mehr erlaubt.
payment.revolut.info=Bitte vergewissern sie sich, dass die Telefonnummer die sie verwendet haben auch bei Revolut registriert ist. Ansonsten kann der BTC-Käufer ihnen den Betrag nicht überweisen.
-payment.usPostalMoneyOrder.info=Zahlungsanweisungen sind eine der privateren, auf Bisq verfügbaren, Kaufmethoden.\n\nBitte beachten Sie potenziell erhöhte Risiken die mit ihrer Nutzung verbunden sind. Bisq übernimmt keine Haftung, fals eine gesendete Zahlungsanweisung gestohlen wird, und der Vermittler wird in solchen Fällen die BTC an den Sender der Zahlungsanweisung vergeben, falls dieser Tracking-Informationen und Quittungen vorlegen kann. Es kann ratsam sein, dass der Sender den Namen des BTC-Verkäufers in die Zahlungsanweisung schreibt, um das Risiko zu minimieren, dass die Zahlungsanweisung von jemand anders eingelöst wird.
+payment.usPostalMoneyOrder.info=Zahlungsanweisungen sind eine der privateren Fiat-Kaufmethoden, die auf Bisq verfügbar sind.\n\nBitte beachten Sie jedoch die mit der Verwendung verbundenen potenziell erhöhten Risiken. Bisq trägt keine Verantwortung für den Fall, dass eine gesendete Zahlungsanweisung gestohlen wird, und der Mediator oder Vermittler wird in solchen Fällen die BTC an den Absender der Zahlungsanweisung vergeben, sofern er Trackinginformationen und Belege vorlegen kann. Es kann für den Absender ratsam sein, den Namen des BTC-Verkäufers auf die Zahlungsanweisung zu schreiben, um das Risiko zu minimieren, dass die Zahlungsanweisung von jemand anderem eingelöst wird.
payment.f2f.contact=Kontaktinformationen
payment.f2f.contact.prompt=Wie möchten Sie vom Handeslpartner kontaktiert werden? (E-Mailadresse, Telefonnummer,...)
@@ -2299,11 +2403,15 @@ payment.f2f.optionalExtra=Freiwillige zusätzliche Informationen
payment.f2f.extra=Zusätzliche Informationen
payment.f2f.extra.prompt=Der Ersteller kann "Geschäftsbedingungen" festlegen oder öffentliche Kontaktinformationen hinterlegen. Diese werden mit dem Angebot angezeigt.
-payment.f2f.info="Angesicht zu Angesicht" Händel haben andere Regeln und Risiken, als online Transaktionen.\n\nDie wichtigsten Unterschiede sind:\n● Die Händler müssen einen Treffpunkt und eine Uhrzeit über die bereitgestellten Kontaktinformationen ausmachen.\n● Die Händler müssen Ihre Laptops mitbringen und die "Zahlung gesendet" und "Zahlung erhalten" Bestätigungen beim Treffpunkt machen.\n● Wenn ein Händler besondere "Geschäftsbedingungen" hat, muss er diese im "Zusätzluiche Informationen" Textfeld im Konto eintragen.\n● Durch Annahme eines Angebots stimmt der Nehmer die "Geschäftsbedingungen" des Verkäufers an.\n● Im Fall eines Konflikts,kann der Vermittler nicht viel helfen, da es schwierig ist unverfälschte Beweise zu bekommen, was beim Treffen vorgefallen ist. In so einem Fall können die BTC Gelder für immer eingeschlossen werden oder bis die Handelspartner sich einigen.\n\nUm sicher zu gehen, dass Sie den Unterschied von "Angesicht zu Angesicht" Händel verstehen, lesen Sie bitte die Anweisungen und Empfehlungen auf: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
+payment.f2f.info=Persönliche 'Face to Face' Trades haben unterschiedliche Regeln und sind mit anderen Risiken verbunden als Online-Transaktionen.\n\nDie Hauptunterschiede sind:\n● Die Trading Partner müssen Informationen über den Ort und die Uhrzeit des Treffens unter Verwendung ihrer Kontaktdaten austauschen.\n● Die Trading Partner müssen ihre Laptops mitbringen und die Bestätigung der "gesendeten Zahlung" und der "erhaltenen Zahlung" am Treffpunkt vornehmen.\n● Wenn ein Anbieter spezielle "Allgemeine Geschäftsbedingungen" hat, muss er diese im Textfeld "Zusatzinformationen" des Kontos angeben.\n● Mit der Annahme eines Angebots erklärt sich der Käufer mit den vom Anbieter angegebenen "Allgemeinen Geschäftsbedingungen" einverstanden.\n● Im Konfliktfall kann der Mediator oder Vermittler nicht viel tun, da es in der Regel schwierig ist, einen Originalitätsnachweis über das Geschehen in dem Treffen zu erhalten. In solchen Fällen können die BTC-Fonds auf unbestimmte Zeit oder bis zu einer Einigung der Trading Partner gesperrt werden.\n\nUm sicherzustellen, dass Sie die Unterschiede zu den persönlichen 'Face to Face' Trades vollständig verstehen, lesen Sie bitte die Anweisungen und Empfehlungen unter: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
payment.f2f.info.openURL=Webseite öffnen
payment.f2f.offerbook.tooltip.countryAndCity=Land und Stadt: {0} / {1}
payment.f2f.offerbook.tooltip.extra=Zusätzliche Informationen: {0}
+payment.japan.bank=Bank
+payment.japan.branch=Filiale
+payment.japan.account=Konto
+payment.japan.recipient=Name
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -2317,6 +2425,7 @@ CASH_DEPOSIT=Cash Deposit
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=Angesicht zu Angesicht (persönlich)
+JAPAN_BANK=Japan Bank Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=Inlandsbanken
@@ -2334,6 +2443,8 @@ MONEY_GRAM_SHORT=MoneyGram
WESTERN_UNION_SHORT=Western Union
# suppress inspection "UnusedProperty"
F2F_SHORT=A2A
+# suppress inspection "UnusedProperty"
+JAPAN_BANK_SHORT=Japan Furikomi
# Do not translate brand names
# suppress inspection "UnusedProperty"
@@ -2495,7 +2606,12 @@ validation.pattern=Die Eingabe muss im Format {0} sein
validation.noHexString=Die Eingabe ist nicht im HEX-Format.
validation.advancedCash.invalidFormat=Gültige E-Mail-Adresse oder Wallets ID vom Format "X000000000000" benötigt
validation.invalidUrl=Dies ist keine gültige URL
-validation.mustBeDifferent=Ihre Eingabe muss vom momentanen Wert abweichen
+validation.mustBeDifferent=Ihre Eingabe muss vom aktuellen Wert abweichen
validation.cannotBeChanged=Parameter kann nicht geändert werden
validation.numberFormatException=Zahlenformat Ausnahme {0}
validation.mustNotBeNegative=Eingabe darf nicht negativ sein
+validation.phone.missingCountryCode=Es wird ein zweistelliger Ländercode benötigt, um die Telefonnummer zu bestätigen
+validation.phone.invalidCharacters=Telefonnummer {0} enthält ungültige Zeichen
+validation.phone.insufficientDigits=Nicht genügend Ziffern in {0} für eine gültige Telefonnummer
+validation.phone.tooManyDigits=Zu viele Ziffern in {0} für eine gültige Telefonnummer
+validation.phone.invalidDialingCode=Die Ländervorwahl in der Nummer {0} ist für das Land {1} ungültig. Die richtige Vorwahl ist {2}.
diff --git a/core/src/main/resources/i18n/displayStrings_el.properties b/core/src/main/resources/i18n/displayStrings_el.properties
index 0441cce7b3..573944fa59 100644
--- a/core/src/main/resources/i18n/displayStrings_el.properties
+++ b/core/src/main/resources/i18n/displayStrings_el.properties
@@ -62,6 +62,10 @@ shared.priceWithCur=Τιμή σε {0}
shared.priceInCurForCur=Τιμή σε {0} για 1 {1}
shared.fixedPriceInCurForCur=Καθορισμένη τιμή σε {0} για 1 {1}
shared.amount=Ποσό
+shared.txFee=Προμήθεια συναλλαγής
+shared.makerFee=Προμήθεια maker
+shared.buyerSecurityDeposit=Κατάθεση αγοραστή
+shared.sellerSecurityDeposit=Κατάθεση πωλητή
shared.amountWithCur=Ποσό σε {0}
shared.volumeWithCur=Όγκος σε {0}
shared.currency=Νόμισμα
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=Ξαναστείλε επιβεβαίωση
shared.exportCSV=Export to csv
shared.exportJSON=Export to JSON
shared.noDateAvailable=Δεν υπάρχουν διαθέσιμα δεδομένα
-shared.arbitratorsFee=Αμοιβή διαμεσολαβητή
shared.noDetailsAvailable=Δεν υπάρχουν διαθέσιμα στοιχεία
shared.notUsedYet=Αχρησιμοποίητο προς το παρόν
shared.date=Ημερομηνία
@@ -149,11 +152,11 @@ shared.save=Αποθήκευση
shared.onionAddress=Διεύθυνση δικτύου onion
shared.supportTicket=αίτημα υποστήριξης
shared.dispute=διένεξη
+shared.mediationCase=υπόθεση διαμεσολάβησης
shared.seller=πωλητής
shared.buyer=αγοραστής
shared.allEuroCountries=Όλες οι χώρες ευρωζώνης
shared.acceptedTakerCountries=Αποδεκτές χώρες του/της taker
-shared.arbitrator=Επιλεγμένος διαμεσολαβητής
shared.tradePrice=Τιμή συναλλαγής
shared.tradeAmount=Ποσό συναλλαγής
shared.tradeVolume=Όγκος συναλλαγής
@@ -203,6 +206,15 @@ shared.proposal=Πρόταση
shared.votes=Ψήφοι
shared.learnMore=Μάθε περισσότερα
shared.dismiss=Dismiss
+shared.selectedArbitrator=Επιλεγμένος διαμεσολαβητής
+shared.selectedMediator=Επιλεγμένος διαμεσολαβητής
+shared.selectedRefundAgent=Επιλεγμένος διαμεσολαβητής
+shared.mediator=Διαμεσολαβητής
+shared.arbitrator=Διαμεσολαβητής
+shared.refundAgent=Διαμεσολαβητής
+shared.refundAgentForSupportStaff=Refund agent
+shared.delayedPayoutTxId=Ταυτότητα συναλλαγής επιστροφής εγγύησης
+
####################################################################
# UI views
@@ -244,7 +256,7 @@ mainView.footer.btcInfo.synchronizingWith=Συγχρονισμός με
mainView.footer.btcInfo.synchronizedWith=Συγχρονισμένο με
mainView.footer.btcInfo.connectingTo=Σύνδεση με
mainView.footer.btcInfo.connectionFailed=σύνδεση απέτυχε
-mainView.footer.p2pInfo=P2P network peers: {0}
+mainView.footer.p2pInfo=Bisq network peers: {0}
mainView.footer.daoFullNode=Πλήρης κόμβος DAO
mainView.bootstrapState.connectionToTorNetwork=(1/4) Σύνδεση με δίκτυο Tor...
@@ -254,10 +266,10 @@ mainView.bootstrapState.initialDataReceived=(4/4) Αρχικά δεδομένα
mainView.bootstrapWarning.noSeedNodesAvailable=Δεν υπάρχουν διαθέσιμοι seed κόμβοι
mainView.bootstrapWarning.noNodesAvailable=Δεν υπάρχουν διαθέσιμοι seed κόμβοι και peers
-mainView.bootstrapWarning.bootstrappingToP2PFailed=Αποτυχία πρόσδεσης στο δίκτυο P2P
+mainView.bootstrapWarning.bootstrappingToP2PFailed=Αποτυχία πρόσδεσης στο δίκτυο Bisq
mainView.p2pNetworkWarnMsg.noNodesAvailable=Δεν υπάρχουν διαθέσιμοι seed κόμβοι ή persisted peers προς αίτηση δεδομένων.\nΈλεγξε τη σύνδεση δικτύου ή επανεκκίνησε την εφαρμογή.
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Σύνδεση με δίκτυο P2P απέτυχε (σφάλμα: {0}).\nΈλεγξε τη σύνδεση δικτύου ή επανεκκίνησε την εφαρμογή.
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Σύνδεση με δίκτυο Bisq απέτυχε (σφάλμα: {0}).\nΈλεγξε τη σύνδεση δικτύου ή επανεκκίνησε την εφαρμογή.
mainView.walletServiceErrorMsg.timeout=Αποτυχία σύνδεσης στο δίκτυο Bitcoin εξαιτίας λήξης χρονικού ορίου.
mainView.walletServiceErrorMsg.connectionError=Αποτυχία σύνδεσης στο δίκτυο Bitcoin εξαιτίας σφάλματος: {0}
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=Κλείσιμο:
market.trades.tooltip.candle.high=Μέγιστη:
market.trades.tooltip.candle.low=Ελάχιστη:
market.trades.tooltip.candle.average=Μέση τιμή:
+market.trades.tooltip.candle.median=Median:
market.trades.tooltip.candle.date=Ημερομηνία:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=Αποδεκτές χώρες έδρας τ
offerbook.availableOffers=Διαθέσιμες προσφορές
offerbook.filterByCurrency=Φιλτράρισμα κατά νόμισμα
offerbook.filterByPaymentMethod=Φιλτράρισμα κατά μέθοδο πληρωμής
+offerbook.timeSinceSigning=Παρελθών χρόνος από επικύρωση
+offerbook.timeSinceSigning.info=Αυτός ο λογαριασμός επαληθεύτηκε και {0}
+offerbook.timeSinceSigning.info.arbitrator=επικυρωμένος από διαιτητή και μπορεί να επικυρώνει ομότιμους λογαριασμούς
+offerbook.timeSinceSigning.info.peer=υπογράφτηκε από συναλλασσόμενο, αναμένεται η άρση περιορισμών
+offerbook.timeSinceSigning.info.peerLimitLifted=επικυρώθηκε από συναλλασσόμενο και αναιρέθηκαν οι περιορισμοί
+offerbook.timeSinceSigning.info.signer=επικυρωμένος από ομότιμο και μπορεί να επικυρώνει ομότιμους λογαριασμούς (έγινε άρση περιορισμών)
+offerbook.timeSinceSigning.daysSinceSigning={0} ημέρες
+offerbook.timeSinceSigning.daysSinceSigning.long={0} από επικύρωση
+
+offerbook.timeSinceSigning.help=Αφού ολοκληρώσεις επιτυχώς μια συναλλαγή με έναν συναλλασσόμενο που έχει επικυρωμένο λογαριασμό, ο λογαριασμός σου θα επικυρωθεί.\n{0} ημέρες αργότερα, το αρχικό όριο των {1} αίρεται, και ο λογαριασμός σου μπορεί να επικυρώνει λογαριασμούς άλλων συναλλασσόμενων.
+offerbook.timeSinceSigning.notSigned=Ανεπικύρωτο προς το παρόν
+offerbook.timeSinceSigning.notSigned.noNeed=Μη διαθέσιμο
+shared.notSigned=Ο λογαριασμός δεν έχει επικυρωθεί προς το παρόν
+shared.notSigned.noNeed=This account type doesn't use signing
offerbook.nrOffers=Πλήθος προσφορών: {0}
offerbook.volume={0} (ελάχιστο - μέγιστο)
@@ -345,14 +372,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=Δεν έχεις λογαρι
offerbook.warning.noMatchingAccount.headline=Δεν βρέθηκε λογαριασμός συναλλαγών που να ταιριάζει.
offerbook.warning.noMatchingAccount.msg=Για να αποδεχτείς αυτή την προσφορά θα πρέπει να δημιουργήσεις λογαριασμό για τη συγκεκριμένη μέθοδο πληρωμών.\n\nΕπιθυμείς να το κάνεις τώρα;
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=Αυτή η προσφορά δεν μπορεί να γίνει αποδεκτή λόγω περιορισμών ασφάλειας, οι οποίοι βασίζονται στα ακόλουθα κριτήρια:\n- Ο λογαριασμός πληρωμών του maker δημιουργήθηκε μετά την 1η Μαρτίου 2019\n- Το ελάχιστο ποσό συναλλαγής είναι άνω του 0.01 BTC\n- Η μέθοδος πληρωμής της προσφοράς θεωρείται ανασφαλής λόγω πιθανού αντιλογισμού χρέωσης.\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=Αυτή η προσφορά δεν μπορεί να γίνει αποδεκτή λόγω περιορισμών ασφάλειας, οι οποίοι βασίζονται στα ακόλουθα κριτήρια:\n- Ο λογαριασμός πληρωμών σου δημιουργήθηκε μετά την 1η Μαρτίου 2019\n- Το ελάχιστο ποσό συναλλαγής είναι άνω του 0.01 BTC\n- Η μέθοδος πληρωμής της προσφοράς θεωρείται ανασφαλής λόγω πιθανού αντιλογισμού χρέωσης.\n\n{0}
+offerbook.warning.newVersionAnnouncement=Σε αυτή την έκδοση του λογισμικού οι συναλλασσόμενοι μπορούν να επαληθεύουν και να επικυρώνουν τους μεταξύ τους λογαριασμούς πληρωμών, ώστε να δημιουργήσουν ένα δίκτυο έμπιστων λογαριασμών πληρωμών.\n\nΜετά από την επιτυχή συναλλαγή με έναν συναλλασσόμενο με επαληθευμένο λογαριασμό πληρωμών, ο λογαριασμός πληρωμών σου θα επικυρωθεί και οι περιορισμοί συναλλαγών θα αναιρεθούν μετά από συγκεκριμένο χρονικό διάστημα (η διάρκεια του διαστήματος εξαρτάται από τη μέθοδο επαλήθευσης).\n\nΓια περισσότερες πληροφορίες σχετικά με την επικύρωση λογαριασμών, δες την τεκμηρίωση στην ιστοσελίδα https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=Απαιτείται να ενεργοποιήσουμε αυτόν τον περιορισμό ως ένα βραχυπρόθεσμο μέτρο αυξημένης ασφάλειας.\n\nΗ επόμενη έκδοση της εφαρμογής θα παρέχει πιο εύρωστα εργαλεία προστασίας, ώστε οι προσφορές με αυτό το προφίλ να μπορούν να χρησιμοποιηθούν ξανά.
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=Το επιτρεπόμενο ποσό συναλλαγής περιορίζεται στο 0.01 BTC λόγω περιορισμών ασφάλειας, οι οποίοι βασίζονται στα ακόλουθα κριτήρια:\n- Ο λογαριασμός πληρωμών του αγοραστή δημιουργήθηκε μετά την 1η Μαρτίου 2019\n- Η μέθοδος πληρωμής της προσφοράς θεωρείται ανασφαλής λόγω πιθανού αντιλογισμού χρέωσης.\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=Το επιτρεπόμενο ποσό συναλλαγής περιορίζεται στο 0.01 BTC λόγω περιορισμών ασφάλειας, οι οποίοι βασίζονται στα ακόλουθα κριτήρια:\n- Ο λογαριασμός πληρωμών σου δημιουργήθηκε μετά την 1η Μαρτίου 2019\n- Η μέθοδος πληρωμής της προσφοράς θεωρείται ανασφαλής λόγω πιθανού αντιλογισμού χρέωσης.\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=Το επιτρεπόμενο ποσό συναλλαγής περιορίζεται σε {0} λόγω περιορισμών ασφάλειας, οι οποίοι βασίζονται στα ακόλουθα κριτήρια:\n- Ο λογαριασμός πληρωμών του αγοραστή δεν έχει επικυρωθεί από μία διαιτητή ή μία συναλλασσόμενη\n- Ο χρόνος από την επικύρωση του λογαριασμού του αγοραστή δεν είναι τουλάχιστον 30 ημέρες\n- Η μέθοδος πληρωμής της προσφοράς θεωρείται ανασφαλής λόγω πιθανού αντιλογισμού χρέωσης.\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=Το επιτρεπόμενο ποσό συναλλαγής περιορίζεται σε {0} λόγω περιορισμών ασφάλειας, οι οποίοι βασίζονται στα ακόλουθα κριτήρια:\n- Ο λογαριασμός σου δεν έχει επικυρωθεί από μία διαιτητή ή μία συναλλασσόμενη\n- Ο χρόνος από την επικύρωση του λογαριασμού σου δεν είναι τουλάχιστον 30 ημέρες\n- Η μέθοδος πληρωμής της προσφοράς θεωρείται ανασφαλής λόγω πιθανού αντιλογισμού χρέωσης.\n\n{1}
offerbook.warning.wrongTradeProtocol=Αυτή η προσφορά απαιτεί διαφορετική έκδοση πρωτοκόλλου από αυτήν που χρησιμοποιείται στη δική σου έκδοση λογισμικού.\n\nΈλεγξε αν έχεις εγκατεστημένη την τελευταία έκδοση, αν ναι, τότε ο χρήστης που δημιούργησε την προσφορά έχει παλαιότερη έκδοση.\n\nΣυναλλαγές ανάμεσα σε χρήστες με ασύμβατες εκδόσεις πρωτοκόλλου είναι αδύνατες.
offerbook.warning.userIgnored=Έχεις προσθέσει τη διεύθυνση onion αυτού του χρήστη στη λίστα αγνόησης.
@@ -516,8 +541,8 @@ portfolio.pending.step3_seller.confirmPaymentReceived=Επιβεβαίωσε λ
portfolio.pending.step5.completed=Ολοκληρώθηκε
portfolio.pending.step1.info=Η κατάθεση κοινοποιήθηκε.\nΟ {0} πρέπει να περιμένει για τουλάχιστον μία επιβεβαίωση στο blockchain πριν ξεκινήσει την πληρωμή.
-portfolio.pending.step1.warn=Η κατάθεση δεν έχει επιβεβαιωθεί ακόμα.\nΑυτό συμβαίνει σε σπάνιες περιπτώσεις όπου οι προμήθειες/αμοιβές που θέτει ένας από τους συναλλασσόμενους σε εξωτερικό πορτοφόλι είναι πολύ χαμηλές.
-portfolio.pending.step1.openForDispute=Η κατάθεση δεν έχει ακόμα επιβεβαιωθεί.\nΑυτό συμβαίνει σε σπάνιες περιπτώσεις όπου η προμήθεια ενός εκ των δύο συναλλασσομένων από το εξωτερικό πορτοφόλι είναι πολύ χαμηλή.\nΗ μέγιστη χρονική περίοδος για τη συναλλαγή έχει παρέλθει.\n\nΜπορείς να περιμένεις ή επικοινώνησε με τον διαμεσολαβητή για να ξεκινήσει η επίλυση διένεξης.
+portfolio.pending.step1.warn=Η κατάθεση δεν έχει επιβεβαιωθεί ακόμα. Αυτό συμβαίνει σε σπάνιες περιπτώσεις όπου οι προμήθειες/αμοιβές που θέτει ένας από τους συναλλασσόμενους σε εξωτερικό πορτοφόλι είναι πολύ χαμηλές.
+portfolio.pending.step1.openForDispute=Η κατάθεση δεν έχει ακόμα επιβεβαιωθεί. Μπορείς να περιμένεις ή επικοινώνησε με τον διαμεσολαβητή για βοήθεια.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=Η συναλλαγή έχει λάβει τουλάχιστον μία επιβεβαίωση στο blockchain.\n(Αν θέλεις, μπορείς να περιμένεις για περισσότερες επιβεβαιώσεις - 6 επιβεβαιώσεις θεωρούνται εξαιρετικά ασφαλείς).\n\n
@@ -535,8 +560,10 @@ portfolio.pending.step2_buyer.altcoin=Μετάφερε από το εξωτερ
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=Κατευθύνσου σε τραπεζικό κατάστημα και πλήρωσε {0} στον πωλητή BTC.\n\n
portfolio.pending.step2_buyer.cash.extra=ΣΗΜΑΝΤΙΚΗ ΑΠΑΙΤΗΣΗ:\nΑφού ολοκληρώσεις την πληρωμή γράψε στην έντυπη απόδειξη: NO REFUNDS.\nΣτη συνέχεια σκίσε την απόδειξη σε 2 κομμάτια, φωτογράφισέ τη και στείλε τη φωτογραφία στη διεύθυνση email του πωλητή BTC.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=Πλήρωσε {0} στον πωλητή BTC μέσω MoneyGram.\n\n
portfolio.pending.step2_buyer.moneyGram.extra=Αφού ολοκληρώσεις την πληρωμή, στείλε τον αριθμό Έγκρισης (Authorisation) και μία φωτογραφία της απόδειξης μέσω email στον πωλητή BTC.\nΣτην απόδειξη θα πρέπει να διακρίνεται καθαρά το πλήρες όνομα του πωλητή, η χώρα, η πόλη και το ποσό. Το email του πωλητή είναι: {0}.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=Πλήρωσε {0} στον πωλητή BTC μέσω Western union.\n\n
portfolio.pending.step2_buyer.westernUnion.extra=Αφού ολοκληρώσεις την πληρωμή, στείλε τον αριθμό MTCN (αριθμός εντοπισμού) και μία φωτογραφία της απόδειξης μέσω email στον πωλητή BTC.\nΣτην απόδειξη θα πρέπει να διακρίνεται καθαρά το πλήρες όνομα του πωλητή, η πόλη, η χώρα και το ποσό. Το email του πωλητή είναι: {0}.
@@ -544,14 +571,15 @@ portfolio.pending.step2_buyer.westernUnion.extra=Αφού ολοκληρώσει
portfolio.pending.step2_buyer.postal=Στείλε {0} μέσω \"US Postal Money Order\" στον πωλητή BTC.\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.bank=Συνδέσου στον e-banking λογαριασμό σου και πλήρωσε {0} στον BTC πωλητή.\n\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=Επικοινώνησε με τον πωλητή BTC μέσω του διαθέσιμου αριθμού και κανόνισε συνάντηση για να πληρώσεις {0}.\n\n
portfolio.pending.step2_buyer.startPaymentUsing=Ξεκίνα την πληρωμή με χρήση {0}
portfolio.pending.step2_buyer.amountToTransfer=Ποσό προς μεταφορά
portfolio.pending.step2_buyer.sellersAddress=Διεύθυνση {0} πωλητή
portfolio.pending.step2_buyer.buyerAccount=Λογαριασμός σου που θα χρησιμοποιηθεί για πληρωμές
portfolio.pending.step2_buyer.paymentStarted=Η πληρωμή έχει ξεκινήσει
-portfolio.pending.step2_buyer.warn=Δεν έχεις κάνει την πληρωμή {0}!\nΤονίζουμε πως η συναλλαγή θα πρέπει να έχει ολοκληρωθεί μέχρι {1}, διαφορετικά θα διερευνηθεί από τον διαμεσολαβητή.
-portfolio.pending.step2_buyer.openForDispute=Δεν ολοκλήρωσες την πληρωμή σου!\nΗ μέγιστη χρονική περίοδος για αυτή τη συναλλαγή παρήλθε.\n\nΕπικοινώνησε με τον διαμεσολαβητή ώστε να επιλυθεί η διένεξη.
+portfolio.pending.step2_buyer.warn=Δεν έχεις κάνει ακόμα την πληρωμή {0}!\nΤονίζουμε πως η συναλλαγή θα πρέπει να έχει ολοκληρωθεί μέχρι {1}.
+portfolio.pending.step2_buyer.openForDispute=Δεν ολοκλήρωσες την πληρωμή σου!\nΗ μέγιστη χρονική περίοδος για αυτή τη συναλλαγή παρήλθε.\n\nΕπικοινώνησε με τον διαμεσολαβητή για βοήθεια.
portfolio.pending.step2_buyer.paperReceipt.headline=Έστειλες την έντυπη απόδειξη στον πωλητή BTC;
portfolio.pending.step2_buyer.paperReceipt.msg=Μην ξεχνάς:\nΠρέπει να γράψεις στην έντυπη απόδειξη: NO REFUNDS.\nΣτη συνέχεια σκίσε την απόδειξη σε 2 κομμάτια, φωτογράφισέ τη και στείλε τη φωτογραφία στη διεύθυνση email του πωλητή BTC.
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=Απόστειλε αριθμό Έγκρισης (Authorisation) και απόδειξη
@@ -569,7 +597,11 @@ portfolio.pending.step2_seller.waitPayment.headline=Αναμονή για την
portfolio.pending.step2_seller.f2fInfo.headline=Πληροφορίες επικοινωνίας αγοραστή
portfolio.pending.step2_seller.waitPayment.msg=Η κατάθεση έχει τουλάχιστον μία επιβεβαίωση στο blockchain.\nΠρέπει να περιμένεις μέχρι να ξεκινήσει ο αγοραστής BTC την πληρωμή {0}.
portfolio.pending.step2_seller.warn=Ο αγοραστής BTC δεν έχει κάνει ακόμα την πληρωμή {0}.\nΠρέπει να περιμένεις μέχρι να ξεκινήσει την πληρωμή.\nΑν η συναλλαγή δεν ολοκληρωθεί μέχρι την {1}, ο διαμεσολαβητής θα το διερευνήσει.
-portfolio.pending.step2_seller.openForDispute=Ο αγοραστής BTC δεν ξεκίνησε τη διαδικασία πληρωμής!\nΗ μέγιστη χρονική περίοδος συναλλαγής παρήλθε.\nΜπορείς να περιμένεις περισσότερο και να δώσεις επιπλέον χρόνο στον έτερο συναλλασσόμενο ή μπορείς να επικοινωνήσεις με τον διαμεσολαβητή και να ξεκινήσεις επίλυση διένεξης.
+portfolio.pending.step2_seller.openForDispute=Ο αγοραστής BTC δεν ξεκίνησε τη διαδικασία πληρωμής!\nΗ μέγιστη χρονική περίοδος συναλλαγής παρήλθε.\nΜπορείς να περιμένεις περισσότερο και να δώσεις επιπλέον χρόνο στον έτερο συναλλασσόμενο ή μπορείς να επικοινωνήσεις με το διαμεσολαβητή για βοήθεια.
+
+tradeChat.chatWindowTitle=Παράθυρο επικοινωνίας για συναλλαγή με ταυτότητα "{0}"
+tradeChat.openChat=Άνοιξε παράθυρο επικοινωνίας
+tradeChat.rules=Μπορείς να επικοινωνήσεις με τον έτερο συναλλασσόμενο για να επιλύσετε πιθανά προβλήματα αυτής της συναλλαγής.\nΔεν είναι υποχρεωτικό να απαντήσεις στη συνομιλία.\nΑν ένας εκ των συναλλασσόμενων παραβεί κάποιον από τους κάτωθι κανόνες, άνοιξε μία επίλυση διένεξης και ανάφερέ το στον διαμεσολαβητή ή τον διαιτητή.\n\nΚανόνες συνομιλίας:\n\t● Μην αποστείλεις οποιοδήποτε κόμβο ιστοσελίδας (κίνδυνος κακόβουλου λογισμικού). Μπορείς να αποστείλεις την ταυτότητα συναλλαγής και το όνομα του εξερευνητή blockchain.\n\t● Μην αποστείλεις τις λέξεις seed, το προσωπικό κλειδί, κωδικούς ή οποιαδήποτε άλλη ευαίσθητη πληροφορία!\n\t● Μην ενθαρρύνεις τις συναλλαγές εκτός του Bisq (ανασφαλής).\n\t● Μην εμπλακείς σε οποιαδήποτε μορφή απόπειρας απάτης μέσω κοινωνικής μηχανικής.\n\t● Αν μία έτερη συναλλασσόμενη δεν αποκρίνεται και προτιμά να μην επικοινωνεί μέσω συνομιλίας, σεβάσου την επιλογή της.\n\t● Περιόρισε το θέμα της συνομιλίας γύρω από τη συναλλαγή. Αυτή η συνομιλία δεν αποτελεί εφαρμογή ανταλλαγής μηνυμάτων ή troll-box.\n\t● Κράτησε τη συνομιλία φιλική και με σεβασμό.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=Ακαθόριστο
@@ -578,7 +610,7 @@ message.state.SENT=Μήνυμα εστάλη
# suppress inspection "UnusedProperty"
message.state.ARRIVED=Μήνυμα αφίχθη στον συναλλασσόμενο
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=Το μήνυμα αποθηκεύτηκε στο γραμματοκιβώτιο
+message.state.STORED_IN_MAILBOX=Μήνυμα πληρωμής απεστάλη αλλά δεν έχει παραληφθεί από τον έτερο συναλλασσόμενο
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=Ο συναλλασσόμενος επιβεβαίωσε την παραλαβή του μηνύματος
# suppress inspection "UnusedProperty"
@@ -589,22 +621,23 @@ portfolio.pending.step3_buyer.wait.info=Αναμονή για την επιβε
portfolio.pending.step3_buyer.wait.msgStateInfo.label=Κατάσταση μηνύματος έναρξης πληρωμής
portfolio.pending.step3_buyer.warn.part1a=στο blockchain {0}
portfolio.pending.step3_buyer.warn.part1b=στον πάροχο υπηρεσιών πληρωμής (π.χ. τράπεζα)
-portfolio.pending.step3_buyer.warn.part2=Ο πωλητής BTC δεν έχει επιβεβαιώσει ακόμα την πληρωμή σου!\nΈλεγξε {0} αν υπήρξε επιτυχής πληρωμή.\nΑν ο πωλητής BTC δεν επιβεβαιώσει την απόδειξη της πληρωμής σου μέχρι την {1}, η συναλλαγή θα διερευνηθεί από τον διαμεσολαβητή.
-portfolio.pending.step3_buyer.openForDispute=Ο πωλητής BTC δεν επιβεβαίωσε την πληρωμή σου!\nΗ μέγιστη χρονική περίοδος συναλλαγής παρήλθε.\nΜπορείς να περιμένεις περισσότερο και να δώσεις επιπλέον χρόνο στον έτερο συναλλασσόμενο ή μπορείς να επικοινωνήσεις με τον διαμεσολαβητή και να ξεκινήσεις επίλυση διένεξης.
+portfolio.pending.step3_buyer.warn.part2=Ο πωλητής BTC δεν έχει επιβεβαιώσει ακόμα την πληρωμή σου. Έλεγξε {0} αν η αποστολή πληρωμής ήταν επιτυχής.
+portfolio.pending.step3_buyer.openForDispute=Ο πωλητής BTC δεν επιβεβαίωσε την πληρωμή σου! Η μέγιστη χρονική περίοδος συναλλαγής παρήλθε. Μπορείς να περιμένεις περισσότερο και να δώσεις επιπλέον χρόνο στον έτερο συναλλασσόμενο ή μπορείς να ζητήσεις βοήθεια από τον διαμεσολαβητή.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=Ο συναλλασσόμενος επιβεβαίωσε πως ξεκίνησε την {0} πληρωμή.\n
portfolio.pending.step3_seller.altcoin.explorer=στον προτιμώμενο {0} blockchain explorer
portfolio.pending.step3_seller.altcoin.wallet=στο {0} πορτοφόλι σου
portfolio.pending.step3_seller.altcoin={0}Έλεγξε στον {1} αν η συναλλαγή προς τη διεύθυνση παραλαβής\n{2}\nέχει επαρκείς επιβεβαιώσεις στο blockchain.\nΤο ποσό πληρωμής θα πρέπει να είναι {3}\n\nΜπορείς να αντιγράψεις και να επικολλήσεις τη διεύθυνση {4} από την κύρια οθόνη αφού κλείσεις αυτό το παράθυρο.
portfolio.pending.step3_seller.postal={0}Έλεγξε αν παρέλαβες {1} μέσω \"US Postal Money Order\" από τον αγοραστή BTC.\n\nΗ ταυτότητα (ID) συναλλαγής (πεδίο \"reason for payment\") είναι: \"{2}\"
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=Ο έτερος συναλλασσόμενος επιβεβαίωσε την έναρξη της πληρωμής {0}.\n\nΣυνδέσου στον e-banking λογαριασμό σου και έλεγξε αν έχεις παραλάβει {1} από τον αγοραστή BTC.\n\nΗ ταυτότητα συναλλαγής (πεδίο \"reason for payment\") στη συναλλαγή είναι: \"{2}\"\n
portfolio.pending.step3_seller.cash=Καθώς η πληρωμή έγινε μέσω κατάθεσης μετρητών, ο αγοραστής BTC πρέπει να γράψει \"NO REFUND\" στην έντυπη απόδειξη, να την κόψει σε 2 κομμάτια, και να σου στείλει μια φωτογραφία μέσω email.\n\nΓια να αποφύγεις την πιθανότητα αντιλογισμού χρέωσης, κάνε επιβεβαίωση μονάχα στην περίπτωση που παραλάβεις το email, καθώς επίσης και αν είσαι σίγουρη πως το παραστατικό κατάθεσης είναι έγκυρο.\nΑν δεν είσαι σίγουρος, {0}
portfolio.pending.step3_seller.moneyGram=Ο αγοραστής θα πρέπει να σου στείλει τον αριθμό Έγκρισης (Authorisation) και μία φωτογραφία της απόδειξης μέσω email.\nΣτην απόδειξη θα πρέπει να διακρίνεται καθαρά το πλήρες όνομά σου, η χώρα, η πόλη και το ποσό. Έλεγξε αν στα email σου έχεις λάβει τον αριθμό Έγκρισης.\n\nΑφού κλείσεις αυτό το αναδυόμενο παράθυρο θα δεις το όνομα και τη διεύθυνση του αγοραστή BTC, ώστε να λάβεις τα χρήματα από την MoneyGram.\n\nΕπιβεβαίωσε την απόδειξη μονάχα αφού εισπράξεις τα χρήματα!
portfolio.pending.step3_seller.westernUnion=Ο αγοραστής θα πρέπει να σου στείλει τον αριθμό MTCN (αριθμός εντοπισμού) και μία φωτογραφία της απόδειξης μέσω email.\nΣτην απόδειξη θα πρέπει να διακρίνεται καθαρά το πλήρες όνομά σου, η πόλη, η χώρα και το ποσό. Έλεγξε αν στα email σου έχεις λάβει το MTCN.\n\nΑφού κλείσεις αυτό το αναδυόμενο παράθυρο θα δεις το όνομα και τη διεύθυνση του αγοραστή BTC, ώστε να λάβεις τα χρήματα από την Western Union.\n\nΕπιβεβαίωσε την απόδειξη μονάχα αφού εισπράξεις τα χρήματα!
portfolio.pending.step3_seller.halCash=Ο αγοραστής πρέπει να σου στείλει SMS με τον κωδικό HalCash. Εκτός από αυτό θα παραλάβεις και μήνυμα από την HalCash με τις απαραίτητες πληροφορίες για την ανάληψη Ευρώ από ATM υποστηριζόμενο από την HalCash.\n\nΑφού παραλάβεις τα χρήματα από το ATM επιβεβαίωσε εδώ το παραστατικό της πληρωμής!
-portfolio.pending.step3_seller.bankCheck=\n\nΕπιβεβαίωσε επίσης ότι το όνομα αποστολέα στην ειδοποίηση από την τράπεζά σου ταιριάζει με αυτό από τα στοιχεία της συναλλαγής:\nΌνομα αποστολέα: {0}\n\nΑν το όνομα δεν είναι το ίδιο όπως αυτό που παρουσιάζεται εδώ, {1}
-portfolio.pending.step3_seller.openDispute=μην προχωρήσεις σε επιβεβαίωση, αλλά ξεκίνα την επίλυση διένεξης πατώντας \"alt + o\" ή \"option + o\".
+portfolio.pending.step3_seller.bankCheck=\n\nΕπιβεβαίωσε επίσης ότι το όνομα αποστολέα στο συμβόλαιο συναλλαγής ταιριάζει με αυτό στην τραπεζική ειδοποίηση:\nΌνομα αποστολέα, σε συμβόλαιο συναλλαγής: {0}\n\nΑν το όνομα δεν είναι το ακριβώς το ίδιο, {1}
+portfolio.pending.step3_seller.openDispute=μην επιβεβαιώσεις την απόδειξη πληρωμής. Ξεκίνα την επίλυση διένεξης πατώντας \"alt + o\" ή \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=Επιβεβαίωσε την απόδειξη πληρωμής
portfolio.pending.step3_seller.amountToReceive=Ποσό προς λήψη
portfolio.pending.step3_seller.yourAddress=Η {0} διεύθυνσή σου
@@ -617,17 +650,18 @@ portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Έλεγξε τις
portfolio.pending.step3_seller.buyerStartedPayment.fiat=Έλεγξε τον λογαριασμό της συναλλαγής (π.χ. τραπεζικός λογαριασμός) και επιβεβαίωσε τη λήψη της πληρωμής όταν αυτή γίνει.
portfolio.pending.step3_seller.warn.part1a=στο blockchain {0}
portfolio.pending.step3_seller.warn.part1b=στον πάροχο υπηρεσιών πληρωμής (π.χ. τράπεζα)
-portfolio.pending.step3_seller.warn.part2=Δεν έχεις επιβεβαιώσει την απόδειξη της πληρωμής!\nΈλεγξε το {0} αν έχεις λάβει την πληρωμή.\nΑν δεν επιβεβαιώσεις την απόδειξη της πληρωμής μέχρι την {1}, η συναλλαγή θα διερευνηθεί από τον διαμεσολαβητή.
-portfolio.pending.step3_seller.openForDispute=Δεν επιβεβαίωσες την απόδειξη της πληρωμής!\nΗ μέγιστη χρονική περίοδος για αυτή τη συναλλαγή παρήλθε.\nΕπιβεβαίωσε τη συναλλαγή ή επικοινώνησε με τον διαμεσολαβητή ώστε να ξεκινήσει επίλυση διένεξης.
+portfolio.pending.step3_seller.warn.part2=Δεν έχεις επιβεβαιώσει την απόδειξη της πληρωμής!\nΈλεγξε το {0} αν έχεις λάβει την πληρωμή.
+portfolio.pending.step3_seller.openForDispute=Δεν έχεις επιβεβαιώσει την απόδειξη της πληρωμής!\nΗ μέγιστη χρονική περίοδος για αυτή τη συναλλαγή παρήλθε.\nΕπιβεβαίωσε τη συναλλαγή ή ζήτησε βοήθεια από τον διαμεσολαβητή.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=Έλαβες την πληρωμή {0} από τον έτερο συναλλασσόμενο;\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=Η ταυτότητα (ID) συναλλαγής (πεδίο \"reason for payment\") είναι: \"{0}\"\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=Επιβεβαίωσε επίσης ότι το όνομα αποστολέα στην τραπεζική ειδοποίηση ταιριάζει με αυτό στα στοιχεία της συναλλαγής:\nΌνομα αποστολέα: {0}\n\nΑν το όνομα δεν είναι το ίδιο όπως αυτό που παρουσιάζεται εδώ, μην προχωρήσεις σε επιβεβαίωση, αλλά άνοιξε την επίλυση διένεξης πατώντας \"alt + o\" ή \"option + o\".\n\n
-portfolio.pending.step3_seller.onPaymentReceived.note=Λάβε υπόψιν πως αμέσως μόλις επιβεβαιώσεις την απόδειξη, το κλειδωμένο ποσό της συναλλαγής θα αποδεσμευτεί στον αγοραστή BTC και η εγγύηση θα επιστραφεί.
+portfolio.pending.step3_seller.onPaymentReceived.name=Επιβεβαίωσε επίσης ότι το όνομα αποστολέα στο συμβόλαιο συναλλαγής ταιριάζει με αυτό στην τραπεζική ειδοποίηση:\nΌνομα αποστολέα, σε συμβόλαιο συναλλαγής: {0}\n\nΑν το όνομα δεν είναι ακριβώς το ίδιο, μην επιβεβαιώσεις την απόδειξη πληρωμής. Ξεκίνα την επίλυση διένεξης πατώντας \"alt + o\" ή \"option + o\".\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Λάβε υπόψιν πως αμέσως μόλις επιβεβαιώσεις την απόδειξη, το κλειδωμένο ποσό της συναλλαγής θα αποδεσμευτεί στον αγοραστή BTC και η εγγύηση θα επιστραφεί.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Επιβεβαίωσε πως έλαβες την πληρωμή
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Ναι, έλαβα την πληρωμή
+portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANT: By confirming receipt of payment, you are also verifying the account of the counterparty and signing it accordingly. Since the account of the counterparty hasn't been signed yet, you should delay confirmation of the payment as long as possible to reduce the risk of a chargeback.
portfolio.pending.step5_buyer.groupTitle=Περίληψη ολοκληρωμένης συναλλαγής
portfolio.pending.step5_buyer.tradeFee=Προμήθεια συναλλαγής
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=Σύνολο αμοιβών εξό
portfolio.pending.step5_buyer.refunded=Ποσό εγγύησης που επεστράφη
portfolio.pending.step5_buyer.withdrawBTC=Ανάληψη bitcoin
portfolio.pending.step5_buyer.amount=Ποσό προς ανάληψη
+portfolio.pending.step5_buyer.signer=Αποσύροντας τα bitcoin σου επιβεβαιώνεις πως η άλλη πλευρά έπραξε σύμφωνα με το πρωτόκολλο συναλλαγών.
portfolio.pending.step5_buyer.withdrawToAddress=Μεταφορά στη διεύθυνση
portfolio.pending.step5_buyer.moveToBisqWallet=Μετάφερε κεφάλαια στο πορτοφόλι Bisq.
portfolio.pending.step5_buyer.withdrawExternal=Μεταφορά σε εξωτερικό ποσρτοφόλι
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=Αμέσως μετά την πρώτη blockc
portfolio.pending.tradePeriodWarning=Αν η χρονική περίοδος παρέλθει, οι συναλλασσόμενοι μπορούν να ξεκινήσουν επίλυση διένεξης.
portfolio.pending.tradeNotCompleted=Η συναλλαγή δεν ολοκληρώθηκε εγκαίρως (μέχρι {0})
portfolio.pending.tradeProcess=Διαδικασία συναλλαγής
-portfolio.pending.openAgainDispute.msg=Αν δεν είσαι σίγουρος/η πως το μήνυμα ελήφθη από τον διαμεσολαβητή (π.χ. αν δεν έλαβες απάντηση εντός 1 ημέρας) μπορείς να ξεκινήσεις ξανά την επίλυση διένεξης.
+portfolio.pending.openAgainDispute.msg=Αν δεν είσαι σίγουρος/η πως το μήνυμα έφτασε στη διαμεσολαβήτρια ή τη διαιτητή (π.χ. αν δεν έλαβες απάντηση εντός 1 ημέρας), μπορείς να ξεκινήσεις ξανά την επίλυση διένεξης πατώντας Cmd/Ctrl+o. Μπορείς επίσης να ζητήσεις επιπλέον βοήθεια στο φόρουμ του Bisq στην ιστοσελίδα https://bisq.community.
portfolio.pending.openAgainDispute.button=Άνοιξε τη διένεξη ξανά
portfolio.pending.openSupportTicket.headline=Άνοιξε αίτημα υποστήριξης
-portfolio.pending.openSupportTicket.msg=Χρησιμοποίησέ το μονάχα σε επείγουσες περιπτώσεις, αν δεν εμαφανίζεται το κουμπί \"Αίτημα υποστήριξης\" ή \"Επίλυση διένεξης\".\n\nΑνοίγοντας ένα αίτημα υποστήριξης η συναλλαγή αναστέλλεται και τη διαχείριση αναλαμβάνει ο διαμεσολαβητής
+portfolio.pending.openSupportTicket.msg=Χρησιμοποίησέ το μονάχα σε επείγουσες περιπτώσεις, αν δεν εμαφανίζεται το κουμπί \"Αίτημα υποστήριξης\" ή \"Επίλυση διένεξης\".\n\nΑνοίγοντας ένα αίτημα υποστήριξης η συναλλαγή αναστέλλεται και τη διαχείριση αναλαμβάνει η διαμεσολαβήτρια ή η διαιτητής.
+
+portfolio.pending.timeLockNotOver=Θα πρέπει να περιμένεις ≈{0} ({1} επιπλέον blocks) πριν ξεκινήσεις μία επίλυση διένεξης.
+
portfolio.pending.notification=Ειδοποίηση
-portfolio.pending.openDispute=Άνοιξε την επίλυση διένεξης
-portfolio.pending.arbitrationRequested=Η επίλυση διένεξης άνοιξε
+
+portfolio.pending.support.headline.getHelp=Χρειάζεσαι βοήθεια;
+portfolio.pending.support.text.getHelp=Για οποιοδήποτε πρόβλημα επικοινώνησε με την έτερη συναλλασσόμενη στη συνομιλία συναλλαγής ή θέσε ερώτημα στην κοινότητα του Bisq στην ιστοσελίδα https://bisq.community. Αν το πρόβλημα δεν επιλυθεί, μπορείς να ζητήσεις επιπλέον βοήθεια από μία διαμεσολαβήτρια.
+portfolio.pending.support.text.getHelp.arbitrator=Για οποιοδήποτε πρόβλημα επικοινώνησε με την έτερη συναλλασσόμενη στη συνομιλία συναλλαγής ή θέσε ερώτημα στην κοινότητα του Bisq στην ιστοσελίδα https://bisq.community. Αν το πρόβλημα δεν επιλυθεί, μπορείς να ζητήσεις επιπλέον βοήθεια από μία διαιτήτρια.
+portfolio.pending.support.button.getHelp=Λήψη υποστήριξης
+portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket?
+portfolio.pending.support.popup.button=Άνοιξε αίτημα υποστήριξης
+portfolio.pending.support.headline.halfPeriodOver=Έλεγξε πληρωμή
+portfolio.pending.support.headline.periodOver=Λήξη περιόδου συναλλαγής
+
+portfolio.pending.mediationRequested=Έγινε αίτηση διαμεσολάβησης
+portfolio.pending.refundRequested=Έγινε αίτηση επιστροφής
portfolio.pending.openSupport=Άνοιξε αίτημα υποστήριξης
portfolio.pending.supportTicketOpened=Το αίτημα υποστήριξης άνοιξε
portfolio.pending.requestSupport=Αίτηση υποστήριξης
-portfolio.pending.error.requestSupport=Ανάφερε το πρόβλημα στον διαμεσολαβητή.\n\nΘα προωθήσει τις πληροφορίες στους προγραμματιστές για να το διερευνήσουν.\nΜετά την ανάλυση του προβλήματος θα σου επιστραφούν όλα τα κλειδωμένα κεφάλαια.
+portfolio.pending.error.requestSupport=Ανάφερε το πρόβλημα στον διαμεσολαβητή ή το διαιτητή.\n\nΘα προωθήσουν τις πληροφορίες στους προγραμματιστές για να το διερευνήσουν.\nΜετά την ανάλυση του προβλήματος θα σου επιστραφούν όλα τα κλειδωμένα κεφάλαια.
portfolio.pending.communicateWithArbitrator=Επικοινώνησε με τον διαμεσολαβητή στο παράθυρο \"Υποστήριξη\".
+portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator.
portfolio.pending.supportTicketOpenedMyUser=Έχεις ήδη ανοίξει ένα αίτημα υποστήριξης.\n{0}
portfolio.pending.disputeOpenedMyUser=Έχεις ήδη ανοίξει μια επίλυση διένεξης.\n{0}
portfolio.pending.disputeOpenedByPeer=Ο έτερος συναλλασσόμενος άνοιξε μια επίλυση διένεξης\n{0}
portfolio.pending.supportTicketOpenedByPeer=Ο έτερος συναλλασσόμενος άνοιξε ένα αίτημα υποστήριξης.\n{0}
portfolio.pending.noReceiverAddressDefined=Δεν έχει καθοριστεί διεύθυνση παραλήπτη
-portfolio.pending.removeFailedTrade=Αν ο διαμεσολαβητής δεν μπορεί να κλείσει αυτή τη συναλλαγή, μπορείς να τη μεταφέρεις εσύ στην οθόνη αποτυχημένων συναλλαγών.\nΕπιθυμείς να μετακινήσεις αυτή την αποτυχημένη συναλλαγή από την οθόνη εκκρεμών συναλλαγών;
+portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade?
+
+portfolio.pending.mediationResult.headline=Suggested payout from mediation
+portfolio.pending.mediationResult.info.noneAccepted=Ολοκλήρωσε τη συναλλαγή αποδεχόμενος/η την πρόταση του διαμεσολαβητή για την αποπληρωμή της συναλλαγής.
+portfolio.pending.mediationResult.info.selfAccepted=Αποδέχτηκες την πρόταση της διαμεσολαβήτριας. Ανάμενε για την αποδοχή από τον ομότιμο συναλλασσόμενο.
+portfolio.pending.mediationResult.info.peerAccepted=Ο ομότιμος συναλλασσόμενος αποδέχτηκε την πρόταση της διαμεσολαβήτριας. Την αποδέχεσαι κι εσύ;
+portfolio.pending.mediationResult.button=Δες προτεινόμενη επίλυση
+portfolio.pending.mediationResult.popup.headline=Αποτέλεσμα διαμεσολάβησης για συναλλαγή με ταυτότητα: {0}
+portfolio.pending.mediationResult.popup.headline.peerAccepted=Η έτερη συναλλασσόμενη αποδέχτηκε την πρόταση της διαμεσολαβήτριας για τη συναλλαγή {0}
+portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=Απόρριψε και αιτήσου διαιτησία
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=Ολοκληρώθηκε
-portfolio.closed.ticketClosed=Το αίτημα έκλεισε
+portfolio.closed.ticketClosed=Arbitrated
+portfolio.closed.mediationTicketClosed=Mediated
portfolio.closed.canceled=Ακυρώθηκε
portfolio.failed.Failed=Απέτυχε
@@ -745,6 +807,9 @@ funds.tx.multiSigDeposit=Κατάθεση Multisig: {0}
funds.tx.multiSigPayout=Πληρωμή Multisig: {0}
funds.tx.disputePayout=Πληρωμή διένεξης: {0}
funds.tx.disputeLost=Χαμένη περίπτωση διένεξης: {0}
+funds.tx.collateralForRefund=Refund collateral: {0}
+funds.tx.timeLockedPayoutTx=Time locked payout tx: {0}
+funds.tx.refund=Refund from arbitration: {0}
funds.tx.unknown=Άγνωστη αιτία: {0}
funds.tx.noFundsFromDispute=Καμί επιστροφή ποσού από τη διένεξη
funds.tx.receivedFunds=Ληφθέντα κεφάλαια
@@ -765,9 +830,10 @@ funds.tx.dustAttackTx.popup=Αυτή η συναλλαγή στέλνει ένα
# Support
####################################################################
-support.tab.mediation.support=Αιτήματα υποστήριξης
-support.tab.ArbitratorsSupportTickets=Αιτήματα υποστήριξης διαμεσολαβητή
-support.tab.TradersSupportTickets=Αιτήματα υποστήριξης συναλλασσόμενου
+support.tab.mediation.support=Διαμεσολάβηση
+support.tab.arbitration.support=Διαιτησία
+support.tab.legacyArbitration.support=Legacy Arbitration
+support.tab.ArbitratorsSupportTickets=Αιτήματα υποστήριξης {0}
support.filter=Λίστα φίλτρων
support.filter.prompt=Εισήγαγε ταυτότητα συναλλαγής, ημερομηνία, διεύθυνση onion ή στοιχεία λογαριασμού
support.noTickets=Δεν υπάρχουν ανοιχτά αιτήματα
@@ -782,7 +848,7 @@ support.attachment=Συνημμένο
support.tooManyAttachments=Δεν μπορείς να στείλει περισσότερα από 3 συνημμένα ανά μήνυμα.
support.save=Αποθήκευση αρχείου στο δίσκο
support.messages=Μηνύματα
-support.input.prompt=Γράψε εδώ το μήνυμά σου προς τον διαμεσολαβητή
+support.input.prompt=Εισήγαγε μήνυμα...
support.send=Αποστολή
support.addAttachments=Επικόλληση συνημμένων
support.closeTicket=Κλείσε το αίτημα
@@ -801,14 +867,18 @@ support.buyerOfferer=Αγοραστής/Maker BTC
support.sellerOfferer=Πωλητής/Maker BTC
support.buyerTaker=Αγοραστής/Taker BTC
support.sellerTaker=Πωλητής/Taker BTC
-support.backgroundInfo=Το Bisq δεν είναι εταιρία και γι' αυτό διαχειρίζεται τις διενέξεις διαφορετικά.\n\nΕάν προκύψουν διενέξεις κατά τη διαδικασία συναλλαγής (π.χ. ένας εκ των συναλλασσομένων δεν ακολουθήσει το πρωτόκολλο συναλλαγών), η εφαρμογή εμφανίζει το κουμπί \"Επίλυση διένεξης\" μετά τη λήξη της χρονικής περιόδου της συναλλαγής, με τη χρήση του οποίου ειδοποιείται ο διαμεσολαβητής.\n\nΑν προκύψει πρόβλημα με την εφαρμογή, το λογισμικό θα προσπαθήσει να το εντοπίσει και, εφόσον είναι εφικτό, θα εμφανίσει το κουμπί \"Αίτημα υποστήριξης\", με το οποίο καλείται ο διαμεσολαβητής, ο οποίος προωθεί το ζήτημα στους προγραμματιστές.\n\nΑν αντιμετωπίζεις πρόβλημα και δεν εμφανίζεται το κουμπί \"Αίτημα υποστήριξης\", μπορείς να εκκινήσεις ένα αίτημα υποστήριξης επιλέγοντας τη συναλλαγή που δημιουργεί το πρόβλημα πατώντας \"alt+o\" ή \"option+o\" στην καρτέλα \"Χαρτοφυλάκιο/Ανοιχτές συναλλαγές\". Χρησιμοποίησε αυτή τη μέθοδο μονάχα αν είσαι απολύτως σίγουρη/ος πως το λογισμικό δεν λειτουργεί όπως πρέπει. Για οποιαδήποτε απορία ή πρόβλημα έλεγξε τις FAQ (συχνές ερωτήσεις) στην ιστοσελίδα bisq.network ή θέσε το ερώτημά σου στο τμήμα υποστήριξης του φόρουμ.
-support.initialInfo=\tΕισήγαγε μια περιγραφή του προβλήματός σου στο κάτωθι πεδίο. Συμπεριέλαβε όσο το δυνατόν περισσότερες πληροφορίες, ώστε να επιταχυνθεί ο χρόνος επίλυσης της διένεξης.\n\nΑκολουθεί μια λίστα με πληροφορίες που πρέπει να εισάγεις:\n\t● Αν είσαι ο αγοραστής BTC: Ολοκλήρωσες τη μεταφορά χρημάτων ή κρυπτονομισμάτων; Εάν ναι, πίεσες το κουμπί "'πληρωμή απεστάλη" της εφαρμογής;\n\t● Εάν είσαι ο πωλητής BTC: Έλαβες πληρωμή χρημάτων ή κρυπτονομισμάτων; Αν ναι, πίεσες το κουμπί "πληρωμή ελήφθη" της εφαρμογής;\n\t● Ποια έκδοση του Bisq χρησιμοποιείς;\n\t● Ποιο λειτουργικό χρησιμοποιείς;\n\t● Αν αντιμετώπισες κάποιο πρόβλημα με αποτυχημένες συναλλαγές, προσπάθησε να αλλάξεις το αρχείο δεδομένων.\n\t Μερικές φορές το αρχείο δεδομένων καταστρέφεται και προκαλεί απρόσμενα σφάλματα.\n\nΔες: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nΕξοικειώσου με τους βασικούς κανόνες επίλυσης διένεξης:\n\t● Πρέπει να απαντήσεις στα αιτήματα του διαμεσολαβητή εντός 2 ημερών.\n\t● Η μέγιστη χρονικής περίοδος μιας διένεξης είναι 14 ημέρες.\n\t● Πρέπει να συνεργαστείς με τον διαμεσολαβητή και να παραδώσεις τα στοιχεία που αιτείται ώστε να στοιχειοθετήσεις την υπόθεσή σου.\n\t● Αποδέχτηκες τους κανόνες που αναφέρονται στο έγγραφο διενέξεων στη συμφωνία χρήστη, όταν εκκίνησες για πρώτη φορά την εφαρμογή.\n\nΜπορείς να διαβάσεις περισσότερες λεπτομέρειες σχετικές με τη διαδικασία επίλυσης διενέξεων στο: https://bisq.network/docs/exchange/arbitration-system
+support.backgroundInfo=Το Bisq δεν είναι εταιρία και γι' αυτό διαχειρίζεται τις διενέξεις διαφορετικά.\n\nΟι συναλλασσόμενοι μπορούν να επικοινωνούν εντός της εφαρμογής μέσω ασφαλούς συνομιλίας στην οθόνη των ανοικτών συναλλαγών, ώστε να προσπαθήσουν να επιλύσουν μία διένεξη οι ίδιοι. Αν αυτό δεν είναι επαρκές, μία διαμεσολαβήτρια μπορεί να επέμβει για να βοηθήσει. Η διαμεσολαβήτρια θα αξιολογήσει την κατάσταση και θα κάνει πρόταση για την αποπληρωμή των κεφαλαίων της συναλλαγής. Αν και οι δύο συναλλασσόμενοι αποδεχτούν την πρόταση, η συναλλαγή ολοκληρώνεται και κλείνει. Αν μία ή και οι δύο συναλλασσόμενες διαφωνήσουν με την πρόταση του διαμεσολαβητή, μπορούν να ζητήσουν διαιτησία. Η διαιτητής κατέχει το τρίτο κλειδί της κατάθεσης και τα ολοκληρώσει την πληρωμή βασιζόμενη στα ευρήματά της.
+support.initialInfo=\tΕισήγαγε μια περιγραφή του προβλήματός σου στο κάτωθι πεδίο. Συμπεριέλαβε όσο το δυνατόν περισσότερες πληροφορίες, ώστε να επιταχυνθεί ο χρόνος επίλυσης της διένεξης.\n\nΑκολουθεί μια λίστα με πληροφορίες που πρέπει να εισάγεις:\n\t● Αν είσαι ο αγοραστής BTC: Ολοκλήρωσες τη μεταφορά χρημάτων ή κρυπτονομισμάτων; Εάν ναι, πίεσες το κουμπί "'πληρωμή απεστάλη" της εφαρμογής;\n\t● Εάν είσαι ο πωλητής BTC: Έλαβες πληρωμή χρημάτων ή κρυπτονομισμάτων; Αν ναι, πίεσες το κουμπί "πληρωμή ελήφθη" της εφαρμογής;\n\t● Ποια έκδοση του Bisq χρησιμοποιείς;\n\t● Ποιο λειτουργικό χρησιμοποιείς;\n\t● Αν αντιμετώπισες κάποιο πρόβλημα με αποτυχημένες συναλλαγές, προσπάθησε να αλλάξεις το αρχείο δεδομένων.\n\t Μερικές φορές το αρχείο δεδομένων καταστρέφεται και προκαλεί απρόσμενα σφάλματα.\n\nΔες: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nΕξοικειώσου με τους βασικούς κανόνες επίλυσης διένεξης:\n\t● Πρέπει να απαντήσεις στα αιτήματα του {0} εντός 2 ημερών.\n\t● Οι διαμεσολαβητές αποκρίνονται εντός 2 ημερών. Οι διαιτητές αποκρίνονται εντός 5 ημερών.\n\t● Η μέγιστη χρονικής περίοδος μιας διένεξης είναι 14 ημέρες.\n\t● Πρέπει να συνεργαστείς με τον {1} και να παραδώσεις τα στοιχεία που αιτείται ώστε να στοιχειοθετήσεις την υπόθεσή σου.\n\t● Αποδέχτηκες τους κανόνες που αναφέρονται στο έγγραφο διενέξεων στη συμφωνία χρήστη, όταν εκκίνησες για πρώτη φορά την εφαρμογή.\n\nΜπορείς να διαβάσεις περισσότερες λεπτομέρειες σχετικές με τη διαδικασία επίλυσης διενέξεων στο: {2}
support.systemMsg=Μήνυμα συστήματος: {0}
support.youOpenedTicket=Άνοιξες ένα αίτημα υποστήριξης.\n\n{0}\n\nΈκδοση Bisq: {1}
support.youOpenedDispute=Άνοιξες ένα αίτημα για επίλυση διένεξης.\n\n{0}\n\nΈκδοση Bisq: {1}
-support.peerOpenedTicket=Ο έτερος συναλλασσόμενος αιτήθηκε υποστήριξης εξαιτίας τεχνικού προβλήματος.\n\n{0}
-support.peerOpenedDispute=Ο έτερος συναλλασσόμενος αιτήθηκε επίλυση διένεξης.\n\n{0}
+support.youOpenedDisputeForMediation=Αιτήθηκες διαμεσολάβηση.\n\n{0}\n\nΈκδοση Bisq: {1}
+support.peerOpenedTicket=Ο έτερος συναλλασσόμενος αιτήθηκε υποστήριξης εξαιτίας τεχνικού προβλήματος.\n\n{0}\n\nΈκδοση Bisq: {1}
+support.peerOpenedDispute=Η έτερη συναλλασσόμενη αιτήθηκε επίλυση διένεξης.\n\n{0}\n\nΈκδοση Bisq: {1}
+support.peerOpenedDisputeForMediation=Η έτερη συναλλασσόμενη αιτήθηκε διαμεσολάβησης.\n\n{0}\n\nΈκδοση Bisq: {1}
+support.mediatorsDisputeSummary=Μήνυμα συστήματος.\nΑναφορά διένεξης από διαμεσολαβητή:\n{0}
+support.mediatorsAddress=Διεύθυνση κόμβου διαμεσολαβητή: {0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=Πρόσθεσε altcoin
setting.preferences.displayOptions=Προβολή επιλογών
setting.preferences.showOwnOffers=Εμφάνισε τις προσφορές μου στο καθολικό προσφορών
setting.preferences.useAnimations=Χρήση animations
+setting.preferences.useDarkMode=Χρήση σκοτεινής κατάστασης (beta)
setting.preferences.sortWithNumOffers=Ταξινόμησε τους καταλόγους αγορών σύμφωνα με το πλήθος προσφορών/συναλλαγών
setting.preferences.resetAllFlags=Επανάφερε όλες τις επισημάνσεις \"Να μην επανεμφανιστεί\"
setting.preferences.reset=Επαναφορά
@@ -852,7 +923,7 @@ settings.preferences.selectCurrencyNetwork=Διάλεξε δίκτυο
setting.preferences.daoOptions=Επιλογές DAO
setting.preferences.dao.resync.label=Ανακατασκευή κατάστασης DAO από genesis tx
setting.preferences.dao.resync.button=Επανασυγχρονισμός
-setting.preferences.dao.resync.popup=Μετά την επανεκκίνηση της εφαρμογής τα δεδομένα του P2P δικτύου διακυβέρνησης θα επαναφορτωθούν από τους κόμβους seed και η BSQ κατάσταση συναίνεσης θα ξαναδημιουργηθεί από τη συναλλαγή genesis.
+setting.preferences.dao.resync.popup=After an application restart the Bisq 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=Εκτέλεση του Bisq ως πλήρης κόμβος DAO.
setting.preferences.dao.rpcUser=Όνομα χρήστη RPC
setting.preferences.dao.rpcPw=Κωδικός RPC
@@ -862,7 +933,7 @@ setting.preferences.dao.fullNodeInfo.ok=Άνοιγμα σελίδας κειμέ
setting.preferences.dao.fullNodeInfo.cancel=Όχι, παραμένω σε κατάσταση lite node
settings.net.btcHeader=Δίκτυο bitcoin
-settings.net.p2pHeader=Δίκτυο P2P
+settings.net.p2pHeader=Δίκτυο Bisq
settings.net.onionAddressLabel=Η onion διεύθυνσή μου
settings.net.btcNodesLabel=Χρήση προσωπικών επιλογών κόμβων Bitcoin Core
settings.net.bitcoinPeersLabel=Συνδεδεμένοι peers
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=Ληφθέντα
settings.net.peerTypeColumn=Peer τύπος
settings.net.openTorSettingsButton=Άνοιξε ρυθμίσεις Tor
+settings.net.versionColumn=Έκδοση
+settings.net.subVersionColumn=Υποέκδοση
+settings.net.heightColumn=Ύψος
+
settings.net.needRestart=Χρειάζεται επανεκκίνηση της εφαρμογής για να ισχύσει αυτή η αλλαγή.\nΘέλεις να επανεκκινήσεις τώρα;
settings.net.notKnownYet=Άγνωστο προς το παρόν...
settings.net.sentReceived=Απεσταλμένα: {0}, ληφθέντα: {1}
@@ -928,9 +1003,11 @@ setting.about.subsystems.val=Έκδοση δικτύου: {0}. Έκδοση P2P
####################################################################
account.tab.arbitratorRegistration=Εγγραφή διαμεσολαβητή
+account.tab.mediatorRegistration=Mediator registration
+account.tab.refundAgentRegistration=Refund agent registration
account.tab.account=Λογαριασμός
account.info.headline=Καλωσόρισες στον Bisq λογαριασμό σου
-account.info.msg=Εδώ μπορείς να προσθέσεις λογαριασμούς για συναλλαγές με εθνικά νομίσματα & κρυπτονομίσματα, να διαλέξεις διαμεσολαβητές, και να δημιουργήσεις αντίγραφο ασφάλειας τους πορτοφολιού σου και των στοιχείων του λογαριασμού σου.\n\nΤην πρώτη φορά που έτρεξες το Bisq δημιουργήθηκε ένα νέο πορτοφόλι Bitcoin.\n\nΠροτείνουμε να καταγράψεις οπωσδήποτε τις λέξεις seed του Bitcoin πορτοφολιού σου (δες την καρτέλα επάνω) και να προσθέσεις έναν προσωπικό κωδικό πριν καταθέσεις κεφάλαια. Μπορείς να διαχειριστείς τις καταθέσεις και τις αναλήψεις Bitcoin στην καρτέλα \"Κεφάλαια\".\n\nΥπενθύμιση προσωπικού απορρήτου και ασφάλειας: καθώς το Bisq είναι ένα αποκεντρωμένο ανταλλακτήριο, όλα τα δεδομένα σου αποθηκεύονται στον υπολογιστή σου. Δεν υπάρχουν servers, και άρα δεν έχουμε πρόσβαση στα προσωπικά σου δεδομένα, τα κεφάλαιά σου ή τη διεύθυνση IP σου. Πληροφορίες όπως αριθμοί τραπεζικών λογαριασμών, διευθύνσεις κρυπτονομισμάτων & Bitcoin, κλπ, μοιράζονται μονάχα με τον έτερο συναλλασσόμενο ώστε να ολοκληρωθούν οι συναλλαγές σου (σε περίπτωση διένεξης, ο διαμεσολαβητής θα έχει την ίδια πρόσβαση σε δεδομένα με τον έτερο συναλλασσόμενο).
+account.info.msg=Εδώ μπορείς να προσθέσεις λογαριασμούς για συναλλαγές με εθνικά νομίσματα & κρυπτονομίσματα και να δημιουργήσεις αντίγραφο ασφάλειας τους πορτοφολιού σου και των στοιχείων του λογαριασμού σου.\n\nΤην πρώτη φορά που έτρεξες το Bisq δημιουργήθηκε ένα νέο πορτοφόλι Bitcoin.\n\nΠροτείνουμε να καταγράψεις οπωσδήποτε τις λέξεις seed του Bitcoin πορτοφολιού σου (δες την καρτέλα επάνω) και να προσθέσεις έναν προσωπικό κωδικό πριν καταθέσεις κεφάλαια. Οι καταθέσεις και οι αναλήψεις Bitcoin είναι διαχειρίσιμες από την καρτέλα \"Κεφάλαια\".\n\nΥπενθύμιση προσωπικού απορρήτου και ασφάλειας: καθώς το Bisq είναι ένα αποκεντρωμένο ανταλλακτήριο, όλα τα δεδομένα σου αποθηκεύονται στον υπολογιστή σου. Δεν υπάρχουν servers, και άρα δεν έχουμε πρόσβαση στα προσωπικά σου δεδομένα, τα κεφάλαιά σου ή τη διεύθυνση IP σου. Πληροφορίες όπως αριθμοί τραπεζικών λογαριασμών, διευθύνσεις κρυπτονομισμάτων & Bitcoin, κλπ, μοιράζονται μονάχα με τον έτερο συναλλασσόμενο ώστε να ολοκληρωθούν οι συναλλαγές σου (σε περίπτωση διένεξης, η διαμεσολαβήτρια και η διαιτητής θα έχουν την ίδια πρόσβαση σε δεδομένα με τον έτερο συναλλασσόμενο).
account.menu.paymentAccount=Λογαριασμοί εθνικών νομισμάτων
account.menu.altCoinsAccountView=Λογαριασμοί altcoins
@@ -939,42 +1016,39 @@ account.menu.seedWords=Seed πορτοφολιού
account.menu.backup=Αντίγραφο ασφαλείας
account.menu.notifications=Ειδοποιήσεις
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=Δημόσιο κλειδί
-account.arbitratorRegistration.register=Εγγραφή διαμεσολαβητή
-account.arbitratorRegistration.revoke=Ανάκληση εγγραφής
-account.arbitratorRegistration.info.msg=Λάβε υπόψιν σου πως απαιτείται να παραμείνεις διαθέσιμος για 15 ημέρες μετά την ανάκλησή σου, καθώς ίσως υπάρχουν συναλλαγές στις οποίες έχεις ρόλο διαμεσολαβητή. Η μέγιστη επιτρεπόμενη περίοδος συναλλαγών είναι 8 ημέρες και η επίλυση διένεξης μπορεί να διαρκέσει μέχρι 7 ημέρες.
+account.arbitratorRegistration.register=Εγγραφή
+account.arbitratorRegistration.registration={0} εγγραφή
+account.arbitratorRegistration.revoke=Ανάκληση
+account.arbitratorRegistration.info.msg=Λάβε υπόψιν σου πως απαιτείται να παραμείνεις διαθέσιμος για 15 ημέρες μετά την ανάκλησή σου, καθώς ίσως υπάρχουν συναλλαγές στις οποίες έχεις ρόλο {0}. Η μέγιστη επιτρεπόμενη περίοδος συναλλαγών είναι 8 ημέρες και η επίλυση διένεξης μπορεί να διαρκέσει μέχρι 7 ημέρες.
account.arbitratorRegistration.warn.min1Language=Πρέπει να προσθέσεις τουλάχιστον μία γλώσσα.\nΠροσθέσαμε ήδη την προεπιλεγμένη γλώσσα.
-account.arbitratorRegistration.removedSuccess=Διέγραψες επιτυχώς τον διαμεσολαβητή σου από το δίκτυο P2P.
-account.arbitratorRegistration.removedFailed= Δεν ήταν δυνατή η διαγραφή του διαμεσολαβητή.{0}
-account.arbitratorRegistration.registerSuccess=Καταχώρησες επιτυχώς τον διαμεσολαβητή σου στο δίκτυο P2P.
-account.arbitratorRegistration.registerFailed=Δεν ήταν δυνατή η καταχώρηση του διαμεσολαβητή.{0}
-
-account.arbitratorSelection.minOneArbitratorRequired=Πρέπει να προσθέσεις τουλάχιστον μία γλώσσα.\nΠροσθέσαμε ήδη την προεπιλεγμένη γλώσσα.
-account.arbitratorSelection.whichLanguages=Ποιες γλώσσες μιλάς;
-account.arbitratorSelection.whichDoYouAccept=Ποιους διαμεσολαβητές αποδέχεσαι;
-account.arbitratorSelection.autoSelect=Αυτόματη επιλογή διαμεσολαβητών με κοινή γλώσσα
-account.arbitratorSelection.regDate=Ημερομηνία καταχώρησης
-account.arbitratorSelection.languages=Γλώσσες
-account.arbitratorSelection.cannotSelectHimself=Ένας διαμεσολαβητής δεν μπορεί να επιλέξει τον εαυτό του για συναλλαγές.
-account.arbitratorSelection.noMatchingLang=Δεν βρέθηκε κοινή γλώσσα.
-account.arbitratorSelection.noLang=Μπορείς να επιλέξεις μονάχα διαμεσολαβητές με τουλάχιστον 1 κοινή γλώσσα.
-account.arbitratorSelection.minOne=Πρέπει να επιλέξεις τουλάχιστον έναν διαμεσολαβητή.
+account.arbitratorRegistration.removedSuccess=Διέγραψες επιτυχώς την εγγραφή σου από το δίκτυο Bisq.
+account.arbitratorRegistration.removedFailed=Η διαγραφή εγγραφής ήταν αδύνατη.{0}
+account.arbitratorRegistration.registerSuccess=Επιτυχής εγγραφή στο δίκτυο Bisq.
+account.arbitratorRegistration.registerFailed=Αποτυχία ολοκλήρωσης εγγραφής.{0}
account.altcoin.yourAltcoinAccounts=Οι altcoin λογαριασμοί σου
-account.altcoin.popup.wallet.msg=Βεβαιώσου πως πληρείς τις απαιτήσεις για τη χρήση των {0} πορτοφολιών, όπως αυτές περιγράφονται στην ιστοσελίδα {1}.\nΗ χρήση πορτοφολιών κεντρικών ανταλλακτηρίων, όπου είτε (α) δεν έχεις τον έλεγχο των κλειδιών σου, είτε (β) δεν χρησιμοποιούν πορτοφόλια συμβατού λογισμικού, είναι παρακινδυνευμένη: μπορεί να οδηγήσει σε απώλεια κεφαλαίων!\nΟ διαμεσολαβητής δεν είναι ειδικός {2} και δεν μπορεί να βοηθήσει σε τέτοιες περιπτώσεις.
+account.altcoin.popup.wallet.msg=Βεβαιώσου πως πληρείς τις απαιτήσεις για τη χρήση των {0} πορτοφολιών, όπως αυτές περιγράφονται στην ιστοσελίδα {1}.\nΗ χρήση πορτοφολιών κεντρικών ανταλλακτηρίων, όπου είτε (α) δεν έχεις τον έλεγχο των κλειδιών σου, είτε (β) δεν χρησιμοποιούν πορτοφόλια συμβατού λογισμικού, είναι παρακινδυνευμένη: μπορεί να οδηγήσει σε απώλεια κεφαλαίων!\nΟ διαμεσολαβητής ή ο διαιτητής δεν είναι ειδικός {2} και δεν μπορεί να βοηθήσει σε τέτοιες περιπτώσεις.
account.altcoin.popup.wallet.confirm=Κατανοώ και επιβεβαιώνω πως γνωρίζω ποιο πορτοφόλι πρέπει να χρησιμοποιήσω.
-account.altcoin.popup.arq.msg=Συναλλαγές με ARQ στο Bisq απαιτούν την κατανόηση και εκπλήρωση των ακόλουθων προαπαιτήσεων:\n\nΓια αποστολή XMR απαιτείται η χρήση είτε του επίσημου ArQmA GUI πορτοφολιού, είτε του ArQmA CLI πορτοφολιού με ενεργοποιημένο το store-tx-info flag (προεπιλεγμένο σε νέες εκδόσεις). Βεβαιώσου πως έχεις πρόσβαση στο tx key, καθώς σε περίπτωση διένεξης θα χρειαστεί.\n\narqma-wallet-cli (χρησιμοποίησε την εντολή get_tx_key)\narqma-wallet-gui (πήγαινε στην καρτέλα history και πάτα το πλήκτρο (P) button για απόδειξη πληρωμής)\n\nΣε απλούς block explorers η συναλλαγή δεν είναι επαληθεύσιμη.\n\nΣε περίπτωση διένεξης θα χρειαστεί να προσφέρεις στον διαμεσολαβητή τις ακόλουθες πληροφορίες:\n- Το ιδιωτικό tx κλειδί\n- Το hash της συναλλαγής\n- Τη δημόσια διεύθυνση του παραλήπτη\n\nΕάν δεν μπορέσεις να προσφέρεις τις παραπάνω πληροφορίες ή αν χρησιμοποίησες ένα μη συμβατό πορτοφόλι, θα χάσεις την επίλυση της διένεξης. Ο αποστολέας ARQ είναι υπεύθυνος για την επιβεβαίωση της μεταφοράς ARQ στον διαμεσολαβητή σε περίπτωση διένεξης.\n\nΔεν απαιτείται η ταυτότητα πληρωμής, παρά μονάχα η δημόσια διεύθυνση.\nΕάν δεν είσαι σίγουρος σχετικά με τη διαδικασία, επισκέψου το discord κανάλι ArQmA (https://discord.gg/s9BQpJT) ή το φόρουμ ArQmA (https://labs.arqma.com) για περαιτέρω πληροφορίες.
-account.altcoin.popup.xmr.msg=Συναλλαγές με XMR στο Bisq απαιτούν την κατανόηση και εκπλήρωση των ακόλουθων προαπαιτήσεων:\n\nΓια αποστολή XMR απαιτείται είτε η χρήση του επίσημου Monero GUI πορτοφολιού, είτε του Monero CLI πορτοφολιού με την επισήμανση store-tx-info ενεργοποιημένη (προεπιλεγμένη στις νεώτερες εκδόσεις). Βεβαιώσου πως έχεις πρόσβαση στο tx key, καθώς σε περίπτωση διένεξης θα χρειαστεί.\nΠορτοφόλι Monero CLI (χρησιμοποίησε την εντολή get_tx_key)\nΠορτοφόλι Monero GUI (πήγαινε στην καρτέλα History και πάτα το πλήκτρο (P) για απόδειξη πληρωμής)\n\nΕπιπροσθέτως του εργαλείου XMR checktx (https://xmr.llcoins.net/checktx.html) επιβεβαίωση μπορεί να επιτευχθεί και εντός των πορτοφολιών.\nΠορτοφόλι Monero CLI: με χρήση της εντολής (check_tx_key).\nΠορτοφόλι Monero GUI: στην καρτέλα Advanced > Prove/Check.\nΣε απλούς block explorers η συναλλαγή δεν είναι επαληθεύσιμη.\n\nΣε περίπτωση διένεξης θα χρειαστεί να προσφέρεις στον διαμεσολαβητή τις ακόλουθες πληροφορίες:\n- Το ιδιωτικό tx κλειδί\n- Το hash της συναλλαγής\n- Τη δημόσια διεύθυνση του παραλήπτη\n\nΕάν δεν μπορέσεις να προσφέρεις τις παραπάνω πληροφορίες ή αν χρησιμοποίησες ένα μη συμβατό πορτοφόλι, θα χάσεις την επίλυση της διένεξης. Ο αποστολέας XMR είναι υπεύθυνος για την επιβεβαίωση της μεταφοράς XMR στον διαμεσολαβητή σε περίπτωση διένεξης.\n\nΔεν απαιτείται η ταυτότητα πληρωμής, παρά μονάχα η δημόσια διεύθυνση.\nΕάν δεν είσαι σίγουρος σχετικά με τη διαδικασία, μπορείς να επισκεφτείς το (https://www.getmonero.org/resources/user-guides/prove-payment.html) ή το φόρουμ του Monero (https://forum.getmonero.org) για περαιτέρω πληροφορίες.
-account.altcoin.popup.blur.msg=Συναλλαγές με BLUR στο Bisq απαιτούν την κατανόηση και εκπλήρωση των ακόλουθων προαπαιτήσεων:\n\nΓια αποστολή BLUR απαιτείται η χρήση του πορτοφολιού Blur Network CLI ή GUI.\n\nΑν χρησιμοποιείς το CLI πορτοφόλι, θα εμφανιστεί το hash της συναλλαγής (tx ID) μετά την αποστολή της συναλλαγής. Απαιτείται να αποθηκεύσεις αυτή την πληροφορία. Αμέσως μετά την αποστολή της συναλλαγής, θα πρέπει να χρησιμοποιήσεις την εντολή 'get_tx_key' για να ανακτήσεις το ιδιωτικό κλειδί της συναλλαγής. Αν αμελήσεις να ολοκληρώσεις αυτό το βήμα, ίσως να μην καταφέρεις να ανακτήσεις το κλειδί αργότερα.\n\nΑν χρησιμοποιείς το πορτοφόλι Blur Network GUI, το ιδιωτικό κλειδί και η ταυτότητα της συναλλαγής μπορούν εύκολα να βρεθούν στην καρτέλα "History". Αμέσως μετά την αποστολή, βρες τη συναλλαγή. Πάτα το σύμβολο "?" στην κάτω δεξιά γωνία της οθόνης που περιλαμβάνει τη συναλλαγή. Θα πρέπει να αποθηκεύσεις αυτή την πληροφορία.\n\nΣε περίπτωση διένεξης θα χρειαστεί να προσφέρεις στον διαμεσολαβητή τις ακόλουθες πληροφορίες: 1.) Την ταυτότητα της συναλλαγής, 2.) Το ιδιωτικό κλειδί της συναλλαγής, και 3.) Τη διεύθυνση του παραλήπτη. Ο διαμεσολαβητής θα μπορέσει έτσι να επιβεβαιώσει τη μεταφορά BLUR χρησιμοποιώντας τον Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nΕάν δεν μπορέσεις να προσφέρεις τις απαιτούμενες πληροφορίες προς τον διαμεσολαβητή θα έχει ως αποτέλεσμα να χάσεις την επίλυση της διένεξης. Σε όλες τις περιπτώσεις διένεξης ο αποστολέας BLUR είναι 100% υπεύθυνος για την επαλήθευση των συναλλαγών προς τον διαμεσολαβητή.\n\nΑν δεν κατανοείς αυτές τις απαιτήσεις, μην συναλλαχθείς στο Bisq. Πρώτα ζήτα βοήθεια στο Blur Network Discord (https://discord.gg/dMWaqVW).
-account.altcoin.popup.cash2.msg=Συναλλαγές με CASH2 στο Bisq απαιτούν την κατανόηση και εκπλήρωση των ακόλουθων προαπαιτήσεων:\n\nΓια αποστολή CASH2 απαιτείται η χρήση του πορτοφολιού Cash2 έκδοσης 3 ή μεγαλύτερης.\n\nΜετά την αποστολή της συναλλαγής θα εμφανιστεί η ταυτότητα της συναλλαγής. Απαιτείται να αποθηκεύσεις αυτή την πληροφορία. Αμέσως μετά την αποστολή της συναλλαγής, θα πρέπει να χρησιμοποιήσεις την εντολή 'getTxKey' στο simplewallet' για να ανακτήσεις το μυστικό κλειδί της συναλλαγής.\n\nΣε περίπτωση διένεξης θα χρειαστεί να προσφέρεις στον διαμεσολαβητή τα ακόλουθα: 1) Την ταυτότητα της συναλλαγής, 2) Το μυστικό κλειδί της συναλλαγής, και 3) Τη διεύθυνση Cash2 του παραλήπτη. Ο διαμεσολαβητής θα μπορέσει έτσι να επιβεβαιώσει τη μεταφορά CASH2 χρησιμοποιώντας τον Cash2 Block Explorer (https://blocks.cash2.org).\n\nΕάν δεν μπορέσεις να προσφέρεις τις απαιτούμενες πληροφορίες προς τον διαμεσολαβητή θα έχει ως αποτέλεσμα να χάσεις την επίλυση της διένεξης. Σε όλες τις περιπτώσεις διένεξης ο αποστολέας CASH2 είναι 100% υπεύθυνος για την επαλήθευση των συναλλαγών προς τον διαμεσολαβητή.\n\nΑν δεν κατανοείς αυτές τις απαιτήσεις, μην συναλλαχθείς στο Bisq. Πρώτα ζήτα βοήθεια στο Cash2 Discord (https://discord.gg/FGfXAYN).
-account.altcoin.popup.qwertycoin.msg=Συναλλαγές με Qwertycoin στο Bisq απαιτούν την κατανόηση και εκπλήρωση των ακόλουθων προαπαιτήσεων:\n\nΓια αποστολή QWC απαιτείται η χρήση του επίσημου πορτοφολιού QWC έκδοσης 5,1,3 ή μεγαλύτερης.\n\nΜετά την αποστολή της συναλλαγής θα εμφανιστεί η ταυτότητα της συναλλαγής. Απαιτείται να αποθηκεύσεις αυτή την πληροφορία. Αμέσως μετά την αποστολή της συναλλαγής, θα πρέπει να χρησιμοποιήσεις την εντολή 'get_Tx_Key' στο simplewallet' για να ανακτήσεις το μυστικό κλειδί της συναλλαγής.\n\nΣε περίπτωση διένεξης θα χρειαστεί να προσφέρεις στον διαμεσολαβητή τα ακόλουθα: 1) Την ταυτότητα της συναλλαγής, 2) Το μυστικό κλειδί της συναλλαγής, και 3) Τη διεύθυνση QWC του παραλήπτη. Ο διαμεσολαβητής θα μπορέσει έτσι να επιβεβαιώσει τη μεταφορά QWC χρησιμοποιώντας τον QWC Block Explorer (https://explorer.qwertycoin.org).\n\nΕάν δεν μπορέσεις να προσφέρεις τις απαιτούμενες πληροφορίες προς τον διαμεσολαβητή θα έχει ως αποτέλεσμα να χάσεις την επίλυση της διένεξης. Σε όλες τις περιπτώσεις διένεξης ο αποστολέας QWCείναι 100% υπεύθυνος για την επαλήθευση των συναλλαγών προς τον διαμεσολαβητή.\n\nΑν δεν κατανοείς αυτές τις απαιτήσεις, μην συναλλαχθείς στο Bisq. Πρώτα ζήτα βοήθεια στο QWC Discord (https://discord.gg/rUkfnpC).
-account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help.
-account.altcoin.popup.ZEC.msg=Όταν χρησιμοποιείς Zcoin μπορείς να χρησιμοποιήσεις μονάχα τις διαφανείς διευθύνσεις (ξεκινούν με t) και όχι τις z διευθύνσεις (ιδιωτικές), καθώς ο διαμεσολαβητής δεν θα μπορεί να επαληθεύσει τη συναλλαγή μέσω z διευθύνσεων.
-account.altcoin.popup.XZC.msg=Όταν χρησιμοποιείς Zcoin μπορείς να χρησιμοποιήσεις μονάχα διαφανείς (ανιχνεύσιμες) διευθύνσεις, και όχι μη ανιχνεύσιμες διευθύνσεις, καθώς ο διαμεσολαβητής δεν θα μπορεί να επαληθεύσει τη συναλλαγή με μη ανιχνεύσιμες διευθύνσεις στον block explorer.
+account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information.
+account.altcoin.popup.arq.msg=Συναλλαγές με ARQ στο Bisq απαιτούν την κατανόηση και εκπλήρωση των ακόλουθων προαπαιτήσεων:\n\nΓια αποστολή ARQ απαιτείται η χρήση είτε του επίσημου ArQmA GUI πορτοφολιού, είτε του ArQmA CLI πορτοφολιού με ενεργοποιημένο το store-tx-info flag (προεπιλεγμένο σε νέες εκδόσεις). Βεβαιώσου πως έχεις πρόσβαση στο tx key, καθώς σε περίπτωση διένεξης θα χρειαστεί.\n\narqma-wallet-cli (χρησιμοποίησε την εντολή get_tx_key)\narqma-wallet-gui (πήγαινε στην καρτέλα history και πάτα το πλήκτρο (P) button για απόδειξη πληρωμής)\n\nΣε απλούς block explorers η συναλλαγή δεν είναι επαληθεύσιμη.\n\nΣε περίπτωση διένεξης θα χρειαστεί να προσφέρεις στον διαμεσολαβητή ή τη διαιτήτρια τις ακόλουθες πληροφορίες:\n- Το ιδιωτικό tx κλειδί\n- Το hash της συναλλαγής\n- Τη δημόσια διεύθυνση του παραλήπτη\n\nΕάν δεν μπορέσεις να προσφέρεις τις παραπάνω πληροφορίες ή αν χρησιμοποίησες ένα μη συμβατό πορτοφόλι, θα χάσεις την επίλυση της διένεξης. Ο αποστολέας ARQ είναι υπεύθυνος για την επιβεβαίωση της μεταφοράς ARQ στον διαμεσολαβητή ή τη διαιτήτρια σε περίπτωση διένεξης.\n\nΔεν απαιτείται η ταυτότητα πληρωμής, παρά μονάχα η δημόσια διεύθυνση.\nΕάν δεν είσαι σίγουρη σχετικά με τη διαδικασία, επισκέψου το discord κανάλι ArQmA (https://discord.gg/s9BQpJT) ή το φόρουμ ArQmA (https://labs.arqma.com) για περαιτέρω πληροφορίες.
+account.altcoin.popup.xmr.msg=Συναλλαγές με XMR στο Bisq απαιτούν την κατανόηση και εκπλήρωση των ακόλουθων προαπαιτήσεων:\n\nΓια αποστολή XMR απαιτείται είτε η χρήση του επίσημου Monero GUI πορτοφολιού, είτε του Monero CLI πορτοφολιού με την επισήμανση store-tx-info ενεργοποιημένη (προεπιλεγμένη στις νεώτερες εκδόσεις). Βεβαιώσου πως έχεις πρόσβαση στο tx key, καθώς σε περίπτωση διένεξης θα χρειαστεί.\nΠορτοφόλι Monero CLI (χρησιμοποίησε την εντολή get_tx_key)\nΠορτοφόλι Monero GUI (πήγαινε στην καρτέλα History και πάτα το πλήκτρο (P) για απόδειξη πληρωμής)\n\nΕπιπροσθέτως του εργαλείου XMR checktx (https://xmr.llcoins.net/checktx.html) επιβεβαίωση μπορεί να επιτευχθεί και εντός των πορτοφολιών.\nΠορτοφόλι Monero CLI: με χρήση της εντολής (check_tx_key).\nΠορτοφόλι Monero GUI: στην καρτέλα Advanced > Prove/Check.\nΣε απλούς block explorers η συναλλαγή δεν είναι επαληθεύσιμη.\n\nΣε περίπτωση διένεξης θα χρειαστεί να προσφέρεις στον διαμεσολαβητή ή τη διαιτήτρια τις ακόλουθες πληροφορίες:\n- Το ιδιωτικό tx κλειδί\n- Το hash της συναλλαγής\n- Τη δημόσια διεύθυνση του παραλήπτη\n\nΕάν δεν μπορέσεις να προσφέρεις τις παραπάνω πληροφορίες ή αν χρησιμοποίησες ένα μη συμβατό πορτοφόλι, θα χάσεις την επίλυση της διένεξης. Ο αποστολέας XMR είναι υπεύθυνος για την επιβεβαίωση της μεταφοράς XMR στον διαμεσολαβητή ή τη διαιτήτρια σε περίπτωση διένεξης.\n\nΔεν απαιτείται η ταυτότητα πληρωμής, παρά μονάχα η δημόσια διεύθυνση.\nΕάν δεν είσαι σίγουρη σχετικά με τη διαδικασία, μπορείς να επισκεφτείς το (https://www.getmonero.org/resources/user-guides/prove-payment.html) ή το φόρουμ του Monero (https://forum.getmonero.org) για περαιτέρω πληροφορίες.
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs).
+account.altcoin.popup.blur.msg=Συναλλαγές με BLUR στο Bisq απαιτούν την κατανόηση και εκπλήρωση των ακόλουθων προαπαιτήσεων:\n\nΓια αποστολή BLUR απαιτείται η χρήση του πορτοφολιού Blur Network CLI ή GUI.\n\nΑν χρησιμοποιείς το CLI πορτοφόλι, θα εμφανιστεί το hash της συναλλαγής (tx ID) μετά την αποστολή της συναλλαγής. Απαιτείται να αποθηκεύσεις αυτή την πληροφορία. Αμέσως μετά την αποστολή της συναλλαγής, θα πρέπει να χρησιμοποιήσεις την εντολή 'get_tx_key' για να ανακτήσεις το ιδιωτικό κλειδί της συναλλαγής. Αν αμελήσεις να ολοκληρώσεις αυτό το βήμα, ίσως να μην καταφέρεις να ανακτήσεις το κλειδί αργότερα.\n\nΑν χρησιμοποιείς το πορτοφόλι Blur Network GUI, το ιδιωτικό κλειδί και η ταυτότητα της συναλλαγής μπορούν εύκολα να βρεθούν στην καρτέλα "History". Αμέσως μετά την αποστολή, βρες τη συναλλαγή. Πάτα το σύμβολο "?" στην κάτω δεξιά γωνία της οθόνης που περιλαμβάνει τη συναλλαγή. Θα πρέπει να αποθηκεύσεις αυτή την πληροφορία.\n\nΣε περίπτωση διένεξης θα χρειαστεί να προσφέρεις στον διαμεσολαβητή ή τη διαιτήτρια τις ακόλουθες πληροφορίες: 1.) Την ταυτότητα της συναλλαγής, 2.) Το ιδιωτικό κλειδί της συναλλαγής, και 3.) Τη διεύθυνση του παραλήπτη. Ο διαμεσολαβητής ή η διαιτήτρια θα μπορέσει έτσι να επιβεβαιώσει τη μεταφορά BLUR χρησιμοποιώντας τον Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nΕάν δεν μπορέσεις να προσφέρεις τις απαιτούμενες πληροφορίες προς τον διαμεσολαβητή ή τη διαιτήτρια θα έχει ως αποτέλεσμα να χάσεις την επίλυση της διένεξης. Σε όλες τις περιπτώσεις διένεξης ο αποστολέας BLUR είναι 100% υπεύθυνος για την επαλήθευση των συναλλαγών προς τον διαμεσολαβητή ή τη διαιτήτρια.\n\nΑν δεν κατανοείς αυτές τις απαιτήσεις, μην συναλλαχθείς στο Bisq. Πρώτα ζήτα βοήθεια στο Blur Network Discord (https://discord.gg/dMWaqVW).
+account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/).
+account.altcoin.popup.cash2.msg=Συναλλαγές με CASH2 στο Bisq απαιτούν την κατανόηση και εκπλήρωση των ακόλουθων προαπαιτήσεων:\n\nΓια αποστολή CASH2 απαιτείται η χρήση του πορτοφολιού Cash2 έκδοσης 3 ή μεγαλύτερης.\n\nΜετά την αποστολή της συναλλαγής θα εμφανιστεί η ταυτότητα της συναλλαγής. Απαιτείται να αποθηκεύσεις αυτή την πληροφορία. Αμέσως μετά την αποστολή της συναλλαγής, θα πρέπει να χρησιμοποιήσεις την εντολή 'getTxKey' στο simplewallet' για να ανακτήσεις το μυστικό κλειδί της συναλλαγής.\n\nΣε περίπτωση διένεξης θα χρειαστεί να προσφέρεις στον διαμεσολαβητή ή τη διαιτήτρια τα ακόλουθα: 1) Την ταυτότητα της συναλλαγής, 2) Το μυστικό κλειδί της συναλλαγής, και 3) Τη διεύθυνση Cash2 του παραλήπτη. Ο διαμεσολαβητής ή διαιτήτρια θα μπορέσει έτσι να επιβεβαιώσει τη μεταφορά CASH2 χρησιμοποιώντας τον Cash2 Block Explorer (https://blocks.cash2.org).\n\nΕάν δεν μπορέσεις να προσφέρεις τις απαιτούμενες πληροφορίες προς τον διαμεσολαβητή ή τη διαιτήτρια θα έχει ως αποτέλεσμα να χάσεις την επίλυση της διένεξης. Σε όλες τις περιπτώσεις διένεξης ο αποστολέας CASH2 είναι 100% υπεύθυνος για την επαλήθευση των συναλλαγών προς τον διαμεσολαβητή ή τη διαιτήτρια.\n\nΑν δεν κατανοείς αυτές τις απαιτήσεις, μην συναλλαχθείς στο Bisq. Πρώτα ζήτα βοήθεια στο Cash2 Discord (https://discord.gg/FGfXAYN).
+account.altcoin.popup.qwertycoin.msg=Συναλλαγές με Qwertycoin στο Bisq απαιτούν την κατανόηση και εκπλήρωση των ακόλουθων προαπαιτήσεων:\n\nΓια αποστολή QWC απαιτείται η χρήση του επίσημου πορτοφολιού QWC έκδοσης 5.1.3 ή μεταγενέστερης.\n\nΜετά την αποστολή της συναλλαγής θα εμφανιστεί η ταυτότητα της συναλλαγής. Απαιτείται να αποθηκεύσεις αυτή την πληροφορία. Αμέσως μετά την αποστολή της συναλλαγής, θα πρέπει να χρησιμοποιήσεις την εντολή 'get_Tx_Key' στο simplewallet' για να ανακτήσεις το μυστικό κλειδί της συναλλαγής.\n\nΣε περίπτωση διένεξης θα χρειαστεί να προσφέρεις στον διαμεσολαβητή ή τη διαιτήτρια τα ακόλουθα: 1) Την ταυτότητα της συναλλαγής, 2) Το μυστικό κλειδί της συναλλαγής, και 3) Τη διεύθυνση QWC του παραλήπτη. Ο διαμεσολαβητής ή διαιτήτρια θα μπορέσει έτσι να επιβεβαιώσει τη μεταφορά QWC χρησιμοποιώντας τον QWC Block Explorer (https://explorer.qwertycoin.org).\n\nΕάν δεν μπορέσεις να προσφέρεις τις απαιτούμενες πληροφορίες προς τον διαμεσολαβητή ή τη διαιτήτρια θα έχει ως αποτέλεσμα να χάσεις την επίλυση της διένεξης. Σε όλες τις περιπτώσεις διένεξης ο αποστολέας QWCείναι 100% υπεύθυνος για την επαλήθευση των συναλλαγών προς τον διαμεσολαβητή ή τη διαιτήτρια.\n\nΑν δεν κατανοείς αυτές τις απαιτήσεις, μην συναλλαχθείς στο Bisq. Πρώτα ζήτα βοήθεια στο QWC Discord (https://discord.gg/rUkfnpC).
+account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help.
+account.altcoin.popup.ZEC.msg=Όταν χρησιμοποιείς Zcoin μπορείς να χρησιμοποιήσεις μονάχα τις διαφανείς διευθύνσεις (ξεκινούν με t) και όχι τις z διευθύνσεις (ιδιωτικές), καθώς η διαμεσολαβήτρια ή ο διαιτητής δεν θα μπορεί να επαληθεύσει τη συναλλαγή z διευθύνσεων.
+account.altcoin.popup.XZC.msg=Όταν χρησιμοποιείς Zcoin μπορείς να χρησιμοποιήσεις μονάχα διαφανείς (ανιχνεύσιμες) διευθύνσεις, και όχι μη ανιχνεύσιμες διευθύνσεις, καθώς η διαμεσολαβήτρια ή ο διαιτητής δεν θα μπορεί να επαληθεύσει τη συναλλαγή με μη ανιχνεύσιμες διευθύνσεις στον block explorer.
account.altcoin.popup.grin.msg=GRIN requires an interactive process between the sender and receiver to create the transaction. Be sure to follow the instructions from the GRIN project web page to reliably send and receive GRIN (the receiver needs to be online or at least be online during a certain time frame). \n\nBisq supports only the Grinbox (Wallet713) wallet URL format. \n\nThe GRIN sender is required to provide proof that they have sent GRIN successfully. If the wallet cannot provide that proof, a potential dispute will be resolved in favor of the GRIN receiver. Please be sure that you use the latest Grinbox software which supports the transaction proof and that you understand the process of transferring and receiving GRIN as well as how to create the proof. \n\nSee https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only for more information about the Grinbox proof tool.
account.altcoin.popup.beam.msg=BEAM requires an interactive process between the sender and receiver to create the transaction. \n\nBe sure to follow the instructions from the BEAM project web page to reliably send and receive BEAM (the receiver needs to be online or at least be online during a certain time frame). \n\nThe BEAM sender is required to provide proof that they sent BEAM successfully. Be sure to use wallet software which can produce such a proof. If the wallet cannot provide the proof a potential dispute will be resolved in favor of the BEAM receiver.
-account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh).
+account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh).
+
+account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash.
account.fiat.yourFiatAccounts=Οι λογαριασμοί σου εθνικών νομισμάτων
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=Bonded role unit factor in BSQ
dao.param.ISSUANCE_LIMIT=Όριο έκδοσης ανά κύκλο σε BSQ
dao.param.currentValue=Τρέχουσα αξία: {0}
+dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1})
dao.param.blocks={0} blocks
dao.results.cycle.duration.label=Διάρκεια {0}
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} block(s)
dao.results.cycle.value.postFix.isDefaultValue=(προεπιλεγμένη τιμή)
dao.results.cycle.value.postFix.hasChanged=(έχει αλλαχθεί κατά την ψηφοφορία)
-dao.results.invalidVotes=Είχαμε άκυρες ψήφους σε αυτόν τον κύκλο ψηφοφορίας. Αυτό μπορεί να συμβεί, αν μια ψήφος δεν είχε διανεμηθεί σωστά στο δίκτυο P2P.\n{0}
+dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=Ακαθόριστο
@@ -1361,7 +1436,7 @@ dao.bond.bondedRoleType.DOMAIN_NAME_HOLDER=Κάτοχος ονόματος domai
# suppress inspection "UnusedProperty"
dao.bond.bondedRoleType.DNS_ADMIN=Διαχειριστής DNS
# suppress inspection "UnusedProperty"
-dao.bond.bondedRoleType.MEDIATOR=Mediator
+dao.bond.bondedRoleType.MEDIATOR=Διαμεσολαβητής
# suppress inspection "UnusedProperty"
dao.bond.bondedRoleType.ARBITRATOR=Διαμεσολαβητής
# suppress inspection "UnusedProperty"
@@ -1503,7 +1578,7 @@ dao.proposal.create.publish=Κοινοποίηση πρότασης
dao.proposal.create.publishing=Κοινοποίηση πρότασης σε εξέλιξη...
dao.proposal=πρόταση
dao.proposal.display.type=Τύπος πρότασης
-dao.proposal.display.name=Όνομα/ψευδώνυμο
+dao.proposal.display.name=Exact GitHub username
dao.proposal.display.link=Σύνδεσμος προς λεπτομερείς πληροφορίες
dao.proposal.display.link.prompt=Σύνδεσμος προς πρόταση
dao.proposal.display.requestedBsq=Αιτούμενο ποσό σε BSQ
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=Τρέχουσα ψήφος: "{0}".
dao.proposal.display.myVote.accepted=Αποδεκτή
dao.proposal.display.myVote.rejected=Καταψηφισμένη
dao.proposal.display.myVote.ignored=Αγνοήθηκε
-dao.proposal.myVote.summary=Ψηφίστηκαν: {0}• Βάρος ψήφου: {1} (κερδισμένα: {2} + ενίσχυση: {3})•
+dao.proposal.display.myVote.unCounted=Vote was not included in result
+dao.proposal.myVote.summary=Voted: {0}; Vote weight: {1} (earned: {2} + stake: {3}) {4}
dao.proposal.myVote.invalid=Η ψήφος ήταν άκυρη
dao.proposal.voteResult.success=Αποδεκτή
@@ -1680,6 +1756,7 @@ dao.monitor.daoState.utxoConflicts=Διενέξεις UTXO
dao.monitor.daoState.utxoConflicts.blockHeight=Ύψος μπλοκ: {0}
dao.monitor.daoState.utxoConflicts.sumUtxo=Άθροισμα συνόλου UTXO: {0} BSQ
dao.monitor.daoState.utxoConflicts.sumBsq=Άθροισμα συνόλου BSQ: {0} BSQ
+dao.monitor.daoState.checkpoint.popup=DAO state is not in sync with the network. After restart the DAO state will resync.
dao.monitor.proposal.headline=Στάδιο προτάσεων
dao.monitor.proposal.table.headline=Αλυσίδα hash σταδίου προτάσεων
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=Συναλλαγές BSQ
dao.factsAndFigures.dashboard.marketPrice=Δεδομένα αγοράς
dao.factsAndFigures.dashboard.price=Τελευταία τιμής συναλλαγής BSQ/BTC (στο Bisq)
+dao.factsAndFigures.dashboard.avgPrice90=Μέση τιμή συναλλαγών BSQ/BTC 90 ημερών
+dao.factsAndFigures.dashboard.avgPrice30=Μέση τιμή συναλλαγών BSQ/BTC 30 ημερών
dao.factsAndFigures.dashboard.marketCap=Κεφαλαιοποίηση αγοράς (βάση τιμής συναλλαγών)
dao.factsAndFigures.dashboard.availableAmount=Σύνολο διαθέσιμων BSQ
@@ -1769,10 +1848,6 @@ displayUpdateDownloadWindow.download.openDir=Άνοιγμα καταλόγου
disputeSummaryWindow.title=Περίληψη
disputeSummaryWindow.openDate=Ημερομηνία ανοίγματος αιτήματος
disputeSummaryWindow.role=Ρόλος συναλλασσόμενου
-disputeSummaryWindow.evidence=Αποδεικτικά στοιχεία
-disputeSummaryWindow.evidence.tamperProof=Αδιάσειστα στοιχεία
-disputeSummaryWindow.evidence.id=Επαλήθευση ταυτότητας
-disputeSummaryWindow.evidence.video=Βίντεο/Εικόνες
disputeSummaryWindow.payout=Ποσό αποπληρωμής συναλλαγής
disputeSummaryWindow.payout.getsTradeAmount=Ο BTC {0} λαμβάνει το ποσό αποπληρωμής συναλλαγής
disputeSummaryWindow.payout.getsAll=Ο BTC {0} λαμβάνει το σύνολο
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=Τράπεζα
disputeSummaryWindow.summaryNotes=Περιληπτικές σημειώσεις
disputeSummaryWindow.addSummaryNotes=Πρόσθεσε περιληπτικές σημειώσεις
disputeSummaryWindow.close.button=Κλείσε το αίτημα
-disputeSummaryWindow.close.msg=Το αίτημα έκλεισε στις {0}\n\nΠερίληψη:\n{1} κατέθεσε γνήσια στοιχεία: {2}\n{3} έκανε επαλήθευση ταυτότητας: {4}\n{5} επικοινώνησε μέσω/έστειλε video: {6}\nΠοσό πληρωμής για αγοραστή BTC: {7}\nΠοσό πληρωμής για πωλητή BTC: {8}\n\nΣημειώσεις περίληψης:\n{9}
+disputeSummaryWindow.close.msg=Ticket closed on {0}\n\nSummary:\nPayout amount for BTC buyer: {1}\nPayout amount for BTC seller: {2}\n\nSummary notes:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\nNext steps:\nOpen ongoing trade and accept or reject the suggested mediation
disputeSummaryWindow.close.closePeer=Κλείσε και το αίτημα του έτερου συναλλασσόμενου (trading peer)!
+disputeSummaryWindow.close.txDetails.headline=Publish refund transaction
+disputeSummaryWindow.close.txDetails.buyer=Ο αγοραστής λαμβάνει {0} στη διεύθυνση: {1}\n
+disputeSummaryWindow.close.txDetails.seller=Ο πωλητής λαμβάνει {0} στη διεύθυνση: {1}\n
+disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction?
emptyWalletWindow.headline={0} επείγον εργαλείο πορτοφολιού
emptyWalletWindow.info=Χρησιμοποίησέ το μονάχα σε επείγουσες περιπτώσεις, εάν είναι αδύνατη η πρόσβαση στα κεφάλαιά σου μέσω του Περιβάλλοντος Χρήστη -κεντρική οθόνη-.\n\nΛάβε υπόψιν πως όλες οι ανοιχτές προσφορές θα κλείσουν αυτομάτως κατά τη χρήση του.\n\nΠριν τη χρήση αυτού του εργαλείου, αποθήκευσε το φάκελο δεδομένων. Μπορείς να το κάνεις αυτόι στο \"Λογαριασμός/Αποθήκευση\".\n\nΠαρακαλώ ανάφερέ μας το πρόβλημα και κατάθεσε αναφορά σφάλματος στο GitHub ή στο Bisq φόρουμ, ώστε να ερευνήσουμε τα αίτια του προβλήματος.
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=Έχεις ανοιχτές προσφορές
emptyWalletWindow.openOffers.yes=Ναι, είμαι σίγουρος
emptyWalletWindow.sent.success=Το υπόλοιπο του πορτοφολιού σου μεταφέρθηκε επιτυχώς.
-enterPrivKeyWindow.headline=Εγγραφή ανοιχτή μόνο για προσκαλεσμένους διαμεσολαβητές.
+enterPrivKeyWindow.headline=Enter private key for registration
filterWindow.headline=Διόρθωσε λίστα φίλτρων
filterWindow.offers=Φιλτραρισμένες προσφορές (διαχωρισμός με κόμμα)
@@ -1815,6 +1895,8 @@ filterWindow.accounts=Φιλτραρισμένα δεδομένα λογαρια
filterWindow.bannedCurrencies=Φιλτραρισμένοι κωδικοί νομισμάτων (διαχωρισμός με κόμμα)
filterWindow.bannedPaymentMethods=Ταυτότητες φιλτραρισμένων μεθόδων πληρωμών (διαχωρισμός με κόμμα)
filterWindow.arbitrators=Φιλτραρισμένοι διαμεσολαβητές (διαχωρισμός διευθύνσεων onion με κόμμα)
+filterWindow.mediators=Filtered mediators (comma sep. onion addresses)
+filterWindow.refundAgents=Filtered refund agents (comma sep. onion addresses)
filterWindow.seedNode=Φιλτραρισμένοι κόμβοι seed (διαχωρισμός διευθύνσεων onion με κόμμα)
filterWindow.priceRelayNode=Φιλτραρισμένοι κόμβοι αναμετάδοσης τιμών (διαχωρισμός διευθύνσεων onion με κόμμα)
filterWindow.btcNode=Φιλτραρισμένοι κόμβοι Bitcoin (διαχωρισμός διευθύνσεων + θυρών με κόμμα)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(ταυτότητα τράπεζας maker BIC/
offerDetailsWindow.offerersBankName=(όνομα τράπεζας maker)
offerDetailsWindow.bankId=Ταυτότητα τράπεζας (π.χ. BIC ή SWIFT)
offerDetailsWindow.countryBank=Χώρα τράπεζας Maker
-offerDetailsWindow.acceptedArbitrators=Αποδεκτοί διαμεσολαβητές
offerDetailsWindow.commitment=Δέσμευση
offerDetailsWindow.agree=Συμφωνώ
offerDetailsWindow.tac=Όροι και προϋποθέσεις
@@ -1883,6 +1964,7 @@ tradeDetailsWindow.tradeDate=Ημερομηνία συναλλαγής
tradeDetailsWindow.txFee=Αμοιβή εξόρυξης
tradeDetailsWindow.tradingPeersOnion=Διεύθυνση onion συναλλασσόμενων peers
tradeDetailsWindow.tradeState=Κατάσταση συναλλαγής
+tradeDetailsWindow.agentAddresses=Διαιτήτρια/Διαμεσολαβητής
walletPasswordWindow.headline=Εισήγαγε κωδικό για ξεκλείδωμα
@@ -1945,10 +2027,11 @@ popup.warning.incompatibleDB=Ανιχνεύτηκαν αρχεία ασύμβα
popup.warning.startupFailed.twoInstances=Το Bisq λειτουργεί ήδη. Δεν μπορεί να τρέχει δύο φορές.
popup.warning.cryptoTestFailed=Μάλλον χρησιμοποιείς ένα self compiled binary και δεν έχεις ακολουθήσει τις οδηγίες στη διεύθυνση https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nΑν αυτό δεν ισχύει και χρησιμοποιείς το επίσημο Bisq binary, ανάφερε το σφάλμα στην GitHub σελίδα.\nΣφάλμα={0}
popup.warning.tradePeriod.halfReached=Η συναλλαγή σου με ταυτότητα {0} έφτασε το μισό της επιτρεπόμενης χρονικής περιόδου και δεν έχει ολοκληρωθεί ακόμα.\n\nΗ περίοδος συναλλαγής κλείνει στις {1}\n\nΈλεγξε την κατάσταση της συναλλαγής στο \"Χαρτοφυλάκιο/Ανοιχτές συναλλαγές\" για περαιτέρω πληροφορίες.
-popup.warning.tradePeriod.ended=Η συναλλαγή σου με ταυτότητα {0} έφτασε τη μέγιστη επιτρεπόμενη χρονική περίοδο χωρίς να ολοκληρωθεί.\n\nΗ περίοδος συναλλαγής έκλεισε στις {1}\n\nΈλεγξε τη συναλλαγή σου στο \"Χαρτοφυλάκιο/Ανοιχτές συναλλαγές\" για να επικοινωνήσεις με τον διαμεσολαβητή.
+popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
popup.warning.noTradingAccountSetup.headline=Δεν έχεις δημιουργήσει λογαριασμό συναλλαγών
popup.warning.noTradingAccountSetup.msg=Πρέπει να δημιουργήσεις ένα λογαριασμό εθνικού νομίσματος ή κρυπτονομίσματος πριν σου επιτραπεί να δημιουργήσεις μια προσφορά.\nΘέλεις να δημιουργήσεις ένα λογαριασμό τώρα;
popup.warning.noArbitratorsAvailable=Δεν υπάρχουν διαθέσιμοι διαμεσολαβητές.
+popup.warning.noMediatorsAvailable=There are no mediators available.
popup.warning.notFullyConnected=Πρέπει να περιμένεις έως ότου είσαι πλήρως συνδεδεμένος με το δίκτυο.\nΑυτό ίσως διαρκέσει μέχρι 2 λεπτά κατά την εκκίνηση.
popup.warning.notSufficientConnectionsToBtcNetwork=Πρέπει να περιμένεις μέχρι να έχεις τουλάχιστον {0} συνδέσεις στο Bitcoin δίκτυο.
popup.warning.downloadNotComplete=Πρέπει να περιμένεις μέχρι την πλήρη λήψη των Bitcoin blocks.
@@ -1958,13 +2041,13 @@ popup.warning.examplePercentageValue=Παρακαλώ εισήγαγε ποσο
popup.warning.noPriceFeedAvailable=Δεν υπάρχει διαθέσιμη τροφοδοσία τιμής για αυτό το νόμισμα. Δεν μπορείς να θέσεις τιμή βάση ποσοστού.\nΕπίλεξε την καθορισμένη τιμή.
popup.warning.sendMsgFailed=Η αποστολή μηνύματος στο έτερο συναλλασσόμενο απέτυχε.\nΠροσπάθησε ξανά και αν επαναληφθεί ανάφερε το σφάλμα.
popup.warning.insufficientBtcFundsForBsqTx=Δεν έχεις επαρκή κεφάλαιο BTC για να πληρώσεις την αμοιβή εξόρυξης αυτής της συναλλαγής.\nΧρηματοδότησε το BTC πορτοφόλι σου.\nΥπολειπόμενο κεφάλαιο: {0}
-popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
-popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the Bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the Bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
popup.warning.insufficientBsqFundsForBtcFeePayment=Δεν έχεις επαρκή κεφάλαιο BSQ για να πληρώσεις την προμήθεια συναλλαγής σε BSQ. Μπορείς να πληρώσεις την αμοιβή σε BTC ή να χρηματοδοτήσεις το BSQ πορτοφόλι σου. Μπορείς να αγοράσεις BSQ στο Bisq.\n\nΥπολειπόμενο κεφάλαιο BSQ: {0}
popup.warning.noBsqFundsForBtcFeePayment=Το BSQ πορτοφόλι σου δεν έχει επαρκή κεφάλαια για την πληρωμή της προμήθειας συναλλαγής σε BSQ.
popup.warning.messageTooLong=Το μήνυμά σου υπερβαίνει το μέγιστο επιτρεπόμενο μέγεθος. Στείλ' το τμηματικά ή ανέβασέ το σε υπηρεσία όπως η https://pastebin.com.
-popup.warning.lockedUpFunds=Έχεις κλειδωμένα κεφάλαια λόγω αποτυχημένης συναλλαγής.\nΚλειδωμένο υπόλοιπο: {0}\nΔιεύθυνση κατάθεσης: {1}\nΤαυτότητα συναλλαγής: {2}\n\nΆνοιξε ένα αίτημα υποστήριξης επιλέγοντας τη συναλλαγή στην οθόνη εκκρεμών συναλλαγών και πατώντας \"alt + o\" ή \"option + o\".
+popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"."
popup.warning.nodeBanned=Ένας από τους κόμβους {0} απαγορεύτηκε. Επανεκκίνησε την εφαρμογή για να βεβαιωθείς πως δεν δεν έχεις συνδεθεί στον απαγορευμένο κόμβο.
popup.warning.priceRelay=αναμετάδοση τιμής
@@ -1993,19 +2076,36 @@ popup.shutDownInProgress.msg=Η διακοπή λειτουργίας ίσως
popup.attention.forTradeWithId=Απαιτείται προσοχή σχετικά με τη συναλλαγή με ταυτότητα {0}
-popup.roundedFiatValues.headline=Νέο μέτρο απορρήτου: Στρογγυλοποιημένες τιμές χρήματος
-popup.roundedFiatValues.msg=Προς αύξηση του απορρήτου της συναλλαγής σου, το ποσό {0} στρογγυλοποιήθηκε.\n\nΑναλόγως της έκδοσης, θα πληρώσεις ή θα παραλάβεις τιμές με δεκαδικά ψηφία ή στρογγυλοποιημένες.\n\nΑπό εδώ και πέρα. όλες οι τιμές είναι συμβατές με το πρωτόκολλο συναλλαγών.\n\nΛάβε υπόψιν πως οι τιμές BTC μετατρέπονται αυτομάτως ώστε να ανταποκρίνονται όσο το δυνατόν στο στρογγυλοποιημένο ποσό χρημάτων.
-
popup.info.multiplePaymentAccounts.headline=Διαθέσιμοι πολλαπλοί λογαριασμοί πληρωμών
popup.info.multiplePaymentAccounts.msg=Έχεις διαθέσιμους πολλαπλούς λογαριασμούς πληρωμών για αυτή την προσφορά. Βεβαιώσου που επέλεξες τον σωστό.
-popup.dao.launch.headline=Το σύνολο του οράμτός μας υλοποιήθηκε
-popup.dao.launch.governance.title=Διακυβέρνηση
-popup.dao.launch.governance=Bisq’s trading network was already decentralized. \nWith the Bisq DAO, Bisq’s leadership is now decentralized too, making Bisq exceptionally resistant to censorship.
-popup.dao.launch.trading.title=Συναλλαγή
-popup.dao.launch.trading=Με τη συναλλαγή BSQ (χρωματισμένα bitcoin) μπορείς να συμμετάσχεις στη διακυβέρνηση του DAO. Μπορείς να αγοράσεις και να πουλήσεις BSQ όπως κάθε άλλο νόμισμα στο Bisq.
-popup.dao.launch.cheaperFees.title=Φθηνότερες προμήθειες
-popup.dao.launch.cheaperFees=90% έκπτωση στις προμήθειες συναλλαγών όταν χρησιμοποιείς BSQ. Εξοικονόμησε χρήματα και παράλληλα υποστήριξε το εγχείρημα!
+popup.news.launch.headline=Two Major Updates
+popup.news.launch.accountSigning.headline=ΕΠΙΚΥΡΩΣΗ ΛΟΓΑΡΙΑΣΜΟΥ
+popup.news.launch.accountSigning.description=Αναίρεσε το όριο συναλλαγής των 0.01 BTC αγοράζοντας BTC από έναν επικυρωμένο συναλλασσόμενο.
+popup.news.launch.ntp.headline=ΝΕΟ ΠΡΩΤΟΚΟΛΛΟ ΣΥΝΑΛΛΑΓΩΝ
+popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant.
+
+popup.accountSigning.selectAccounts.headline=Επίλεξε λογαριασμούς πληρωμών
+popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign.
+popup.accountSigning.selectAccounts.signAll=Sign all payment methods
+popup.accountSigning.selectAccounts.datePicker=Select point of time until which accounts will be signed
+
+popup.accountSigning.confirmSelectedAccounts.headline=Επιβεβαίωσε επιλεγμένους λογαριασμούς πληρωμών
+popup.accountSigning.confirmSelectedAccounts.description=Based on your input, {0} payment accounts will be selected.
+popup.accountSigning.confirmSelectedAccounts.button=Επιβεβαίωσε λογαριασμούς πληρωμών
+popup.accountSigning.signAccounts.headline=Επιβεβαίωσε επικύρωση λογαριασμών πληρωμών
+popup.accountSigning.signAccounts.description=Based on your selection, {0} payment accounts will be signed.
+popup.accountSigning.signAccounts.button=Επικύρωση λογαριασμών πληρωμών
+popup.accountSigning.signAccounts.ECKey=Εισήγαγε προσωπικό κλειδί διαιτητή
+popup.accountSigning.signAccounts.ECKey.error=Εσφαλμένο ECKey διαιτητή
+
+popup.accountSigning.success.headline=Συγχαρητήρια
+popup.accountSigning.success.description=Οι {0} λογαριασμοί πληρωμών επικυρώθηκαν επιτυχώς!
+popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0}
+popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1}
+popup.accountSigning.peerLimitLifted=Αναιρέθηκε ο αρχικός περιορισμός για έναν από τους λογαριασμούς σου.\n\n{0}
+popup.accountSigning.peerSigner=One of your accounts is mature enough to sign other payment accounts and the initial limit for one of your accounts has been lifted.\n\n{0}
####################################################################
# Notifications
@@ -2071,6 +2171,7 @@ list.currency.editList=Διόρθωση λίστας νομισμάτων
table.placeholder.noItems=Προς το παρόν δεν υπάρχουν διαθέσιμες {0}
table.placeholder.noData=Προς το παρόν δεν υπάρχουν διαθέσιμα δεδομένα
+table.placeholder.processingData=Επεξεργασία δεδομένων...
peerInfoIcon.tooltip.tradePeer=Συναλλασσόμενου
@@ -2093,7 +2194,8 @@ peerInfo.title=Πληροφορίες peer
peerInfo.nrOfTrades=Ολοκληρωμένες συναλλαγές
peerInfo.notTradedYet=Δεν έχεις συναλλαχθεί με αυτόν τον χρήστη μέχρι στιγμής.
peerInfo.setTag=Θέσε tag για αυτόν τον peer
-peerInfo.age=Ηλικία λογαριασμού πληρωμών
+peerInfo.age.noRisk=Ηλικία λογαριασμού πληρωμών
+peerInfo.age.chargeBackRisk=Παρελθών χρόνος από επικύρωση
peerInfo.unknownAge=Άγνωστη ηλικία
addressTextField.openWallet=Άνοιξε το προκαθορισμένο Bitcoin πορτοφόλι σου
@@ -2253,6 +2355,7 @@ payment.accepted.banks=Αποδεκτές τράπεζες (ID)
payment.mobile=Αριθμός κινητού
payment.postal.address=Ταχυδρομική διεύθυνση
payment.national.account.id.AR=Αριθμός CBU
+shared.accountSigningState=Κατάσταση επικύρωσης λογαριασμών
#new
payment.altcoin.address.dyn={0} διεύθυνση
@@ -2261,7 +2364,7 @@ payment.accountNr=Αριθμός λογαριασμού
payment.emailOrMobile=Email ή αριθμός κινητού τηλεφώνου
payment.useCustomAccountName=Χρήση προεπιλεγμένου ονόματος λογαριασμού
payment.maxPeriod=Μέγιστη επιτρεπόμενη χρονική περίοδος συναλλαγής
-payment.maxPeriodAndLimit=Μέγιστη διάρκεια συναλλαγής: {0} / Μέγιστο όριο συναλλαγής: {1} / Ηλικία λογαριασμού: {2}
+payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3}
payment.maxPeriodAndLimitCrypto=Μέγιστη διάρκεια συναλλαγής: {0} / Μέγιστο όριο συναλλαγής: {1}
payment.currencyWithSymbol=Νόμισμα: {0}
payment.nameOfAcceptedBank=Όνομα αποδεκτής τράπεζας
@@ -2284,12 +2387,13 @@ payment.moneyGram.info=Όταν χρησιμοποιείς MoneyGram, ο αγο
payment.westernUnion.info=Όταν χρησιμοποιείς Western Union, ο αγοραστής BTC πρέπει να στείλει μέσω email το MTCN (αριθμός εντοπισμού) και φωτογραφία της απόδειξης στον πωλητή. Στην απόδειξη θα πρέπει να διακρίνεται καθαρά Στην απόδειξη θα πρέπει να διακρίνεται καθαρά το πλήρες όνομα του πωλητή, η χώρα, η πόλη και το ποσό. Το email του πωλητή θα δοθεί στον αγοραστή κατά τη διαδικασία συναλλαγής.
payment.halCash.info=Κατά τη χρήση του HalCash ο αγοραστής BTC απαιτείται να στείλει στον πωλητή BTC τον κωδικό HalCash μέσω γραπτού μηνύματος κινητού τηλεφώνου.\n\nΒεβαιώσου πως δεν θα υπερβείς το μέγιστο ποσό που επιτρέπει η τράπεζά σου για αποστολή προς τo HalCash. Το ελάχιστον ποσό ανά ανάληψη είναι 10 Ευρώ και το μέγιστο ποσό είναι 600 Ευρώ. Για επαναλαμβανόμενες αναλήψεις είναι 3000 Ευρώ ανά παραλήπτη ανά ημέρα, και 6000 Ευρώ ανά παραλήπτη ανά μήνα. Επαλήθευσε αυτά τα όρια με την τράπεζά σου, ώστε να βεβαιωθείς πως χρησιμοποιούν τα ίδια όρια που παραθέτουμε εδώ.\n\nΤο ποσό ανάληψης θα πρέπει να είναι πολλαπλάσιο των 10 Ευρώ, καθώς δεν μπορείς να τραβήξεις άλλα ποσά από ένα ΑΤΜ. Κατά τη δημιουργία και αποδοχή μιας προσφοράς, η Διεπαφή Χρήστη (UI) θα προσαρμόσει το ποσό BTC έτσι, ώστε το πόσο σε Ευρώ να είναι σωστό. Δεν μπορείς να χρησιμοποιήσεις τιμή βασισμένη στην τιμή της αγοράς, καθώς το ποσό σε Ευρώ θα μετατρέπεται κατά την αλλαγή των τιμών.\n\nΣε περίπτωση διένεξης ο αγοραστής BTC απαιτείται να παραθέσει απόδειξη πως έστειλε το ποσό σε Ευρώ.
payment.limits.info=Λάβε υπόψιν πως όλες οι συναλλαγές μέσω τραπεζών περιέχουν ρίσκο αντιλογισμού χρέωσης.\n\nΓια να μετριάσει το ρίσκο, το Bisq θέτει όρια ανά συναλλαγή βασισμένα σε δύο παράγοντες:\n\n1. Τις πιθανότητες να συμβεί αντιλογισμός χρέωσης για τη μέθοδο πληρωμής που χρησιμοποιείται\n2. Την ηλικία λογαριασμού για αυτή τη μέθοδο πληρωμής.\n\nΟ λογαριασμός που δημιουργείς τώρα είναι καινούργιος και η ηλικία του είναι μηδέν. Καθώς η ηλικία του λογαριασμού σου θα μεγαλώνει, τα όρια ανά συναλλαγή θα αυξάνονται ως εξής:\n\n● Κατά τον 1ο μήνα το όριο ανά συναλλαγή θα είναι {0}\n● Κατά το 2ο μήνα το όριο ανά συναλλαγή θα είναι {1}\n● Μετά το 2ο μήνα το όριο ανά συναλλαγή θα είναι {2}\n\nΣημείωσε πως δεν υπάρχει όριο στο συνολικό πλήθος συναλλαγών.
+payment.limits.info.withSigning=Για να μετριάσει το ρίσκο αντιλογισμού χρέωσης, το Bisq θέτει όρια ανά συναλλαγή βασισμένα σε δύο παράγοντες:\n\n1. Τις πιθανότητες να συμβεί αντιλογισμός χρέωσης για τη μέθοδο πληρωμής που χρησιμοποιείται\n2. Την κατάσταση επικύρωσης του λογαριασμού .\n\nΟ λογαριασμός πληρωμών που δημιουργείς τώρα εμπεριέχει ρίσκο αντιλογισμού χρέωσης και δεν είναι επικυρωμένος από διαμεσολαβητή ή έμπιστο συναλλασσόμενο, οπότε περιορίζεται σε {0} αγορά ανά συναλλαγή Αφού επικυρωθεί, το όριο αγοράς ανά συναλλαγή θα αυξάνεται ως εξής:\n\n● Πριν την επικύρωση και μέχρι 30 ημέρες μετά, το όριο αγοράς ανά συναλλαγή θα είναι {0}\n● 30 ημέρες μετά την επικύρωση το όριο αγοράς ανά συναλλαγή θα είναι {1}\n● 60 ημέρες μετά την επικύρωση το όριο αγοράς ανά συναλλαγή θα είναι {2}\n\nΌρια πωλήσεων δεν επηρεάζονται από την επικύρωση του λογαριασμού και αυξάνονται καθώς αυξάνεται η ηλικία του λογαριασμού. Περισσότερες πληροφορίες στην ιστοσελίδα https://docs.bisq.network/payment-methods#account-signing.\n\nΔεν υπάρχει όριο στο συνολικό πλήθος συναλλαγών.
payment.cashDeposit.info=Επιβεβαίωσε πως η τράπεζά σου επιτρέπει την αποστολή μετρητών σε λογαριασμούς τρίτων. Για παράδειγμα, η Bank of America και η Wells Fargo δεν επιτρέπουν πλέον τέτοιου είδους καταθέσεις.
payment.revolut.info=Επιβεβαίωσε πως ο αριθμός τηλεφώνου που χρησιμοποίησες στον Revolut λογαριασμό σου, είναι καταχωρημένος στη Revolut, διαφορετικά ο αγοραστής BTC δεν θα μπορεί να σου στείλει την πληρωμή.
-payment.usPostalMoneyOrder.info=Money orders are one of the more private fiat purchase methods available on Bisq.\n\nHowever, please be aware of potentially increased risks associated with their use. Bisq will not bear any responsibility in case a sent money order is stolen, and the arbitrators will in such cases award the BTC to the sender of the money order, provided they can produce tracking information and receipts. It may be advisable for the sender to write the BTC seller's name on the money order, in order to minimize the risk that the money order is cashed by someone else.
+payment.usPostalMoneyOrder.info=Money orders are one of the more private fiat purchase methods available on Bisq.\n\nHowever, please be aware of potentially increased risks associated with their use. Bisq will not bear any responsibility in case a sent money order is stolen, and the mediator or arbitrator will in such cases award the BTC to the sender of the money order, provided they can produce tracking information and receipts. It may be advisable for the sender to write the BTC seller's name on the money order, in order to minimize the risk that the money order is cashed by someone else.
payment.f2f.contact=Στοιχεία επινοινωνίας
payment.f2f.contact.prompt=Πώς θέλεις να επικοινωνήσει μαζί σου ο έτερος συναλλασσόμενος; (email, αριθμός τηλεφώνου, ...)
@@ -2299,11 +2403,15 @@ payment.f2f.optionalExtra=Προαιρετικές πρόσθετες πληρο
payment.f2f.extra=Πρόσθετες πληροφορίες
payment.f2f.extra.prompt=Ο maker μπορεί να ορίσει "όρους και προϋποθέσεις" ή να συμπεριλάβει κάποια πληροφορία επαφής. Αυτά θα εμφανιστούν στην προσφορά.
-payment.f2f.info="Κατά πρόσωπο" συναλλαγές διέπονται από διαφορετικούς κανόνες και ενέχουν διαφορετικούς κινδύνους από διαδικτυακές συναλλαγές.\n\nΟι βασικές διαφορές είναι:\n● Οι συναλλασσόμενοι απαιτείται να ανταλλάξουν πληροφορίες σχετικά με το σημείο και την ώρα συνάντησης μέσω των παρεχόμενων στοιχείων επικοινωνίας.\n● Οι συναλλασσόμενοι απαιτείται να φέρουν τους φορητούς τους υπολογιστές και να προβούν σε επιβεβαίωση της αποστολής και λήψης πληρωμής στο σημείο συνάντησης.\n● Αν ο maker έχει ειδικούς "όρους και προϋποθέσεις", απαιτείται να τους δηλώσει στο πεδίο "Πρόσθετες πληροφορίες" του λογαριασμού.\n● Αποδεχόμενος μια προσφορά ο taker συμφωνεί με τους δηλωμένους "όρους και προϋποθέσεις" του maker.\n● Σε περίπτωση διένεξης ο διαμεσολαβητής δεν μπορεί να βοηθήσει σημαντικά, καθώς είναι δύσκολο να λάβει αδιάσειστα στοιχεία του τι συνέβη κατά τη συνάντηση. Σε αυτές τις περιπτώσεις τα κεφάλαια BTC ίσως κλειδωθούν δια παντός ή έως ότου οι συναλλασσόμενοι έρθουν σε συμφωνία.\n\nΣιγουρέψου πως κατανοείς πλήρως τις διαφορές των "κατά πρόσωπο" συναλλαγών μέσω των οδηγιών και των προτάσεων στο: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
+payment.f2f.info="Κατά πρόσωπο" συναλλαγές διέπονται από διαφορετικούς κανόνες και ενέχουν διαφορετικούς κινδύνους από διαδικτυακές συναλλαγές.\n\nΟι βασικές διαφορές είναι:\n● Οι συναλλασσόμενοι απαιτείται να ανταλλάξουν πληροφορίες σχετικά με το σημείο και την ώρα συνάντησης μέσω των παρεχόμενων στοιχείων επικοινωνίας.\n● Οι συναλλασσόμενοι απαιτείται να φέρουν τους φορητούς τους υπολογιστές και να προβούν σε επιβεβαίωση της αποστολής και λήψης πληρωμής στο σημείο συνάντησης.\n● Αν η maker έχει ειδικούς "όρους και προϋποθέσεις", απαιτείται να τους δηλώσει στο πεδίο "Πρόσθετες πληροφορίες" του λογαριασμού.\n● Αποδεχόμενος μια προσφορά ο taker συμφωνεί με τους δηλωμένους "όρους και προϋποθέσεις" της maker.\n● Σε περίπτωση διένεξης ο διαμεσολαβητής ή η διαιτήτρια δεν μπορεί να βοηθήσει σημαντικά, καθώς είναι δύσκολο να λάβει αδιάσειστα στοιχεία του τι συνέβη κατά τη συνάντηση. Σε αυτές τις περιπτώσεις τα κεφάλαια BTC ίσως κλειδωθούν δια παντός ή έως ότου οι συναλλασσόμενοι έρθουν σε συμφωνία.\n\nΣιγουρέψου πως κατανοείς πλήρως τις διαφορές των "κατά πρόσωπο" συναλλαγών μέσω των οδηγιών και των προτάσεων στο: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
payment.f2f.info.openURL=Άνοιγμα ιστοσελίδας
-payment.f2f.offerbook.tooltip.countryAndCity=Νομός και πόλη: {0} / {1}
+payment.f2f.offerbook.tooltip.countryAndCity=Χώρα και πόλη: {0} / {1}
payment.f2f.offerbook.tooltip.extra=Πρόσθετες πληροφορίες: {0}
+payment.japan.bank=Τράπεζα
+payment.japan.branch=Παράρτημα
+payment.japan.account=Λογαριασμός
+payment.japan.recipient=Όνομα
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -2317,6 +2425,7 @@ CASH_DEPOSIT=Κατάθεση μετρητών
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=Κατά πρόσωπο
+JAPAN_BANK=Τράπεζα Japan Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=Τράπεζες εντός ίδιας χώρας
@@ -2334,6 +2443,8 @@ MONEY_GRAM_SHORT=MoneyGram
WESTERN_UNION_SHORT=Western Union
# suppress inspection "UnusedProperty"
F2F_SHORT=Κατά πρόσωπο (F2F)
+# suppress inspection "UnusedProperty"
+JAPAN_BANK_SHORT=Japan Furikomi
# Do not translate brand names
# suppress inspection "UnusedProperty"
@@ -2499,3 +2610,8 @@ validation.mustBeDifferent=Η εισαγόμενη τιμή πρέπει να ε
validation.cannotBeChanged=Η παράμετρος δεν μπορεί να μετατραπεί
validation.numberFormatException=Number format exception {0}
validation.mustNotBeNegative=Η τιμή δεν μπορεί να είναι αρνητική
+validation.phone.missingCountryCode=Απαιτείται κωδικός κράτους δύο γραμμάτων για να επαληθευτεί ο τηλεφωνικός αριθμός
+validation.phone.invalidCharacters=Ο αριθμός τηλεφώνου {0} περιέχει μη έγκυρους χαρακτήρες
+validation.phone.insufficientDigits=Όχι αρκετά ψηφία στο {0} για να είναι έγκυρος αριθμός τηλεφώνου
+validation.phone.tooManyDigits=Πολλά ψηφία στο {0} για να είναι έγκυρος αριθμός τηλεφώνου
+validation.phone.invalidDialingCode=Ο κωδικός κλήσης χώρας στον αριθμό {0} δεν είναι έγκυρος για τη χώρα {1}. Ο σωστός κωδικός κλήσης είναι {2}.
diff --git a/core/src/main/resources/i18n/displayStrings_es.properties b/core/src/main/resources/i18n/displayStrings_es.properties
index c7b9c1276e..6c683ac5ba 100644
--- a/core/src/main/resources/i18n/displayStrings_es.properties
+++ b/core/src/main/resources/i18n/displayStrings_es.properties
@@ -62,6 +62,10 @@ shared.priceWithCur=Precio en {0}
shared.priceInCurForCur=precio en {0} por 1 {1}
shared.fixedPriceInCurForCur=Precio fijo en {0} por 1 {1}
shared.amount=Cantidad
+shared.txFee=Tasa de transacción
+shared.makerFee=Tasa de creador
+shared.buyerSecurityDeposit=Depósito de comprador
+shared.sellerSecurityDeposit=Depósito de vendedor
shared.amountWithCur=Cantidad en {0}
shared.volumeWithCur=Volumen en {0}
shared.currency=Moneda
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=Por favor envíe confirmación de nuevo
shared.exportCSV=Exportar a csv
shared.exportJSON=Exportar a JSON
shared.noDateAvailable=Sin fecha disponible
-shared.arbitratorsFee=Comisión de arbitraje
shared.noDetailsAvailable=Sin detalles disponibles
shared.notUsedYet=Sin usar aún
shared.date=Fecha
@@ -126,7 +129,7 @@ shared.country=País
shared.applyAndShutDown=Aplicar y cerrar
shared.selectPaymentMethod=Seleccionar método de pago
shared.accountNameAlreadyUsed=Ese nombre de cuenta ya está en uso en una cuenta guardada.\nPor favor use otro nombre.
-shared.askConfirmDeleteAccount=Realmente quiere borrar la cuenta seleccionada?
+shared.askConfirmDeleteAccount=¿Realmente quiere borrar la cuenta seleccionada?
shared.cannotDeleteAccount=No puede borrar esta cuenta porque está siendo usada en una oferta abierta o en un intercambio.
shared.noAccountsSetupYet=Aún no hay cuentas configuradas.
shared.manageAccounts=Gestionar cuentas
@@ -149,11 +152,11 @@ shared.save=Guardar
shared.onionAddress=Dirección onion
shared.supportTicket=Ticket de soporte
shared.dispute=Disputa
+shared.mediationCase=caso de mediación
shared.seller=vendedor
shared.buyer=comprador
shared.allEuroCountries=Todos los países Euro
shared.acceptedTakerCountries=Países aceptados como tomador
-shared.arbitrator=Árbitro seleccionado
shared.tradePrice=Precio de intercambio
shared.tradeAmount=Cantidad de intercambio
shared.tradeVolume=Volumen de intercambio
@@ -203,6 +206,15 @@ shared.proposal=Propuesta
shared.votes=Votos
shared.learnMore=Aprender más
shared.dismiss=Descartar
+shared.selectedArbitrator=Árbitro seleccionado
+shared.selectedMediator=Mediador seleccionado
+shared.selectedRefundAgent=Árbitro seleccionado
+shared.mediator=Mediador
+shared.arbitrator=Árbitro
+shared.refundAgent=Árbitro
+shared.refundAgentForSupportStaff=Agente de devolución de fondos
+shared.delayedPayoutTxId=ID de transacción de devolución colateral de fondos
+
####################################################################
# UI views
@@ -226,7 +238,7 @@ mainView.marketPrice.provider=Precio por
mainView.marketPrice.label=Precio de mercado
mainView.marketPriceWithProvider.label=Precio de mercado por {0}
mainView.marketPrice.bisqInternalPrice=Precio del último intercambio en Bisq
-mainView.marketPrice.tooltip.bisqInternalPrice=No existe un precio de mercado disponible proveniente de fuentes externas./nEl precio mostrado es el último precio de intercambio en Bisq para esa moneda.
+mainView.marketPrice.tooltip.bisqInternalPrice=No existe un precio de mercado disponible proveniente de fuentes externas.\nEl precio mostrado es el último precio de intercambio en Bisq para esa moneda.
mainView.marketPrice.tooltip=Precio de mercado ofrecido por {0}{1}\nÚltima actualización: {2}\nURL del nodo proveedor: {3}
mainView.marketPrice.tooltip.altcoinExtra=Si la altcoin no está disponible en Poloniex usamos https://coinmarketcap.com
mainView.balance.available=Saldo disponible
@@ -244,7 +256,7 @@ mainView.footer.btcInfo.synchronizingWith=Sincronizando con
mainView.footer.btcInfo.synchronizedWith=Sincronizado con
mainView.footer.btcInfo.connectingTo=Conectando a
mainView.footer.btcInfo.connectionFailed=Conexión fallida
-mainView.footer.p2pInfo=Pares de red P2P: {0}
+mainView.footer.p2pInfo=Pares de la red Bisq: {0}
mainView.footer.daoFullNode=Nodo completo DAO
mainView.bootstrapState.connectionToTorNetwork=(1/4) Conectando a la red Tor...
@@ -254,10 +266,10 @@ mainView.bootstrapState.initialDataReceived=(4/4) Datos iniciales recibidos
mainView.bootstrapWarning.noSeedNodesAvailable=No hay nodos de siembra disponibles
mainView.bootstrapWarning.noNodesAvailable=No hay nodos de sembrado y pares disponibles
-mainView.bootstrapWarning.bootstrappingToP2PFailed=Fallo al hacer bootstrap a red P2P
+mainView.bootstrapWarning.bootstrappingToP2PFailed=Fallo al conectarse a la red Bisq en el arranque
-mainView.p2pNetworkWarnMsg.noNodesAvailable=No hay nodos de siembra o puntos de red persistentes para los datos requeridos.\nPor favor, compruebe su conexión a Internet o intente reiniciar la aplicación.
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Fallo al conectar a la red P2P (reported error: {0}).\nPor favor compruebe su conexión a internet o intente reiniciar la aplicación.
+mainView.p2pNetworkWarnMsg.noNodesAvailable=No hay nodos de sembrado o puntos de red persistentes para los datos requeridos.\nPor favor, compruebe su conexión a Internet o intente reiniciar la aplicación.
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Fallo conectándose a la red Bisq (error reportado: {0}).\nPor favor, compruebe su conexión a internet o pruebe reiniciando la aplicación.
mainView.walletServiceErrorMsg.timeout=Error al conectar a la red Bitcoin en el límite de tiempo establecido.
mainView.walletServiceErrorMsg.connectionError=La conexión a la red Bitcoin falló por un error: {0}
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=Cierre:
market.trades.tooltip.candle.high=Máximo:
market.trades.tooltip.candle.low=Mínimo:
market.trades.tooltip.candle.average=Media:
+market.trades.tooltip.candle.median=Mediana:
market.trades.tooltip.candle.date=Fecha:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=Países de sede de banco aceptados (tomador)
offerbook.availableOffers=Ofertas disponibles
offerbook.filterByCurrency=Filtrar por moneda
offerbook.filterByPaymentMethod=Filtrar por método de pago
+offerbook.timeSinceSigning=Tiempo desde el firmado
+offerbook.timeSinceSigning.info=Esta cuenta fue verificada y {0}
+offerbook.timeSinceSigning.info.arbitrator=firmada por un árbitro y puede firmar cuentas de pares
+offerbook.timeSinceSigning.info.peer=firmado por un par, esperando a que se eleven los límites
+offerbook.timeSinceSigning.info.peerLimitLifted=firmador por un par y los límites se elevaron
+offerbook.timeSinceSigning.info.signer=firmado por un par y puede firmar cuentas de pares (límites elevados)
+offerbook.timeSinceSigning.daysSinceSigning=días {0}
+offerbook.timeSinceSigning.daysSinceSigning.long={0} desde el firmado
+
+offerbook.timeSinceSigning.help=Cuando complete con éxito un intercambio con un par que tenga una cuenta de pago firmada, su cuenta de pago es firmada.\n][{0} días después, el límite inicial de {1} se eleva y su cuenta puede firmar las cuentas de pago de otros pares.
+offerbook.timeSinceSigning.notSigned=No firmada aún
+offerbook.timeSinceSigning.notSigned.noNeed=No disponible
+shared.notSigned=Esta cuenta aún no se ha firmado
+shared.notSigned.noNeed=Este tipo de cuenta no utiliza firmado
offerbook.nrOffers=Número de ofertas: {0}
offerbook.volume={0} (min - max)
@@ -345,23 +372,21 @@ offerbook.warning.noTradingAccountForCurrency.msg=No tiene una cuenta de interca
offerbook.warning.noMatchingAccount.headline=La cuenta de intercambio no concuerda.
offerbook.warning.noMatchingAccount.msg=Para aceptar esta oferta, deberá configurar una cuenta de pago utilizando este método de pago.\n\n¿Le gustaría hacerlo ahora?
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=Esta oferta no puede ser tomada debido a restricciones de seguridad basadas en los siguientes criterios:\n-La cuenta de pago del creador se creó después del 1 de Marzo de 2019.\n-El monto de transacción está por encima de 0.01 BTC.\n-El método de pago de la oferta se considera riesgoso debido a las devoluciones de cargo bancarias.\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=Esta oferta no puede tomarse debido a restricciones de intercambio de la contraparte
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=Esta oferta no puede ser tomada debido a restricciones de seguridad basadas en los siguientes criterios:\n- Su cuenta de pago se creó después del 1 de Marzo de 2019\n- El monto de transacción mínima está por encima de 0.01 BTC\n- El método de pago de la oferta se considera riesgoso por reversión de pagos de bancos.\n\n{0}
+offerbook.warning.newVersionAnnouncement=Con esta versión de software, los pares de intercambio pueden verificar y firmar entre sí sus cuentas de pago para crear una red de cuentas de pago de confianza.\n\nDespués de intercambiar con éxito con un par con una cuenta de pago verificada, su cuenta de pago será firmada y los límites de intercambio se elevarán después de un cierto intervalo de tiempo (la duración de este intervalo depende del método de verificación).\n\nPara más información acerca del firmado de cuentas, por favor vea la documentación en https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=Necesitamos implementar esta restricción como una solución temporal para mejorar la seguridad\n\nLa próxima versión del software proporcionará herramientas de protección más robustas para que las ofertas con este perfil de riesgo puedan intercambiarse nuevamente.
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=El monto de transacción permitido está limitado a 0.01 BTC debido a restricciones de seguridad basadas en los siguientes criterios\n- La cuenta del comprador fue creada después del 1 de Marzo de 2019\n- El método de pago de la oferta se considera riesgoso para reversión de pagos de bancos\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=El monto de transacción permitido está limitado a 0.01 BTC debido a restricciones de seguridad basadas en los siguientes criterios\n- Su cuenta de pago fue creada después del 1 de Marzo de 2019.\n- El método de pago de la oferta se considera riesgoso para los chargebacks de bancos.\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=El monto de intercambio permitido está limitado a {0} debido a restricciones de seguridad basadas en los siguientes criterios:\n- La cuenta del comprador no ha sido firmada por un árbitro o par\n- El tiempo desde el firmado de la cuenta del comprador no es de al menos 30 días.\n- el método de pago para esta oferta se considera riesgoso para devoluciones de cargo\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=El monto de intercambio permitido está limitado a {0} debido a restricciones de seguridad basadas en los siguientes criterios:\n- Su cuenta de pago no ha sido firmada por un árbitro o par\n- El tiempo desde el firmado de su cuenta no es de al menos 30 días\n- El método de pago para esta oferta se considera riesgoso para devoluciones de cargo\n\n{1}
offerbook.warning.wrongTradeProtocol=Esta oferta requiere un protocolo de intercambio diferente al utilizado en su versión del software.\n\nPor favor, compruebe que tiene instalada la última versión del software, o de otra forma el usuario que creó la oferta ha utilizado una versión más antigua que la suya.\n\nLos usuarios no pueden realizar transacciones con una versión de protocolo de intercambio incompatible.
offerbook.warning.userIgnored=Ha añadido esta dirección onion a la lista de ignorados.
-offerbook.warning.offerBlocked=Esta oferta ha sido bloqueada por los desarroladores de Bisq.\nProbablemente existe un error de software desatendido que causa problemas al tomar esta oferta.
+offerbook.warning.offerBlocked=Esta oferta ha sido bloqueada por los desarrolladores de Bisq.\nProbablemente existe un error de software desatendido que causa problemas al tomar esta oferta.
offerbook.warning.currencyBanned=La moneda utilizada en esta oferta fue bloqueada por los desarrolladores de Bisq.\nPor favor visite el Forum de Bisq para más información.
offerbook.warning.paymentMethodBanned=El método de pago utilizado en esta oferta fue bloqueado por los desarrolladores de Bisq.\nPor favor visite el Forum Bisq para más información.
-offerbook.warning.nodeBlocked=La dirección onion de este trader ha sido bloqueada por los desarrolladores de Bisq.\nProbablemente existe un error de software desatendido que causa problemas al tomar ofertas de este trader.
+offerbook.warning.nodeBlocked=La dirección onion de este comerciante ha sido bloqueada por los desarrolladores de Bisq.\nProbablemente existe un error de software desatendido que causa problemas al tomar ofertas de este comerciante.
offerbook.warning.requireUpdateToNewVersion=Su versión de Bisq ya no es compatible para realizar intercambios.\nPor favor actualice a la última versión de Bisq en https://bisq.network/downloads.
-offerbook.warning.tradeLimitNotMatching=Su cuenta de pago ha sido creada hace {0} días. Su límite de transacción está basado en la antigüedad de la cuenta y no es suficiente para esa oferta. /n/nSu límite de transacción es: {1}/nEl monto mínimo de transacción requerido para la oferta es: {2}./n/nNo puede tomar esta oferta en este momento. Una vez que su cuenta tenga más de 2 meses de antigüedad esta restricción se eliminará.
+offerbook.warning.tradeLimitNotMatching=Su cuenta de pago ha sido creada hace {0} días. Su límite de transacción está basado en la antigüedad de la cuenta y no es suficiente para esa oferta.\n\nSu límite de transacción es: {1}\nEl monto mínimo de transacción requerido para la oferta es: {2}.\n\nNo puede tomar esta oferta en este momento. Una vez que su cuenta tenga más de 2 meses de antigüedad esta restricción se eliminará.
offerbook.info.sellAtMarketPrice=Venderá a precio de mercado (actualizado cada minuto).
@@ -416,7 +441,7 @@ createOffer.createOfferFundWalletInfo.feesWithBSQ={0} y {1}
createOffer.createOfferFundWalletInfo.msg=Necesita depositar {0} para completar esta oferta.\n\nEsos fondos son reservados en su cartera local y se bloquearán en la dirección de depósito multifirma una vez que alguien tome su oferta.\nLa cantidad es la suma de:\n{1}- Su depósito de seguridad: {2}\n- Comisión de intercambio: {3}\n- Comisión de minado: {4}\n\nPuede elegir entre dos opciones a la hora de depositar fondos para realizar su intercambio:\n- Usar su cartera Bisq (conveniente, pero las transacciones pueden ser trazables) O también\n- Transferir desde una cartera externa (potencialmente con mayor privacidad)\n\nConocerá todos los detalles y opciones para depositar fondos al cerrar esta ventana.
# only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!)
-createOffer.amountPriceBox.error.message=Ocurrió un error al colocar la oferta:\n\n{0}\n\nNingún monto de su cartera ha sido deducido aún.\nPor favor, reinicie su aplicación y compruebe su conexión a la red.
+createOffer.amountPriceBox.error.message=Ocurrió un error al colocar la oferta:\n\n{0}\n\nNingún importe de su cartera ha sido deducido aún.\nPor favor, reinicie su aplicación y compruebe su conexión a la red.
createOffer.setAmountPrice=Establezca cantidad y precio
createOffer.warnCancelOffer=Ya ha destinado fondos para esa oferta.\nSi cancela ahora, sus fondos serán transferidos a su cartera Bisq local y estarán disponibles para retirar en la pantalla \"Fondos/Enviar fondos\".\n¿Está seguro que quiere cancelar?
createOffer.timeoutAtPublishing=Error. Fuera de tiempo en la publicación de la oferta.
@@ -478,9 +503,9 @@ takeOffer.failed.offerTaken=No puede tomar la oferta porque la oferta fue tomada
takeOffer.failed.offerRemoved=No puede tomar esta oferta porque la oferta ha sido eliminada.
takeOffer.failed.offererNotOnline=La solicitud de toma de oferta falló porque el creador no se encuentra online.
takeOffer.failed.offererOffline=No puede tomar la oferta porque el tomador está offline.
-takeOffer.warning.connectionToPeerLost=Ha perdido conexión con el creador.\nPuede haberse desconectado o haber cortado la conexión hacia usted debido a que existan demasiadas conexiones.\n\nSi aún puede ver la oferta en el libro de ofertas puede intentar tomarla de nuevo.
+takeOffer.warning.connectionToPeerLost=Ha perdido conexión con el creador.\nPuede haberse desconectado o haber cortado la conexión hacia usted debido a que existan demasiadas conexiones abiertas.\n\nSi aún puede ver la oferta en el libro de ofertas puede intentar tomarla de nuevo.
-takeOffer.error.noFundsLost=\n\nNingún monto de su cartera ha sido deducido aún.\nPor favor intente reiniciar su aplicación y compruebe la conexión a la red para ver si puede resolver el problema.
+takeOffer.error.noFundsLost=\n\nNingún importe de su cartera ha sido deducido aún.\nPor favor intente reiniciar su aplicación y compruebe la conexión a la red para ver si puede resolver el problema.
takeOffer.error.feePaid=\n\nPor favor, intente reiniciar su aplicación y verifique su conexión de red para ver si puede resolver el problema.
takeOffer.error.depositPublished=\n\nLa transacción de depósito ya se ha publicado.\nPor favor intente reiniciar su aplicación y compruebe su conexión a la red para ver si puede resolver el problema.\nSi el problema persiste, por favor contacte a los desarrolladores para solicitar asistencia.
takeOffer.error.payoutPublished=\n\nLa transacción de pago ya se ha publicado.\nPor favor intente reiniciar su aplicación y compruebe su conexión a la red para ver si puede resolver el problema.\nSi el problema persiste, por favor contacte a los desarrolladores para solicitar asistencia.
@@ -515,9 +540,9 @@ portfolio.pending.step3_buyer.waitPaymentArrived=Esperar hasta que el pago haya
portfolio.pending.step3_seller.confirmPaymentReceived=Confirmar recepción de pago
portfolio.pending.step5.completed=Completado
-portfolio.pending.step1.info=La transacción de depósito ha sido publicada.\nEl {0} tiene que esperar al menos una confirmación en la cadena de bloques antes de comenzar el pago.
-portfolio.pending.step1.warn=La transacción de depósito aún no se ha confirmado.\nEso puede suceder en raras ocasiones cuando la comisión por deposito de fondos de un trader desde la cartera externa es demasiado baja.
-portfolio.pending.step1.openForDispute=La transacción de depósito aún no ha sido confirmada.\nEso puede suceder en raras ocasiones cuando la comisión por deposito de fondos de un trader desde la cartera externa fue demasiado baja.\nEl periodo máximo para realizar la transacción ha transcurrido.\n\nPuede esperar más o ponerse en contacto con el árbitro para abrir una disputa.
+portfolio.pending.step1.info=La transacción de depósito ha sido publicada.\n{0} tiene que esperar al menos una confirmación en la cadena de bloques antes de comenzar el pago.
+portfolio.pending.step1.warn=La transacción del depósito aún no se ha confirmado.\nEsto puede suceder en raras ocasiones cuando la tasa de depósito de un comerciante desde una cartera externa es demasiado baja.
+portfolio.pending.step1.openForDispute=La transacción de depósito aún no ha sido confirmada. Puede esperar más o contactar con el mediador para obtener asistencia.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=Su intercambio ha logrado al menos una confirmación en la cadena de bloques.\n(Puede esperar más confirmaciones si lo desea - 6 confirmaciones son consideradas muy seguras.)\n
@@ -534,42 +559,49 @@ portfolio.pending.step2_buyer.fees=Si su banco cobra tasas, corren a su cuenta.
portfolio.pending.step2_buyer.altcoin=Por favor transfiera fondos desde su cartera externa {0}\n{1} al vendedor de BTC.\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=Por favor vaya al banco y pague {0} al vendedor de BTC.\n\n
-portfolio.pending.step2_buyer.cash.extra=REQUERIMIENTO IMPORTANTE:\nDespués de haber hecho el pago escribe en el recibo de papel: SIN REEMBOLSOS\nLuego divídalo en 2 partes, haga una foto y envíela a la dirección de e-mail del vendedor de BTC.
+portfolio.pending.step2_buyer.cash.extra=REQUERIMIENTO IMPORTANTE:\nDespués de haber hecho el pago escribe en el recibo de papel: NO REFUNDS\nLuego divídalo en 2 partes, haga una foto y envíela a la dirección de correo electrónico del vendedor de BTC.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=Por favor pague {0} al vendedor de BTC utilizando MoneyGram.\n\n
portfolio.pending.step2_buyer.moneyGram.extra=REQUERIMIENTO IMPORTANTE:\nDespués que usted haya realizado el pago, envíe el número de autorización y una foto del recibo al vendedor de BTC por correo electrónico.\nEl recibo debe mostrar claramente el monto, asi como el nombre completo, país y demarcación (departamento,estado, etc.) del vendedor. El correo electrónico del vendedor es: {0}.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=Por favor pague {0} al vendedor de BTC usando Western Union.\n\n
-portfolio.pending.step2_buyer.westernUnion.extra=REQUERIMIENTO IMPORTANTE:/nDespués de haber realizado el pago envíe el MTCN (número de seguimiento) y una foto de el recibo por email a el vendedor de BTC./nEl recibo debe mostrar claramente el nombre completo del emisor, la ciudad, país y la cantidad. El email del vendedor es: {0}.
+portfolio.pending.step2_buyer.westernUnion.extra=REQUERIMIENTO IMPORTANTE:\nDespués de haber realizado el pago envíe el MTCN (número de seguimiento) y una foto de el recibo por email a el vendedor de BTC.\nEl recibo debe mostrar claramente el nombre completo del emisor, la ciudad, país y la cantidad. El email del vendedor es: {0}.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=Por favor envíe {0} mediante \"US Postal Money Order\" a el vendedor de BTC.\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.bank=Por favor vaya a la página web de su banco y pague {0} a el vendedor de BTC.\n\n
+portfolio.pending.step2_buyer.bank=Por favor vaya a la página web de su banco y pague {0} al vendedor de BTC.\n\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=Por favor contacte al vendedor de BTC con el contacto proporcionado y acuerden un encuentro para pagar {0}.\n\n
portfolio.pending.step2_buyer.startPaymentUsing=Comenzar pago utilizando {0}
portfolio.pending.step2_buyer.amountToTransfer=Cantidad a transferir
portfolio.pending.step2_buyer.sellersAddress=Dirección de vendedor {0}
portfolio.pending.step2_buyer.buyerAccount=Su cuenta de pago para ser usada
portfolio.pending.step2_buyer.paymentStarted=Pago iniciado
-portfolio.pending.step2_buyer.warn=Aún no ha realizado su pago {0}!\nPor favor tenga en cuenta que el intercambio tiene que completarse antes de {1}, o de lo contrario será investigado por el árbitro.
-portfolio.pending.step2_buyer.openForDispute=No ha completado su pago!\nEl periodo máximo para el pago ha concluido.\n\nPor favor contacte con el árbitro para abrir una disputa.
+portfolio.pending.step2_buyer.warn=¡Todavía no ha realizado su pago {0}!\nPor favor, tenga en cuenta que el pago tiene que completarse antes de {1}.
+portfolio.pending.step2_buyer.openForDispute=¡No ha completado su pago!\nEl periodo máximo para el intercambio ha concluido. Por favor, contacte con el mediador para abrir una disputa.
portfolio.pending.step2_buyer.paperReceipt.headline=¿Ha enviado el recibo a el vendedor de BTC?
-portfolio.pending.step2_buyer.paperReceipt.msg=Recuerde:\nTiene que escribir en el recibo de papel: SIN REEMBOLSOS.\nLuego divídalo en 2 partes, haga una foto y envíela a la dirección de e-mail del vendedor de BTC.
+portfolio.pending.step2_buyer.paperReceipt.msg=Recuerde:\nTiene que escribir en el recibo de papel: NO REFUNDS.\nLuego divídalo en 2 partes, haga una foto y envíela a la dirección de e-mail del vendedor de BTC.
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=Enviar número de autorización y recibo
portfolio.pending.step2_buyer.moneyGramMTCNInfo.msg=Debe enviar el número de autorización y una foto del recibo por correo electrónico al vendedor de BTC.\nEl recibo debe mostrar claramente el monto, así como el nombre completo, país y demarcación (departamento,estado, etc.) del vendedor. El correo electrónico del vendedor es: {0}.\n\n¿Envió usted el número de autorización y el contrato al vendedor?
portfolio.pending.step2_buyer.westernUnionMTCNInfo.headline=Enviar MTCN y recibo
-portfolio.pending.step2_buyer.westernUnionMTCNInfo.msg=Necesita enviar el MTCN (número de seguimiento) y una foto de el recibo por email a el vendedor de BTC/nEl recibo debe mostrar claramente el nombre completo del emisor, la ciudad, el país y la cantidad. El email del vendedor es: {0}/n/n¿Envió el MTCN y el contrato al vendedor?
+portfolio.pending.step2_buyer.westernUnionMTCNInfo.msg=Necesita enviar el MTCN (número de seguimiento) y una foto de el recibo por email a el vendedor de BTC\nEl recibo debe mostrar claramente el nombre completo del emisor, la ciudad, el país y la cantidad. El email del vendedor es: {0}\n\n¿Envió el MTCN y el contrato al vendedor?
portfolio.pending.step2_buyer.halCashInfo.headline=Enviar código HalCash
-portfolio.pending.step2_buyer.halCashInfo.msg=Necesita enviar un mensaje de texto con el código HalCash así como el ID de la transacción ({0}) al venedor de BTC.\nEl móvil del vendedor es {1}.\n\n¿Envió el código al vendedor?
+portfolio.pending.step2_buyer.halCashInfo.msg=Necesita enviar un mensaje de texto con el código HalCash así como el ID de la transacción ({0}) al vendedor de BTC.\nEl móvil del vendedor es {1}.\n\n¿Envió el código al vendedor?
portfolio.pending.step2_buyer.fasterPaymentsHolderNameInfo=Algunos bancos pueden requerir el nombre del receptor. El sort code de UK y el número de cuenta es suficiente para una transferecnia Faster Payment y el nombre del receptor no es verificado por ninguno de los bancos.
portfolio.pending.step2_buyer.confirmStart.headline=Confirme que ha comenzado el pago.
-portfolio.pending.step2_buyer.confirmStart.msg=Ha iniciado el pago de {0} a su par de intercambio?
+portfolio.pending.step2_buyer.confirmStart.msg=¿Ha iniciado el pago de {0} a su par de intercambio?
portfolio.pending.step2_buyer.confirmStart.yes=Sí, lo he iniciado.
portfolio.pending.step2_seller.waitPayment.headline=Esperar al pago.
portfolio.pending.step2_seller.f2fInfo.headline=Información de contacto del comprador
portfolio.pending.step2_seller.waitPayment.msg=La transacción del depósito tiene al menos una confirmación en la cadena de bloques.\nTiene que esperar hasta que el comprador de BTC comience el pago de {0}.
portfolio.pending.step2_seller.warn=El comprador de BTC aún no ha realizado el pago de {0}.\nNecesita esperar hasta que el pago comience.\nSi el intercambio aún no se ha completado el {1} el árbitro procederá a investigar.
-portfolio.pending.step2_seller.openForDispute=El comprador de BTC no ha comenzado su pago!\nEl periodo máximo permitido ha finalizado.\nPuede esperar más y dar más tiempo a la otra parte o contactar con el árbitro para abrir una disputa.
+portfolio.pending.step2_seller.openForDispute=El comprador de BTC no ha comenzado su pago!\nEl periodo máximo permitido ha finalizado.\nPuede esperar más y dar más tiempo a la otra parte o contactar con el mediador para abrir una disputa.
+
+tradeChat.chatWindowTitle=Ventana de chat para transacción con ID "{0}"
+tradeChat.openChat=Abrir ventana de chat
+tradeChat.rules=Puede comunicarse con su par de intercambio para resolver posibles problemas con este intercambio.\nNo es obligatorio responder en el chat.\nSi un comerciante viola alguna de las reglas de abajo, abra una disputa y repórtelo al mediador o árbitro.\n\nReglas del chat:\n\t● No enviar ningún enlace (riesgo de malware). Puedes enviar el ID de la transacción y el nombre de un explorador de bloques.\n\t● ¡No enviar las palabras semilla, llaves privadas, contraseñas u otra información sensible!\n\t● No alentar a intercambiar fuera de Bisq (sin seguridad).\n\t● No se enfrente a ningún intento de estafa de ingeniería social.\n\t● Si un par no responde y prefiere no comunicarse, respete su decisión.\n\t● Limite el tema de conversación al intercambio. Este chat no es un sustituto del messenger o troll-box.\n\t● Mantenga la conversación amigable y respetuosa.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=Indefinido
@@ -578,7 +610,7 @@ message.state.SENT=Mensaje enviado
# suppress inspection "UnusedProperty"
message.state.ARRIVED=El mensaje llegó al usuario de red
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=Mensaje almacenado en el buzón
+message.state.STORED_IN_MAILBOX=Mensaje de pago enviado, pero aún no recibido por el par.
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=El usuario de red confirmó la recepción del mensaje
# suppress inspection "UnusedProperty"
@@ -589,45 +621,47 @@ portfolio.pending.step3_buyer.wait.info=Esperando a la confirmación del recibo
portfolio.pending.step3_buyer.wait.msgStateInfo.label=Estado del mensaje de pago iniciado
portfolio.pending.step3_buyer.warn.part1a=en la cadena de bloques {0}
portfolio.pending.step3_buyer.warn.part1b=en su proveedor de pago (v.g. banco)
-portfolio.pending.step3_buyer.warn.part2=El vendedor de BTC aún no ha confirmado su pago!\nPor favor compruebe {0} si el envío del pago ha sido exitoso.\nSi el vendedor de BTC no confirma la recepción de su pago en {1} el intercambio será investigado por el árbitro.
-portfolio.pending.step3_buyer.openForDispute=El vendedor de BTC aún no ha confirmado su pago!\nEl periodo máximo para el intercambio ha concluído.\nPuede esperar más y dar más tiempo a la otra parte o contactar con el árbitro para abrir una disputa.
+portfolio.pending.step3_buyer.warn.part2=El vendedor de BTC aún no ha confirmado su pago. Por favor, compruebe {0} si el envío del pago fue correcto.
+portfolio.pending.step3_buyer.openForDispute=¡El vendedor de BTC aún no ha confirmado su pago! El periodo máximo para el intercambio ha concluido. Puede esperar y dar más tiempo a la otra parte o solicitar asistencia del mediador.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=La otra parte del intercambio confirma haber iniciado el pago de {0}.\n\n
portfolio.pending.step3_seller.altcoin.explorer=en su explorador de cadena de bloques {0} favorito
portfolio.pending.step3_seller.altcoin.wallet=en su cartera {0}
portfolio.pending.step3_seller.altcoin={0}Por favor compruebe {1} si la transacción a su dirección de recepción\n{2}\ntiene suficientes confirmaciones en la cadena de bloques.\nLa cantidad a pagar tiene que ser {3}\n\nPuede copiar y pegar su dirección {4} desde la pantalla principal después de cerrar este popup.
portfolio.pending.step3_seller.postal={0}Por favor, compruebe si ha recibido {1} con \"US Postal Money Order\"desde el comprador de BTC.\n\nLa ID de intercambio (el texto \"reason for payment\") de la transacción es: \"{2}\"
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=Su par de intercambio ha confirmado haber iniciado el pago de {0}.\n\nPor favor, vaya a la web de su banco y compruebe si ha recibido {1} desde la cuenta del comprador de BTC.\nLa ID de intercambio (texto \"razón de pago\") de la transacción es: \"{2}\"
portfolio.pending.step3_seller.cash=Debido a que el pago se hecho vía depósito en efectivo el comprador de BTC tiene que escribir \"SIN REEMBOLSO\" en el recibo de papel, dividirlo en 2 partes y enviarte una foto por e-mail.\n\nPara impedir el riesgo de reembolso, solo confirme si ha recibido el e-mail y si está seguro de que el recibo es válido.\nSi no está seguro, {0}
portfolio.pending.step3_seller.moneyGram=El comprador tiene que enviarle el número de autorización y una foto del recibo por correo electrónico.\n\nEl recibo debe mostrar claramente el monto, asi como su nombre completo, país y demarcación (departamento,estado, etc.). Por favor revise su correo electrónico si recibió el número de autorización.\n\nDespués de cerrar esa ventana emergente (popup), verá el nombre y la dirección del comprador de BTC para retirar el dinero de MoneyGram.\n\n¡Solo confirme el recibo de transacción después de haber obtenido el dinero con éxito!
portfolio.pending.step3_seller.westernUnion=El comprador tiene que enviarle el MTCN (número de seguimiento) y una foto de el recibo por email.\nEl recibo debe mostrar claramente su nombre completo, ciudad, país y la cantidad. Por favor compruebe su email si ha recibido el MTCN.\n\nDespués de cerrar ese popup verá el nombre del comprador de BTC y la dirección para recoger el dinero de Western Union.\n\nSolo confirme el recibo después de haber recogido satisfactoriamente el dinero!
portfolio.pending.step3_seller.halCash=El comprador tiene que enviarle el código HalCash como un mensaje de texto. Junto a esto recibirá un mensaje desde HalCash con la información requerida para retirar los EUR de un cajero que soporte HalCash.\n\nDespués de retirar el dinero del cajero confirme aquí la recepción del pago!
-portfolio.pending.step3_seller.bankCheck=\n\nPor favor verifique también que el nombre del remitentente en la nota bancaria concuerda con el de el contrato de intercambio:\nNombre del remitente: {0}\n\nSi el nombre no es el mismo que el mostrado aquí, {1}
-portfolio.pending.step3_seller.openDispute=por favor, no confirme. Abra una disputa pulsando \"cmd + o\" o \"ctrl + o\".
+portfolio.pending.step3_seller.bankCheck=\n\nPor favor verifique también que el nombre y el emisor especificado en el contrato de intercambio se corresponde con el nombre que aparece en su declaración bancaria:\nNombre del emisor, para el contrato de intercambio: {0}\n\nSi los nombres no son exactamente los mismos, {1}
+portfolio.pending.step3_seller.openDispute=no confirme el recibo de pago. En su lugar, abra una disputa pulsando \"alt + o\" o \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=Confirmar recibo de pago
portfolio.pending.step3_seller.amountToReceive=Cantidad a recibir
portfolio.pending.step3_seller.yourAddress=Su dirección {0}
portfolio.pending.step3_seller.buyersAddress=Dirección {0} del comprador
portfolio.pending.step3_seller.yourAccount=Su cuenta de intercambio
-portfolio.pending.step3_seller.buyersAccount=Cuenta de intecambio del comprador
+portfolio.pending.step3_seller.buyersAccount=Cuenta de intercambio del comprador
portfolio.pending.step3_seller.confirmReceipt=Confirmar recibo de pago
portfolio.pending.step3_seller.buyerStartedPayment=El comprador de BTC ha iniciado el pago de {0}.\n{1}
portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Compruebe las confirmaciones en la cadena de bloques en su monedero de altcoin o explorador de bloques y confirme el pago cuando tenga suficientes confirmaciones.
portfolio.pending.step3_seller.buyerStartedPayment.fiat=Compruebe su cuenta de intercambio (v.g. cuenta bancaria) y confirme cuando haya recibido el pago.
portfolio.pending.step3_seller.warn.part1a=en la cadena de bloques {0}
portfolio.pending.step3_seller.warn.part1b=en su proveedor de pago (v.g. banco)
-portfolio.pending.step3_seller.warn.part2=Aún no ha confirmado el recibo del pago!\nPor favor, compruebe {0} si ha recibido el pago.\nSi no lo ha recibido el {1} el intercambio será investigado por el árbitro.
-portfolio.pending.step3_seller.openForDispute=No ha confirmado la recepción del pago.\nEl periodo máximo para el intercambio ha concluido.\nPor favor confirme o contacte el árbitro para abrir una disputa.
+portfolio.pending.step3_seller.warn.part2=Todavía no ha confirmado el recibo del pago. Por favor, compruebe {0} si ha recibido el pago.
+portfolio.pending.step3_seller.openForDispute=No ha confirmado la recepción del pago.\nEl periodo máximo para el intercambio ha concluido.\nPor favor confirme o solicite asistencia del mediador.
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.part1=Ha recibido el pago de {0} de su par de intercambio?\n\n
+portfolio.pending.step3_seller.onPaymentReceived.part1=¿Ha recibido el pago de {0} de su par de intercambio?\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=La ID de intercambio/transacción (texto \"concepto de pago\") de la transacción es: \"{0}\"\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=Por favor, verifica también que el nombre del remitente de su estado de cuenta bancario concuerda con el del contrato de intercambio:\nNombre del emisor: {0}\n\nSi el nombre no es el mismo que el mostrado aquí, por favor no confirme. Abra una disputa pulsando \"cmd + o\" o \"ctrl + o\".\n\n
-portfolio.pending.step3_seller.onPaymentReceived.note=Por favor, tenga en cuenta que tan pronto como confirme el recibo, la cantidad de intercambio bloqueada se liberará a el comprador de BTC y se le devolverá el depósito de seguridad.
+portfolio.pending.step3_seller.onPaymentReceived.name=Por favor verifique también que el nombre del emisor especificado en el contrato de intercambio concuerda con el nombre que aparece en su declaración bancaria:\nNombre del emisor, para el contrato de intercambio: {0}\n\nSi los nombres no son exactamente los mismos, no confirme el recibo de pago. En su lugar, abra una disputa pulsando \"alt + o\" o \"option + o\".\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Por favor tenga en cuenta, que tan pronto como haya confirmado el recibo, la cantidad de intercambio bloqueada será librerada al comprador de BTC y el depósito de seguridad será devuelto.
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Confirme que ha recibido el pago
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Sí, he recibido el pago
+portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANTE: Confirmando el recibo de pago, está también verificando la cuenta de la contraparte y firmándola en consecuencia. Como la cuenta de la contraparte no ha sido firmada aún, debería retrasar la confirmación de pago tanto como sea posible para reducir el riesgo de devolución de cargo.
portfolio.pending.step5_buyer.groupTitle=Resumen de el intercambio completado
portfolio.pending.step5_buyer.tradeFee=Comisión de transacción
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=Comisiones de minado totales
portfolio.pending.step5_buyer.refunded=Depósito de seguridad devuelto
portfolio.pending.step5_buyer.withdrawBTC=Retirar bitcoins
portfolio.pending.step5_buyer.amount=Cantidad a retirar
+portfolio.pending.step5_buyer.signer=Retirando sus bitcoins, verifica que la contraparte ha actuado de acuerdo al protocolo de intercambio.
portfolio.pending.step5_buyer.withdrawToAddress=Retirar a la dirección
portfolio.pending.step5_buyer.moveToBisqWallet=Mover fondos a la billetera Bisq
portfolio.pending.step5_buyer.withdrawExternal=Retirar al monedero externo
@@ -643,7 +678,7 @@ portfolio.pending.step5_buyer.alreadyWithdrawn=Sus fondos ya han sido retirados.
portfolio.pending.step5_buyer.confirmWithdrawal=Confirme la petición de retiro
portfolio.pending.step5_buyer.amountTooLow=La cantidad a transferir es inferior a la tasa de transacción y el mínimo valor de transacción posible (polvo - dust).
portfolio.pending.step5_buyer.withdrawalCompleted.headline=Retiro completado
-portfolio.pending.step5_buyer.withdrawalCompleted.msg=Sus intercambios completados están almacenados en \"Portfolio/Historial\".\nPuede revisar todas las transacciones de bitcoin en \"Fondos/Transacciones\"
+portfolio.pending.step5_buyer.withdrawalCompleted.msg=Sus intercambios completados están almacenados en \"Portfolio/Historial\".\nPuede revisar todas las transacciones de bitcoin en \"Fondos/Transacciones\"
portfolio.pending.step5_buyer.bought=Ha comprado
portfolio.pending.step5_buyer.paid=Ha pagado
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=Después de la primera confirmación en la cad
portfolio.pending.tradePeriodWarning=Si el periodo se excede ambos comerciantes pueden abrir una disputa.
portfolio.pending.tradeNotCompleted=Intercambio no completado a tiempo(hasta {0})
portfolio.pending.tradeProcess=Proceso de intercambio
-portfolio.pending.openAgainDispute.msg=Si no está seguro de que el mensaje al árbitro llegó (Ej. si no ha tenido respuesta después de 1 día) siéntase libre de abrir una disputa de nuevo.
+portfolio.pending.openAgainDispute.msg=Si no está seguro de que el mensaje al mediador o árbitro llegó (Ej. si no ha tenido respuesta después de 1 día), siéntase libre de abrir una disputa de nuevo con Cmd/Ctrl+o. También puede pedir ayuda adicional en el forum de Bisq en https://bisq.community.
portfolio.pending.openAgainDispute.button=Abrir disputa de nuevo
portfolio.pending.openSupportTicket.headline=Abrir ticket de soporte
-portfolio.pending.openSupportTicket.msg=Por favor usar sólo en caso de emergencia si no se muestra el botón \"Abrir soporte\" o \"Abrir disputa\".\n\nCuando abra un ticket de soporte el intercambio se interrumpirá y será manejado por el árbitro.
+portfolio.pending.openSupportTicket.msg=Por favor use esta función solo en caso de emergencia si no se muestra el botón \"Abrir soporte\" o \"Abrir disputa\".\n\nCuando abra un ticket de soporte el intercambio se interrumpirá y será manejado por un mediador o un árbitro.
+
+portfolio.pending.timeLockNotOver=Tiene hasta ≈{0} ({1} bloques más) antes de que pueda abrir una disputa de arbitraje.
+
portfolio.pending.notification=Notificación
-portfolio.pending.openDispute=Abrir una disputa
-portfolio.pending.arbitrationRequested=Disputa abierta
+
+portfolio.pending.support.headline.getHelp=¿Necesita ayuda?
+portfolio.pending.support.text.getHelp=Si tiene algún problema puede intentar contactar al par de intercambio en el chat o preguntar en la la comunidad Bisq en https://bisq.comunnity. Si su problema no se resuelve, puede abrir una disputa con un mediador.
+portfolio.pending.support.text.getHelp.arbitrator=Si tiene algún problema puede contactar con su par de intercambio en el chat o preguntar en la comunidad Bisq en https://bisq.community. Si su problema sigue sin resolverse, puede solicitar ayuda de un mediador.
+portfolio.pending.support.button.getHelp=Obtener soporte
+portfolio.pending.support.popup.info=Si su problema con el intercambio no se resuelve, puede abrir un ticket de soporte para solicitar ayuda de un mediador. Si no ha recibido el pago, por favor espere hasta que termine el periodo de intercambio.\n\n¿Está seguro de que quiere abrir un ticket de soporte?
+portfolio.pending.support.popup.button=Abrir ticket de soporte
+portfolio.pending.support.headline.halfPeriodOver=Comprobar pago
+portfolio.pending.support.headline.periodOver=El periodo de intercambio se acabó
+
+portfolio.pending.mediationRequested=Mediación solicitada
+portfolio.pending.refundRequested=Devolución de fondos solicitada
portfolio.pending.openSupport=Abrir ticket de soporte
portfolio.pending.supportTicketOpened=Ticket de soporte abierto
portfolio.pending.requestSupport=Solicitar soporte
-portfolio.pending.error.requestSupport=Por favor, reporte el problema al árbitro.\n\nEl enviará la información a los desarrolladores para investigar el problema.\nUna vez se analice el problema se le devolverán los fondos bloqueados.
+portfolio.pending.error.requestSupport=Por favor, reporte el problema a su mediador o árbitro.\n\nEllos reenviarán la información a los desarrolladores para investigar el problema.\nDespués que el problema se analice, se le devolverán todos los fondos bloqueados.
portfolio.pending.communicateWithArbitrator=Por favor, comuníquese en la pantalla de \"Soporte\" con el árbitro.
+portfolio.pending.communicateWithMediator=Por favor, comuníquese en la pantalla \"Soporte\" con el mediador.
portfolio.pending.supportTicketOpenedMyUser=Ya ha abierto un ticket de soporte.\n{0}
portfolio.pending.disputeOpenedMyUser=Ya ha abierto una disputa.\n{0}
portfolio.pending.disputeOpenedByPeer=Su pareja de intercambio ha abierto una disputa\n{0}
portfolio.pending.supportTicketOpenedByPeer=Su pareja de intercambio ha abierto un ticket de soporte.\n{0}
portfolio.pending.noReceiverAddressDefined=No se ha definido la dirección del receptor.
-portfolio.pending.removeFailedTrade=Si el árbitro no pudiera cerrar el intercmabio puede moverlo usted mismo a la pantalla de intercambios fallidos.\n¿Quiere eliminar el intercambio fallido de la pantalla de Intercambios pendientes?
+portfolio.pending.removeFailedTrade=¿Es este un intercambio fallido? ¿Si lo fuera, podría cerrarlo manualmente, para que no aparezca como un intercambio abierto?
+
+portfolio.pending.mediationResult.headline=Pago sugerido por la mediación
+portfolio.pending.mediationResult.info.noneAccepted=Complete el intercambio aceptando la sugerencia del mediador para el pago de la transacción.
+portfolio.pending.mediationResult.info.selfAccepted=Ha aceptado la sugerencia del mediador. Esperando a que el par también la acepte.
+portfolio.pending.mediationResult.info.peerAccepted=El par de intercambio ha aceptador la sugerencia del mediador. ¿Usted también la acepta?
+portfolio.pending.mediationResult.button=Ver resolución propuesta
+portfolio.pending.mediationResult.popup.headline=Resultado de mediación para el intercambio con ID: {0}
+portfolio.pending.mediationResult.popup.headline.peerAccepted=El par de intercambio ha aceptado la sugerencia del mediador para el intercmabio {0}
+portfolio.pending.mediationResult.popup.info=El mediador ha sugerido el siguiente pago:\nUsted recibe: {0}\nEl par de intercambio recibe: {1}\n\nUsted puede aceptar o rechazar esta sugerencia de pago.\n\nAceptándola, usted firma el pago propuesto. Si su par de intercambio también acepta y firma, el pago se completará y el intercambio se cerrará.\n\nSi una o ambas partes rechaza la sugerencia, tendrá que esperar hasta {2} (bloque {3}) para abrir una segunda ronda de disputa con un árbitro que investigará el caswo de nuevo y realizará el pago de acuerdo a sus hallazgos.\n\nEl árbitro puede cobrar una tasa pequeña (tasa máxima: el depósito de seguridad del comerciante) como compensación por su trabajo. Que las dos partes estén de acuerdo es el buen camino, ya que requerir arbitraje se reserva para circunstancias excepcionales, como que un comerciante esté seguro de que el mediador hizo una sugerencia de pago injusta (o que la otra parte no responda).\n\nMás detalles acerca del nuevo modelo de arbitraje:\nhttps://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=Rechazar y solicitar arbitraje
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=Completado
-portfolio.closed.ticketClosed=Ticket cerrado
+portfolio.closed.ticketClosed=Arbitrada
+portfolio.closed.mediationTicketClosed=Mediada
portfolio.closed.canceled=Cancelado
portfolio.failed.Failed=Fallado
@@ -740,11 +802,14 @@ funds.tx.direction.receivedWith=Recibido con:
funds.tx.direction.genesisTx=Desde la transacción Génesis:
funds.tx.txFeePaymentForBsqTx=Comisión de minería para la tx BSQ
funds.tx.createOfferFee=Creador y comisión de transacción: {0}
-funds.tx.takeOfferFee=Tomador y comisiónde transacción: {0}
+funds.tx.takeOfferFee=Tomador y comisión de transacción: {0}
funds.tx.multiSigDeposit=Depósito Multifirma: {0}
funds.tx.multiSigPayout=Pago Multifirma: {0}
funds.tx.disputePayout=Pago disputa:{0}
funds.tx.disputeLost=Caso de pérdida de disputa: {0}
+funds.tx.collateralForRefund=Colateral para devolución de fondos: {0}
+funds.tx.timeLockedPayoutTx=Pago de transacción bloqueada en tiempo: {0}
+funds.tx.refund=Devolución de fondos de arbitraje: {0}
funds.tx.unknown=Razón desconocida: {0}
funds.tx.noFundsFromDispute=Sin devolución de disputa
funds.tx.receivedFunds=Fondos recibidos
@@ -765,14 +830,15 @@ funds.tx.dustAttackTx.popup=Esta transacción está enviando una cantidad de BTC
# Support
####################################################################
-support.tab.mediation.support=Tickets de soporte
-support.tab.ArbitratorsSupportTickets=Tickets de soporte del árbitro
-support.tab.TradersSupportTickets=Tickets de soporte de comerciante
+support.tab.mediation.support=Mediación
+support.tab.arbitration.support=Arbitraje
+support.tab.legacyArbitration.support=Legado de arbitraje
+support.tab.ArbitratorsSupportTickets=Tickets de {0}
support.filter=Filtrar lista
support.filter.prompt=Introduzca ID de transacción, fecha, dirección onion o datos de cuenta.
support.noTickets=No hay tickets abiertos
support.sendingMessage=Enviando mensaje...
-support.receiverNotOnline=El receptor no está online. El mensaje se ha guardado en su bandeja de entrada.
+support.receiverNotOnline=El receptor no está conectado. El mensaje se ha guardado en su bandeja de entrada.
support.sendMessageError=El envío del mensaje no tuvo éxito. Error: {0}
support.wrongVersion=La oferta en esta disputa ha sido creada con una versión antigua de Bisq.\nNo puede cerrar esta disputa con su versión de la aplicación.\n\nPor favor, utilice una versión anterior con la versión de protocolo {0}
support.openFile=Abrir archivo a adjuntar (tamaño máximo del archivo: {0} kb)
@@ -782,7 +848,7 @@ support.attachment=Adjuntado
support.tooManyAttachments=No puede enviar más de 3 adjuntos en un mensaje.
support.save=Guardar archivo al disco
support.messages=Mensajes
-support.input.prompt=Por favor, introduzca aquí su mensaje al árbitro
+support.input.prompt=Introduzca mensaje...
support.send=Enviar
support.addAttachments=Añadir adjuntos
support.closeTicket=Cerrar ticket
@@ -801,14 +867,18 @@ support.buyerOfferer= comprador/creador BTC
support.sellerOfferer=vendedor/creador BTC
support.buyerTaker=comprador/Tomador BTC
support.sellerTaker=vendedor/Tomador BTC
-support.backgroundInfo=Bisq no es una compañía, por ello maneja las disputas de una forma diferente.\n\nSi hay disputas en el proceso de intercambio (Ej. un trader no sigue el protocolo de intercambio la aplicación mostrará un botón de \"Abrir disputa\" después de que el periodo de intercambio haya finalizado para contactar con el árbitro.\n\nSi hay algún problema con la aplicación, el software intentará detectarlo y, si es posible, mostrará el botón \"Abrir ticket de soporte\" para contactar con el árbitro, que enviará el problema a los desarrolladores.\n\nSi tiene algún problema y no ve el botón \"Abrir ticket de soporte\" puede abrir un ticket de soporte manualmente seleccionando el intercambio causante de problemas en \"Portafolio/Intercambios Abiertos\" y pulsando \"alt + o\" o \"option + o\". Por favor use este método solo si está seguro de que el software no está funcionando como debería. Si tiene problemas o preguntas, por favor consulte las FAQ en la web bisq.network o escriba en el foro de Bisq en la sección de Soporte.
-support.initialInfo=Por favor, introduzca una descripción de su problema en el campo de texto inferior. Añada tanta información como sea posible para acelerar el tiempo de resolución de la disputa.\n\nAquí tiene una lista de la información que debería proveer:\n● Si es comprador de BTC: Realizó la transferencia de FIAT o de altcoins? Si es así, hizo clic en el botón "pago iniciado" de la aplicación?\n● Si es el vendedor BTC: Recibió el pago FIAT o de altcoin? Si es así, hizo clic en el botón "pago recibido" de la aplicación?\n● Qué versión de Bisq está usando?\n● Qué sistema operativo está usando?\n● Si ha encontrado algún problema con transacciones fallidas por favor considere cambiar a un nuevo directorio de datos.\nA veces el directorio de datos se corrompe y provoca fallas extrañas.\nVer: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPor favor familiarícese con las reglas básicas del proceso de disputa:\n● Tiene que responder a el requerimiento del árbitro en 2 días.\n● El periodo máximo de una disputa es de 14 días.\n● Necesita cooperar con el árbitro y proveer la información que le soliciten para resolver su caso.\n● Ha aceptado las reglas descritas en el documento de disputa en el acuerdo de usuario la primera vez que inició la aplicación.\n\nPuede leer más acerca del proceso de disputa en: https://bisq.network/docs/exchange/arbitration-system
+support.backgroundInfo=Bisq no es una compañía, por ello maneja las disputas de una forma diferente.\n\nLos compradores y vendedores pueden comunicarse a través de la aplicación por un chat seguro en la pantalla de intercambios abiertos para intentar resolver una disputa por su cuenta. Si eso no es suficiente, un mediador puede intervenir para ayudar. El mediador evaluará la situación y dará una recomendación para el pago de los fondos de la transacción. Si ambos aceptan esta sugerencia, la transacción del pago se completa y el intercambio se cierra. Si uno o ambos no están de acuerdo con el pago recomendado por el mediador, pueden solicitar arbitraje (hasta v1.2). El árbitro tiene la tercera llave de la transacción de depósito y hará el pago basado en sus hallazgos.
+support.initialInfo=Por favor, introduzca una descripción de su problema en el campo de texto de abajo. Añada tanta información como sea posible para agilizar la resolución de la disputa.\n\nEsta es una lista de la información que usted debe proveer:\n\t● Si es el comprador de BTC: ¿Hizo la transferencia Fiat o Altcoin? Si es así, ¿Pulsó el botón 'pago iniciado' en la aplicación?\n\t● Si es el vendedor de BTC: ¿Recibió el pago Fiat o Altcoin? Si es así, ¿Pulsó el botón 'pago recibido' en la aplicación?\n\t● ¿Qué versión de Bisq está usando?\n\t● ¿Qué sistema operativo está usando?\n\t● Si tiene problemas con transacciones fallidas, por favor considere cambiar a un nuevo directorio de datos.\n\tA veces el directorio de datos se corrompe y causa errores extraños.\n\tVer: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPor favor, familiarícese con las reglas básicas del proceso de disputa:\n\t● Tiene que responder a los requerimientos de {0} en 2 días.\n\t● Los mediadores responden en 2 días. Los árbitros responden en 5 días laborables.\n\t● El periodo máximo para una disputa es de 14 días.\n\t● Tiene que cooperar con {1} y proveer la información necesaria que soliciten.\n\t● Aceptó la reglas esbozadas en el documento de disputa en el acuerdo de usuario cuando inició por primera ver la aplicación.\n\nPuede leer más sobre el proceso de disputa en: {2}
support.systemMsg=Mensaje de sistema: {0}
support.youOpenedTicket=Ha abierto una solicitud de soporte.\n\n{0}\n\nVersión Bisq: {1}
support.youOpenedDispute=Ha abierto una solicitud de disputa.\n\n{0}\n\nVersión Bisq: {1}
-support.peerOpenedTicket=Su par de intercambio ha solicitado soporte debido a problemas técnicos.\n\n{0}
-support.peerOpenedDispute=Su pareja de intercambio ha solicitado una disputa.\n\n{0}
+support.youOpenedDisputeForMediation=Ha solicitado mediación\n\n{0}\n\nVersión Bisq: {1}
+support.peerOpenedTicket=Su par de intercambio ha solicitado soporte debido a problemas técnicos\n\n{0}\n\nVersión Bisq: {1}
+support.peerOpenedDispute=Su pareja de intercambio ha solicitado una disputa.\n\n{0}\n\nVersión Bisq: {1}
+support.peerOpenedDisputeForMediation=Su par de intercambio ha solicitado mediación.\n\n{0}\n\nVersión Bisq: {1}
+support.mediatorsDisputeSummary=Sistema de mensaje:\nResumen de disputa del mediador:\n{0}
+support.mediatorsAddress=Dirección del nodo del mediador: {0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=Añadir altcoin
setting.preferences.displayOptions=Mostrar opciones
setting.preferences.showOwnOffers=Mostrar mis propias ofertas en el libro de ofertas
setting.preferences.useAnimations=Usar animaciones
+setting.preferences.useDarkMode=Usar modo oscuro (beta)
setting.preferences.sortWithNumOffers=Ordenar listas de mercado por número de ofertas/intercambios
setting.preferences.resetAllFlags=Restablecer todas las casillas \"No mostrar de nuevo\"
setting.preferences.reset=Restablecer
@@ -852,17 +923,17 @@ settings.preferences.selectCurrencyNetwork=Seleccionar red
setting.preferences.daoOptions=Opciones de DAO
setting.preferences.dao.resync.label=Reconstruir estado de la DAO desde la tx génesis
setting.preferences.dao.resync.button=Resincronizar
-setting.preferences.dao.resync.popup=Después de un reinicio de la aplicación los datos de governanza de la red P2P serán recargados desde los nodos semilla y el estado de consenso BSQ será reconstruido desde la transacción génesis.
+setting.preferences.dao.resync.popup=Después de un reinicio de la aplicación los datos de gobernanza de la red Bisq serán recargados desde los nodos semilla y el estado de consenso BSQ será reconstruido desde la transacción génesis.
setting.preferences.dao.isDaoFullNode=Ejecutar Bisq como nodo completo de la DAO
setting.preferences.dao.rpcUser=nombre de usuario RPC
setting.preferences.dao.rpcPw=contraseña RPC
setting.preferences.dao.blockNotifyPort=Puerto de notificación de bloque
-setting.preferences.dao.fullNodeInfo=Para ejecutar Bisq como un nodo completo de la DAO necesita estar ejecutando localmente Bitcoin Core con RPC activado. Tdoos los requesittos están documentados en ''{0}''.\n\nDespués de cambiar el modo, necesita reiniciar.
+setting.preferences.dao.fullNodeInfo=Para ejecutar Bisq como un nodo completo de la DAO necesita estar ejecutando localmente Bitcoin Core con RPC activado. Todos los requisitos están documentados en ''{0}''.\n\nDespués de cambiar el modo, necesita reiniciar.
setting.preferences.dao.fullNodeInfo.ok=Abrir página de documentos
setting.preferences.dao.fullNodeInfo.cancel=No, me quedo con el modo ligero
settings.net.btcHeader=Red Bitcoin
-settings.net.p2pHeader=Red P2P
+settings.net.p2pHeader=Red Bisq
settings.net.onionAddressLabel=Mi dirección onion
settings.net.btcNodesLabel=Utilizar nodos Bitcoin Core personalizados
settings.net.bitcoinPeersLabel=Pares conectados
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=Recibido
settings.net.peerTypeColumn=Tipo de par
settings.net.openTorSettingsButton=Abrir configuración Tor
+settings.net.versionColumn=Versión
+settings.net.subVersionColumn=Sub versión
+settings.net.heightColumn=Altura
+
settings.net.needRestart=Necesita reiniciar la aplicación para aplicar ese cambio.\n¿Quiere hacerlo ahora?
settings.net.notKnownYet=Aún no conocido...
settings.net.sentReceived=Enviado: {0}, recibido: {1}
@@ -928,55 +1003,54 @@ setting.about.subsystems.val=Versión de red: {0}; Versión de mensajes P2P: {1}
####################################################################
account.tab.arbitratorRegistration=Registro de árbitro
+account.tab.mediatorRegistration=Registro de mediador
+account.tab.refundAgentRegistration=Registro de agente de devolución de fondos
account.tab.account=Cuenta
account.info.headline=Bienvenido a su cuenta Bisq
-account.info.msg=Aquí puede añadir cuentas de intercambio para monedas nacionales y altcoins, seleccionar árbitros y crear una copia de seguridad de la cartera y datos de cuenta.\n\nSe ha creado una nueva cartera de Bitcoin la primera vez que inició Bisq.\n\nRecomendamos encarecidamente que anote las palabras semilla de la cartera Bitcoin (ver pestaña superior) y considere añadir una contraseña antes de enviar fondos. Los depósitos y retiros de Bitcoin se administran en la sección \"Fondos\".\n\nNota de Privacidad y Seguridad: debido a que Bisq es un exchange descentralizado, todos sus datos se mantienen en su ordenador. No hay servidores y no tenemos acceso a su información personal, sus fondos ni su dirección IP. Datos como números de cuentas bancarias, direcciones Bitcoin y altcoin, etc sólo se comparten con el par de intercambio para completar los intercambios iniciados (en caso de disputa, el árbitro verá los mismos datos que el par de intercambio).
+account.info.msg=Aquí puede añadir cuentas de intercambio para monedas nacionales y altcoins y crear una copia de su cartera y datos de cuenta.\n\nUna nueva cartera Bitcoin fue creada la primera vez que inició Bisq.\n\nRecomendamos encarecidamente que escriba sus palabras de la semilla de la cartera Bitcoin (mire pestaña arriba) y considere añadir una contraseña antes de enviar fondos. Los ingresos y retiros de Bitcoin se administran en la sección \"Fondos\".\n\nNota de privacidad y seguridad: Debido a que Bisq es un exchange descentralizado, todos sus datos se guardan en su ordenador. No hay servidores, así que no tenemos acceso a su información personal, sus saldos, o incluso su dirección IP. Datos como número de cuenta bancaria, direcciones altcoin y Bitcoin, etc son solo compartidos con su par de intercambio para completar intercambios iniciados (en caso de una disputa el mediador o árbitro verá los mismos datos que el par de intercambio).
account.menu.paymentAccount=Cuentas de moneda nacional
account.menu.altCoinsAccountView=Cuentas de altcoin
-account.menu.password=Password de monedero
+account.menu.password=Contraseña de monedero
account.menu.seedWords=Semilla del monedero
account.menu.backup=Copia de seguridad
account.menu.notifications=Notificaciones
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=Llave pública
-account.arbitratorRegistration.register=Registro de árbitro
-account.arbitratorRegistration.revoke=Revocar registro
-account.arbitratorRegistration.info.msg=Por favor, tenga en cuenta que necesita estar disponible durante 15 días después de la revocación porque podría haber intercambios en los que esté envuelto como árbitro. El periodo máximo de intercambio es de 8 días y el proceso de disputa puede llevar hasta 7 días.
+account.arbitratorRegistration.register=Registrar
+account.arbitratorRegistration.registration={0} registro
+account.arbitratorRegistration.revoke=Revocar
+account.arbitratorRegistration.info.msg=Por favor, tenga en cuenta que necesita estar disponible 15 días después la revocación pues puede haber intercambios que le usen como {0}. El periodo máximo de intercambio permitido es de 8 días y el proceso de disputa puede llevar hasta 7 días.l
account.arbitratorRegistration.warn.min1Language=Necesita especificar al menos 1 idioma.\nHemos añadido el idioma por defecto para usted.
-account.arbitratorRegistration.removedSuccess=Ha eliminado su árbitro de la red P2P satisfactoriamente.
-account.arbitratorRegistration.removedFailed=No se pudo eliminar el árbitro. {0}
-account.arbitratorRegistration.registerSuccess=Ha registrado satisfactoriamente su árbitro en la red P2P.
-account.arbitratorRegistration.registerFailed=No se pudo registrar el árbitro. {0}
-
-account.arbitratorSelection.minOneArbitratorRequired=Necesita especificar al menos 1 idioma.\nHemos añadido el idioma por defecto para usted.
-account.arbitratorSelection.whichLanguages=Qué idiomas habla?
-account.arbitratorSelection.whichDoYouAccept=Qué árbitros acepta?
-account.arbitratorSelection.autoSelect=Seleccionar automáticamente árbitros con idioma coincidente.
-account.arbitratorSelection.regDate=Fecha de registro
-account.arbitratorSelection.languages=Idiomas
-account.arbitratorSelection.cannotSelectHimself=Un árbitro no puede seleccionarse a a sí mismo para un intercambio.
-account.arbitratorSelection.noMatchingLang=No hay idiomas coincidentes.
-account.arbitratorSelection.noLang=Puede seleccionar solamente árbitros que hablen al menos 1 idioma en común.
-account.arbitratorSelection.minOne=Necesita tener al menos un árbitro seleccionado.
+account.arbitratorRegistration.removedSuccess=Ha eliminado su registro de la red Bisq con éxito.
+account.arbitratorRegistration.removedFailed=No se pudo eliminar el registro.{0}
+account.arbitratorRegistration.registerSuccess=Se ha registrado con éxito en la red Bisq.
+account.arbitratorRegistration.registerFailed=No se pudo completar el registro.{0}
account.altcoin.yourAltcoinAccounts=Sus cuentas de altcoin
-account.altcoin.popup.wallet.msg=¡Por favor asegúrese de que sigue los requerimientos para el uso de carteras {0} tal como se describe en la página web {1}.\nUsar carteras de casas de cambio centralizadas donde (a) no tiene control sobre las claves o (b) donde no usan carteras compatible es arriesgado: puede llevar a la pérdida de los fondos intercambiados!\nEl árbitro no es un especialista {2} y no puede ayudar en tales casos.
+account.altcoin.popup.wallet.msg=Por favor, asegúrese que sigue los requisitos para el uso de carteras {0} como se describe en la página web {1}.\nUsando carteras desde exchanges centralizados donde (a) usted no controla sus claves o (b) que no usan monederos compatibles con el software es un riesgo: ¡puede llevar a la perdida de los fondos intercambiados!\nEl mediador o árbitro no es un especialista en {2} y no puede ayudar en tales casos.
account.altcoin.popup.wallet.confirm=Entiendo y confirmo que sé qué monedero tengo que utilizar.
-account.altcoin.popup.arq.msg=El ARQ de intercambio de Bisq requiere que entienda y cumpla los siguientes requerimientos:\n\nPara el ARQ de envío, neceita utilizar la cartera oficial ArQmA GUI o una cartera ArQmA CLI con la opción store-tx-info habilitada (predeterminada en nuevas versiones). Por favor asegúrese de poder acceder a las llave TX ya que podría ser requerido en caso de disputa.\narqma-wallet-cli (utilice el comando get_tx_key)\narqma-wallet-gui (vaya a la pestaña historial y haga clic en el botón (P) para prueba de pago)\n\nEn los exploradores de bloques normales la transferencia no es verificable.\n\nNecesita proveer al árbitro los siguientes datos en caso de disputa:\n- El tx de la llave privada\n- El hash de transacción\n- La dirección publica de recepción\n\nFallar en proveer los datos arriba señalados, o si utilizó una cartera incompatible, resultará en perder la disputa. La parte ARQ que envía es responsable de proveer verificación de la transferencia ARQ al árbitro en caso de disputa.\n\nNo se requiere ID de pago, solo la dirección pública normal.\nSi no está seguro sobre el proceso visite el canal ArQmA en discord (https://discord.gg/s9BQpJT) o el foro de ArQmA (https://labs.arqma.com) para encontrar más información.
-account.altcoin.popup.xmr.msg=Intercambiar XMR en Bisq, requiere entender y cumplir los siguientes requisitos\n\nPara enviar XMR necesita usar o el monedero oficial Monero GUI o el monedero Monero simple con la bandera store-tx-info habilitada (por defecto en las nuevas versiones). Por favor asegúrese de que puede acceder a la tx key (usar el comando get_tx_key en simplewallet) porque podría requerirse en caso de disputa.\nmonero-wallet-cli (use el comando get_tx_key)\nmonero-wallet-gui (vaya a la pestaña de historia y clique en el botón (P) para prueba de pago)\n\nAdemás de la herramienta XMR checktx (https://xmr.llcoins.net/checktx.html) la verificación también se puede cumplir dentro del monedero.\nmonero-wallet-cli : usando el comando (check_tx_key).\nmonero-wallet-gui : en Avanzado > Probar/Comprobar página.\nEn exploradores de bloque normales la transferencia no es verificable.\n\nNecesita entregar al árbitro la siguiente información en caso de disputa:\n- La clave privada de transacción (tx private key).\n- El hash de transacción.\n- La dirección pública del receptor.\n\nSi no puede proveer la información o si ha usado un monedero incompatible resultaría en la pérdida del caso de disputa. El emisor de XMR es responsable de ser capaz de verificar la transacción XMR a el árbitro en caso de disputa.\n\nNo se requiere la ID de pago, sólo la dirección pública normal.\nSi no está seguro del proceso visite (https://www.getmonero.org/resources/user-guides/prove-payment.html) o el foro Monero (https://forum.getmonero.org) para más información.
-account.altcoin.popup.blur.msg=Intercambia BLUR en Bisq requiere que entienda y cumpla los siguientes requerimientos:\n\nPara enviar BLUR debe usar la cartera Blur Network CLI o GUI. \n\nSi utiliza la cartera CLI, un hash de transacción (tx ID) se mostrará despues de hacer una transferencia. Deberá guardar esta información. Inmediatamente después de enviar la transferencia, deberá utilizar el comando 'get_tx_key' para obtener la llave privada de la transacción. Si falla en realizar este paso, es posible que no pueda obtener la llave mas tarde. \n\nSi utiliza la cartera Blur Network GUI, la llave privada y ID de la transacción puede ser encontrara convenientemente en la pestaña "Historia". Inmediatamente después del envío, localice la transacción de interés. Haga clic en el símbolo "?" en la esquina inferior derecha de la caja que contiene la transacción. Debe guardar esta información. \n\nEn caso de que sea necesaria una disputa, deberá presentar lo siguiente al árbitro: 1.) el ID de transacción, 2.) la llave privada de la transacción, y 3.) la dirección de destino. El árbitro verificará la transferencia BLUR utilizando el visor de transacciones Blur (https://blur.cash/#tx-viewer).\n\nFallar en proporciona la información requerida al árbitro resultará en perder la disputa. En todos los casos de disputa, el remitente BLUR asume el 100% de la responsabilidad en la verificación de las transacciones a un árbitro.. \n\nSi no comprende estos requisitos, no realice transacciones en Bisq. Primero, busque ayuda en Blur Network Discord (https://discord.gg/dMWaqVW).
-account.altcoin.popup.cash2.msg=Operar con CASH2 en Bisq requiere que usted comprenda y cumpla con los siguientes requisitos:\n\nPara enviar CASH2, debe utilizar la cartera Cash2 versión 3 o superior. \n\nDespués de que se envía una transacción, se mostrará el ID de la transacción. Debe guardar esta información. Inmediatamente después de enviar la transacción, debe usar el comando 'getTxKey' en simplewallet para recuperar la llave secreta de la transacción. \n\nEn el caso de que sea necesario un arbitraje, debe presentar lo siguiente a un árbitro: 1) la identificación de la transacción, 2) la llave secreta de la transacción y 3) la dirección Cash2 del destinatario. El árbitro entonces verificará la transferencia CASH2 usando el Explorador de Bloques Cash2 (https://blocks.cash2.org).\n\nSi no se proporciona la información requerida al árbitro, se perderá el caso de la disputa. En todos los casos de disputa, el remitente de CASH2 lleva el 100% de la carga de la responsabilidad de verificar las transacciones a un árbitro.\n\nSi no comprende estos requisitos, no realice transacciones en Bisq. Primero, busque ayuda en Cash2 Discord (https://discord.gg/FGfXAYN).
-account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC).
-account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help.
-account.altcoin.popup.ZEC.msg=Al usar Zcash solo puede usar las direcciones transparentes (que comienzan con t), no las direcciones-z (privadas), porque el árbitro no sería capaz de verificar la transacción con direcciones-z.
-account.altcoin.popup.XZC.msg=Al usar Zcoin puede usar únicamente las direcciones transparentes (trazables) y no las no-trazables, porque el árbitro no sería capaz de verificar la transacción con direcciones no trazables en el explorador de bloques.
-account.altcoin.popup.grin.msg=GRIN requires an interactive process between the sender and receiver to create the transaction. Be sure to follow the instructions from the GRIN project web page to reliably send and receive GRIN (the receiver needs to be online or at least be online during a certain time frame). \n\nBisq supports only the Grinbox (Wallet713) wallet URL format. \n\nThe GRIN sender is required to provide proof that they have sent GRIN successfully. If the wallet cannot provide that proof, a potential dispute will be resolved in favor of the GRIN receiver. Please be sure that you use the latest Grinbox software which supports the transaction proof and that you understand the process of transferring and receiving GRIN as well as how to create the proof. \n\nSee https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only for more information about the Grinbox proof tool.
-account.altcoin.popup.beam.msg=BEAM requires an interactive process between the sender and receiver to create the transaction. \n\nBe sure to follow the instructions from the BEAM project web page to reliably send and receive BEAM (the receiver needs to be online or at least be online during a certain time frame). \n\nThe BEAM sender is required to provide proof that they sent BEAM successfully. Be sure to use wallet software which can produce such a proof. If the wallet cannot provide the proof a potential dispute will be resolved in favor of the BEAM receiver.
-account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh).
+account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information.
+account.altcoin.popup.arq.msg=El ARQ de intercambio de Bisq requiere que entienda y cumpla los siguientes requerimientos:\n\nPara el ARQ de envío, necesita utilizar la cartera oficial ArQmA GUI o una cartera ArQmA CLI con la opción store-tx-info habilitada (predeterminada en nuevas versiones). Por favor asegúrese de poder acceder a la llave tx ya que podría ser requerido en caso de disputa.\narqma-wallet-cli (utilice el comando get_tx_key)\narqma-wallet-gui (vaya a la pestaña historial y pulse el botón (P) para prueba de pago)\n\nEn los exploradores de bloques normales la transferencia no es verificable.\n\nNecesita proveer al mediador o al árbitro los siguientes datos en caso de disputa:\n- El tx de la llave privada\n- El hash de transacción\n- La dirección publica de recepción\n\nNo proveer los datos arriba señalados, o si utilizó una cartera incompatible, resultará en perder la disputa. La parte ARQ que envía es responsable de proveer verificación de la transferencia ARQ al mediador o al árbitro en caso de disputa.\n\nNo se requiere ID de pago, solo la dirección pública normal.\nSi no está seguro sobre el proceso visite el canal ArQmA en discord (https://discord.gg/s9BQpJT) o el foro de ArQmA (https://labs.arqma.com) para encontrar más información.
+account.altcoin.popup.xmr.msg=Intercambiar XMR en Bisq, requiere entender y cumplir los siguientes requisitos\n\nPara enviar XMR necesita usar o la cartera oficial Monero GUI o la cartera Monero CLI con la bandera store-tx-info habilitada (por defecto en las nuevas versiones). Por favor asegúrese de que puede acceder a la tx key porque podría requerirse en caso de disputa.\nmonero-wallet-cli (use el comando get_tx_key)\nmonero-wallet-gui (vaya a la pestaña de historia y pulse el botón (P) para prueba de pago)\n\nAdemás de la herramienta XMR checktx (https://xmr.llcoins.net/checktx.html) la verificación también se puede cumplir dentro de la cartera.\nmonero-wallet-cli : usando el comando (check_tx_key).\nmonero-wallet-gui : en Avanzado > Probar/Comprobar página.\nEn exploradores de bloque normales la transferencia no es verificable.\n\nNecesita entregar al mediador o árbitro la siguiente información en caso de disputa:\n- La clave privada de transacción (tx private key).\n- El hash de transacción.\n- La dirección pública del receptor.\n\nSi no puede proveer la información o si ha usado una cartera incompatible resultaría en la pérdida del caso de disputa. El emisor de XMR es responsable de ser capaz de verificar la transacción XMR al mediador o al árbitro en caso de disputa.\n\nNo se requiere la ID de pago, sólo la dirección pública normal.\nSi no está seguro del proceso visite (https://www.getmonero.org/resources/user-guides/prove-payment.html) o el foro Monero (https://forum.getmonero.org) para más información.
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs).
+account.altcoin.popup.blur.msg=Intercambiar BLUR en Bisq requiere que entienda y cumpla los siguientes requisitos:\n\nPara enviar BLUR debe usar Blur Network CLI o la cartera GUI. \n\nSi utiliza la cartera CLI, un hash de transacción (tx ID) se mostrará después de hacer una transferencia. Deberá guardar esta información. Inmediatamente después de enviar la transferencia, deberá utilizar el comando 'get_tx_key' para obtener la clave privada de transacción. Si no realiza este paso, es posible que no pueda obtener la llave mas tarde. \n\nSi utiliza la cartera Blur Network GUI, la clave privada de transacción y el ID de transacción puede ser encontrada convenientemente en la pestaña "Historia". Inmediatamente después del envío, localice la transacción de interés. Pulse en el símbolo "?" en la esquina inferior derecha de la caja que contiene la transacción. Debe guardar esta información. \n\nEn caso de que sea necesaria una disputa, deberá presentar lo siguiente al mediador o al árbitro: 1.) el ID de transacción, 2.) la clave privada de transacción, y 3.) la dirección de destino. El mediador o árbitro entonces verificará la transferencia BLUR utilizando el Visor de Transacción Blur (https://blur.cash/#tx-viewer).\n\nSi no se proporciona la información requerida al mediador o al árbitro se perderá el caso de disputa. En todos los casos de disputa, el remitente BLUR asume el 100% de la responsabilidad en la verificación de las transacciones a un mediador o a un árbitro.. \n\nSi no comprende estos requisitos, no realice transacciones en Bisq. Primero, busque ayuda en Blur Network Discord (https://discord.gg/dMWaqVW).
+account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/).
+account.altcoin.popup.cash2.msg=Intercambiar CASH2 en Bisq requiere que usted comprenda y cumpla con los siguientes requisitos:\n\nPara enviar CASH2, debe utilizar la cartera Cash2 versión 3 o superior. \n\nDespués de que se envía una transacción, se mostrará el ID de transacción. Debe guardar esta información. Inmediatamente después de enviar la transacción, debe usar el comando 'getTxKey' en simplewallet para recuperar la llave secreta de la transacción. \n\nEn el caso de que sea necesario un arbitraje, debe presentar lo siguiente a un mediador o a un árbitro: 1) ID de transacción, 2) la llave secreta de la transacción y 3) la dirección Cash2 del destinatario. El mediador o el árbitro entonces verificará la transferencia CASH2 usando el Explorador de Bloques Cash2 (https://blocks.cash2.org).\n\nSi no se proporciona la información requerida al mediador o al árbitro, se perderá el caso de disputa. En todos los casos de disputa, el remitente de CASH2 lleva el 100% de la carga de la responsabilidad de verificar las transacciones a un mediador o a un árbitro.\n\nSi no comprende estos requisitos, no realice transacciones en Bisq. Primero, busque ayuda en Cash2 Discord (https://discord.gg/FGfXAYN).
+account.altcoin.popup.qwertycoin.msg=Intercambiar Qwertycoin en Bisq requiere que usted comprenda y cumpla los siguientes requisitos:\n\nPara enviar QWC, debe utilizar la cartera oficial QWC versión 5.1.3 o superior. \n\nDespués de que se envía una transacción, se mostrará el ID de transacción. Debe guardar esta información. Inmediatamente después de enviar la transacción, debe usar el comando 'get_Tx_Key' en simplewallet para recuperar la llave secreta de la transacción.\n\nEn el caso de que sea necesario un arbitraje, debe presentar lo siguiente a un mediador o un árbitro: 1) ID de transacción, 2) la llave secreta de la transacción y 3) la dirección QWC del destinatario. El mediador o el árbitro entonces verificará la transferencia QWC usando el Explorador de Bloques QWC (https://explorer.qwertycoin.org).\n\nSi no se proporciona la información requerida al mediador o al árbitro, se perderá el caso de disputa. En todos los casos de disputa, el remitente de QWC lleva el 100% de la carga de la responsabilidad de verificar las transacciones a un mediador o un árbitro.\n\nSi no comprende estos requisitos, no realice transacciones en Bisq. Primero, busque ayuda en QWC Discord (https://discord.gg/rUkfnpC).
+account.altcoin.popup.drgl.msg=Intercambiar Dragonglass on Bisq requiere que usted comprenda y cumpla los siguientes requisitos:\n\nDebido a la privacidad que Dragonglass provee, una transacción no es verificable en la blockchain pública. Si es requerido, usted puede probar su pago a través del uso de su TXN-Private-Key.\nLa TXN-clave privada es una one-time clave generada automáticamente para cada transacción que solo puede ser accedida desde dentro de su cartera DRGL.\nO por DRGL-wallet GUI (dentro del diálogo de detalles de transacción) o por la Dragonglass CLI simplewallet (usando el comando "get_tx_key").\n\nDRGL version 'Oathkeeper' y superior son REQUERIDAS para ambos.\n\nEn caso de que sea necesario un arbitraje, debe presentar lo siguiente a un mediador o un árbitro:\n- La TXN-clave privada\n- El hash de transacción\n- La dirección pública del destinatario\n\nLa verificación de pago puede ser hecha usando los datos de arriba en (http://drgl.info/#check_txn).\n\nNo proporcionar los datos anteriores, o si usted usó una cartera incompatible, resultará en la pérdida del caso de disputa. El Dragonglass remitente es responsable de proveer verificación de la transferencia DRGL al mediador o al árbitro en caso de una disputa. El uso de PaymentID no es requerido.\n\nSi usted no está seguro sobre cualquier parte de este proceso, visite Dragonglass en Discord (http://discord.drgl.info) para ayuda.
+account.altcoin.popup.ZEC.msg=Al usar Zcash solo puede usar las direcciones transparentes (que comienzan con t), no las direcciones-z (privadas), porque el mediador o el árbitro no sería capaz de verificar la transacción con direcciones-z.
+account.altcoin.popup.XZC.msg=Al usar Zcoin puede usar únicamente las direcciones transparentes (trazables) y no las no-trazables, porque el mediador o el árbitro no sería capaz de verificar la transacción con direcciones no trazables en el explorador de bloques.
+account.altcoin.popup.grin.msg=GRIN requiere un proceso interactivo entre el emisor y el receptor para crear la transacción. Asegúrese de seguir las instrucciones de la web del proyecto GRIN para enviar y recibir GRIN con seguridad (el receptor necesita estar en línea o al menos estar en línea durante un cierto periodo de tiempo).\nBisq solo soporta el Grinbox (Wallet713) monedero URL formato.\n\nEl emisor GRIN requiere proveer prueba que ha enviado GRIN correctamente. Si el monedero no puede proveer esa prueba, una posible controversia será resuelta a favor del GRIN receptor. Por favor asegúrese que usa el último Grinbox software que soporta la prueba de transacción y que usted entiende el proceso de transferir y recibir GRIN así como la forma de crear la prueba.\n\nVer https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only para más información sobre la herramienta de prueba Grinbox.
+account.altcoin.popup.beam.msg=BEAM requiere un proceso interactivo entre el emisor y el receptor para crear la transacción.\n\nAsegúrese de seguir la instrucciones de la página web del proyecto BEAM para enviar y recibir BEAM con seguridad (el receptor necesita estar el línea o por lo menos estar en línea durante cierto periodo de tiempo).\n\nEl emisor BEAM requiere proveer prueba de que envió BEAM correctamente. Asegúrese de usar software de monedero que pueda producir tal prueba. Si el monedero no provee la prueba, una posible controversia será resuelta en favor del BEAM receptor.
+account.altcoin.popup.pars.msg=Intercambiar ParsiCoin en Bisq requiere que usted comprenda y cumpla con los siguientes requisitos:\n\nPara enviar PARS, debe usar la cartera oficial ParsiCoin version 3.0.0 o superior.\n\nPuede comprobar su hash de transacción y la clave de la transacción en la sección de Transacciones en su cartera GUI (ParsiPay). Necesita pulsar el botón derecho en la transacción y pulsar mostrar detalles.\n\nEn el caso de que sea necesario arbitraje, debe presentar lo siguiente al mediador o al árbitro: 1) El hash de transacción, 2) La llave de la transacción, y 3) La dirección del receptor PARS. El árbitro entonces verificará la transferencia PARS usando el ParsiCoin Explorador de Bloques (http://explorer.parsicoin.net/#check_payment).\n\nSi no se proporciona la información requerida al mediador o al árbitro, se perderá el caso de disputa. En todos los casos de disputa, el remitente de ParsiCoin lleva 100% de la carga de la responsabilidad de verificar las transacciones a un mediador o un árbitro\n\nSi no comprende estos requisitos, no realice transacciones en Bisq. Primero, busque ayuda en ParsiCoin Discord (https://discord.gg/c7qmFNh).
-account.fiat.yourFiatAccounts=Sus cuentas de moneda/nnacional:
+account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash.
+
+account.fiat.yourFiatAccounts=Sus cuentas de moneda nacional:
account.backup.title=Copia de seguridad del monedero
account.backup.location=Ubicación de la copia de seguridad
@@ -986,20 +1060,20 @@ account.backup.appDir=Directorio de datos de aplicación
account.backup.logFile=Archivo de registro
account.backup.openDirectory=Abrir directorio
account.backup.openLogFile=Abrir archivo de registro
-account.backup.success=Copia de seguridad guardada con éxito en: /n{0}
+account.backup.success=Copia de seguridad guardada con éxito en:\n{0}
account.backup.directoryNotAccessible=El directorio que ha elegido no es accesible. {0}
-account.password.removePw.button=Eliminar password
-account.password.removePw.headline=Eliminar protección por password del monedero
-account.password.setPw.button=Establecer password
-account.password.setPw.headline=Establecer protección por password del monedero
-account.password.info=Con protección por password necesitará introducir su password en el arranque de la aplicación, cuando retire bitcoin de su monedero, y cuando restaure su monedero desde las palabras semilla.
+account.password.removePw.button=Eliminar contraseña
+account.password.removePw.headline=Eliminar protección por contraseña del monedero
+account.password.setPw.button=Establecer contraseña
+account.password.setPw.headline=Establecer protección por contraseña del monedero
+account.password.info=Con protección por contraseña necesitará introducir su contraseña en el arranque de la aplicación, cuando retire bitcoin de su monedero, y cuando restaure su monedero desde las palabras semilla.
account.seed.backup.title=Copia de seguridad de palabras semilla del monedero
account.seed.info=Por favor apunte en un papel tanto las palabras semilla del monedero como la fecha! Puede recuperar su monedero en cualquier momento con las palabras semilla y la fecha.\nLas mismas palabras semilla se usan para el monedero BTC como BSQ\n\nDebe apuntar las palabras semillas en una hoja de papel. No la guarde en su computadora.\n\nPor favor, tenga en cuenta que las palabras semilla no son un sustituto de la copia de seguridad.\nNecesita hacer la copia de seguridad de todo el directorio de aplicación en la pantalla \"Cuenta/Copia de Seguridad\" para recuperar un estado de aplicación válido y los datos.\nImportar las palabras semilla solo se recomienda para casos de emergencia. La aplicación no será funcional sin una buena copia de seguridad de los archivos de la base de datos y las claves!
account.seed.warn.noPw.msg=No ha establecido una contraseña de cartera que proteja la visualización de las palabras semilla.\n\n¿Quiere que se muestren las palabras semilla?
account.seed.warn.noPw.yes=Sí, y no preguntar de nuevo
-account.seed.enterPw=Introducir password para ver las palabras semilla
+account.seed.enterPw=Introducir contraseña para ver las palabras semilla
account.seed.restore.info=Por favor haga una copia de seguridad antes de aplicar la restauración desde las palabras semilla. Tenga en cuenta que la restauración de cartera solo es para casos de emergencia y puede causar problemas con la base de datos interna del monedero.\nNo es el modo de aplicar una restauración de copia de seguridad! Por favor use una copia de seguridad desde el archivo de directorio de la aplicación para restaurar un estado de aplicación anterior.\n\nDespués de restaurar la aplicación se cerrará automáticamente. Después de reiniciar la aplicacion se resincronizará con la red Bitcoin. Esto puede llevar un tiempo y consumir mucha CPU, especialemente si la cartera es antigua y tiene muchas transacciones. Por favor evite interrumpir este proceso, o podría tener que borrar el archivo de la cadena SPV de nuevo o repetir el proceso de restauración.
account.seed.restore.ok=Ok, adelante con la restauración y el apagado de Bisq.
@@ -1097,7 +1171,7 @@ dao.proposal.menuItem.make=Hacer propuesta
dao.proposal.menuItem.browse=Consultar propuestas abiertas
dao.proposal.menuItem.vote=Votar propuestas
dao.proposal.menuItem.result=Resultados de votaciones
-dao.cycle.headline=Ciclo votación
+dao.cycle.headline=Ciclo de votación
dao.cycle.overview.headline=Resumen del ciclo de votación
dao.cycle.currentPhase=Fase actual
dao.cycle.currentBlockHeight=Altura de bloque actual
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=Factor de unidad de rol en garantía en BSQ
dao.param.ISSUANCE_LIMIT=Límite de emisión por ciclo en BSQ
dao.param.currentValue=Valor actual: {0}
+dao.param.currentAndPastValue=Valor actual: {0} (Valor cuando la propuesta fue hecha: {1})
dao.param.blocks={0} bloques
dao.results.cycle.duration.label=Duración de {0}
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} bloque(s)
dao.results.cycle.value.postFix.isDefaultValue=(valor por defecto)
dao.results.cycle.value.postFix.hasChanged=(ha sido cambiado en la votación)
-dao.results.invalidVotes=Hemos tenido votos inválidos en este ciclo de votaciones. Esto puede pasar si un voto no se distribuyó bien en la red P2P.\n\n{0}
+dao.results.invalidVotes=Hubo votos inválidos en ese ciclo. Eso pueda ocurrir si un voto no fue bien distribuido en la red Bisq.\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=Indefinido
@@ -1503,7 +1578,7 @@ dao.proposal.create.publish=Publicar propuesta
dao.proposal.create.publishing=Publicación de propuesta en progreso...
dao.proposal=propuesta
dao.proposal.display.type=Tipo de propuesta
-dao.proposal.display.name=Nombre/alias
+dao.proposal.display.name=Nombre de usuario exacto en GitHub
dao.proposal.display.link=Enlace a información detallada
dao.proposal.display.link.prompt=Enlace a la propuesta
dao.proposal.display.requestedBsq=Cantidad solicitada en BSQ
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=Voto actual: ''{0}''. Cambiar voto a:
dao.proposal.display.myVote.accepted=Aceptado
dao.proposal.display.myVote.rejected=Rechazado
dao.proposal.display.myVote.ignored=Ignorado
-dao.proposal.myVote.summary=Votado: {0}; Peso del voto: {1} (obtenido: {2} + stake: {3});
+dao.proposal.display.myVote.unCounted=Voto no incluido en el resultado
+dao.proposal.myVote.summary=Votos: {0}; Peso de voto: {1} (ganado: {2} + cantidad en juego: {3}) {4}
dao.proposal.myVote.invalid=Votación inválida
dao.proposal.voteResult.success=Aceptado
@@ -1640,7 +1716,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.
-dao.news.pastContribution.title=¿HIZÓ CONTRIUCIONES EN EL PASADO? SOLICITE BSQ
+dao.news.pastContribution.title=¿HIZO CONTRIBUCIONES EN EL PASADO? SOLICITE BSQ
dao.news.pastContribution.description=Si ha contribuido a Bisq por favor use la dirección BSQ de abajo y haga una solicitud por haber participado en la distribución de BSQ génesis.
dao.news.pastContribution.yourAddress=Su dirección de monedero BSQ
dao.news.pastContribution.requestNow=Solicitar ahora
@@ -1680,6 +1756,7 @@ 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 todas las BSQ: {0} BSQ
+dao.monitor.daoState.checkpoint.popup=El estado de DAO no está sincronizado con la red. Después de reiniciar el estado DAO se resincronizará.
dao.monitor.proposal.headline=Estado de propuestas
dao.monitor.proposal.table.headline=Estado de hashes de cadena de propuesta
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=Transacciones BSQ
dao.factsAndFigures.dashboard.marketPrice=Datos de mercado
dao.factsAndFigures.dashboard.price=Último precio intercambio BSQ/BTC (en Bisq)
+dao.factsAndFigures.dashboard.avgPrice90=Medía de 90 días del precio de intercambio BSQ/BTC
+dao.factsAndFigures.dashboard.avgPrice30=Medía de 30 días del precio de intercambio BSQ/BTC
dao.factsAndFigures.dashboard.marketCap=Capitalización de mercado (basado en el precio de intercambio)
dao.factsAndFigures.dashboard.availableAmount=BSQ totales disponibles
@@ -1741,7 +1820,7 @@ dao.factsAndFigures.transactions.irregularTx=No. de todas las transacciones irre
contractWindow.title=Detalles de la disputa
contractWindow.dates=Fecha oferta / Fecha intercambio
-contractWindow.btcAddresses=Direcicón Bitcoin comprador BTC / vendedor BTC
+contractWindow.btcAddresses=Dirección Bitcoin comprador BTC / vendedor BTC
contractWindow.onions=Dirección de red de comprador BTC / Vendedor BTC
contractWindow.accountAge=Edad de cuenta del comprador BTC / vendedor BTC
contractWindow.numDisputes=No. de disputas del comprador BTC / Vendedor BTC
@@ -1760,19 +1839,15 @@ displayUpdateDownloadWindow.button.downloadLater=Descargar más tarde
displayUpdateDownloadWindow.button.ignoreDownload=Ignorar esta versión
displayUpdateDownloadWindow.headline=¡Una nueva versión de Bisq está disponible!
displayUpdateDownloadWindow.download.failed.headline=Descarga fallida
-displayUpdateDownloadWindow.download.failed=Descarga fallida./nPor favor descargue y verifique manualmente en https://bisq.network/downloads
+displayUpdateDownloadWindow.download.failed=Descarga fallida.\nPor favor descargue y verifique manualmente en https://bisq.network/downloads
displayUpdateDownloadWindow.installer.failed=No se puede determinar el instalador correcto. Por favor, descargue y verifique manualmente en https://bisq.network/downloads
-displayUpdateDownloadWindow.verify.failed=Verificación fallida./nPor favor descargue y verifique manualmente en https://bisq.network/downloads
+displayUpdateDownloadWindow.verify.failed=Verificación fallida.\nPor favor descargue y verifique manualmente en https://bisq.network/downloads
displayUpdateDownloadWindow.success=La nueva versión ha sido descargada con éxito y la firma verificada.\n\nPor favor abra el directorio de descargas, cierre la aplicación e instale la nueva versión.
displayUpdateDownloadWindow.download.openDir=Abrir directorio de descargas
disputeSummaryWindow.title=Resumen
disputeSummaryWindow.openDate=Fecha de apertura de ticket
disputeSummaryWindow.role=Rol del trader
-disputeSummaryWindow.evidence=Evidencia
-disputeSummaryWindow.evidence.tamperProof=Evidencia probada de manipulación
-disputeSummaryWindow.evidence.id=Verificación ID
-disputeSummaryWindow.evidence.video=Video/Screencast
disputeSummaryWindow.payout=Pago de la cantidad de intercambio
disputeSummaryWindow.payout.getsTradeAmount=BTC {0} obtiene la cantidad de pago de intercambio
disputeSummaryWindow.payout.getsAll=El {0} BTC obtiene todo
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=Banco
disputeSummaryWindow.summaryNotes=Nota de resumen
disputeSummaryWindow.addSummaryNotes=Añadir notas de sumario
disputeSummaryWindow.close.button=Cerrar ticket
-disputeSummaryWindow.close.msg=Ticket cerrado el {0}\n\nResumen:\n{1} evidencia de manipulación entregada: {2}\n{3} hizo verificación de ID: {4}\n{5} hizo video o screencast: {6}\nCantidad de pago para el comprador de BTC: {7}Cantidad de pago para el vendedor de BTC: {8}\n\nNotas de resumen:{9}\n
+disputeSummaryWindow.close.msg=Ticket cerrado en {0}\n\nSumario:\nCantidad de pago para comprador de BTC: {1}\nCantidad de pago para vendedor de BTC: {2}\n\nNotas del sumario:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\nSiguientes pasos:\nAbrir el intercambio en curso y aceptar o rechazar la mediación sugerida
disputeSummaryWindow.close.closePeer=Necesitar cerrar también el ticket del par de intercambio!
+disputeSummaryWindow.close.txDetails.headline=Publicar transacción de devolución de fondos
+disputeSummaryWindow.close.txDetails.buyer=El comprador recibe {0} en la dirección: {1}\n
+disputeSummaryWindow.close.txDetails.seller=El vendedor recibe {0} en la dirección: {1}\n
+disputeSummaryWindow.close.txDetails=Gastando: {0}\n{1}{2}Tasa de transacción: {3} ({4} satoshis/byte)\nTamaño de transacción: {5} Kb\n\n¿Está seguro de que quiere publicar esta transacción?\n
emptyWalletWindow.headline=Herramienta de monedero {0} de emergencia
emptyWalletWindow.info=Por favor usar sólo en caso de emergencia si no puede acceder a sus fondos desde la Interfaz de Usuario (UI).\n\nPor favor, tenga en cuenta que todas las ofertas abiertas se cerrarán automáticamente al usar esta herramienta.\n\nAntes de usar esta herramienta, por favor realice una copia de seguridad del directorio de datos. Puede hacerlo en \"Cuenta/Copia de Seguridad\".\n\nPor favor repórtenos su problema y envíe un reporte de fallos en Github en el foro de Bisq para que podamos investigar qué causa el problema.
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=Tiene ofertas abiertas que se eliminarán si v
emptyWalletWindow.openOffers.yes=Sí, estoy seguro
emptyWalletWindow.sent.success=El balance de su monedero fue transferido con éxito.
-enterPrivKeyWindow.headline=Registro abierto sólo para árbitros invitados
+enterPrivKeyWindow.headline=Introduzca la clave privada para registrarse
filterWindow.headline=Editar lista de filtro
filterWindow.offers=Ofertas filtradas (separadas por coma)
@@ -1815,6 +1895,8 @@ filterWindow.accounts=Cuentas de intercambio filtradas:\nFormato: lista de [ID m
filterWindow.bannedCurrencies=Códigos de moneda filtrados (separados por coma)
filterWindow.bannedPaymentMethods=ID's de métodos de pago filtrados (separados por coma)
filterWindow.arbitrators=Árbitros filtrados (direcciones onion separadas por coma)
+filterWindow.mediators=Mediadores filtrados (direcciones onion separadas por coma)
+filterWindow.refundAgents=Agentes de devolución de fondos filtrados (direcciones onion separadas por coma)
filterWindow.seedNode=Nodos semilla filtrados (direcciones onion separadas por coma)
filterWindow.priceRelayNode=nodos de retransmisión de precio filtrados (direcciones onion separadas por coma)
filterWindow.btcNode=Nodos Bitcoin filtrados (direcciones + puerto separadas por coma)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(ID/BIC/SWIFT del banco del creador)
offerDetailsWindow.offerersBankName=(nombre del banco del creador)
offerDetailsWindow.bankId=ID de banco (v.g BIC o SWIFT)
offerDetailsWindow.countryBank=País del banco del creador
-offerDetailsWindow.acceptedArbitrators=Árbitros aceptados
offerDetailsWindow.commitment=Compromiso
offerDetailsWindow.agree=Estoy de acuerdo
offerDetailsWindow.tac=Términos y condiciones:
@@ -1883,8 +1964,9 @@ tradeDetailsWindow.tradeDate=Fecha de intercambio
tradeDetailsWindow.txFee=Comisión de minado
tradeDetailsWindow.tradingPeersOnion=Dirección onion de par de intercambio
tradeDetailsWindow.tradeState=Estado del intercambio
+tradeDetailsWindow.agentAddresses=Árbitro/Mediador
-walletPasswordWindow.headline=Introducir password para desbloquear
+walletPasswordWindow.headline=Introducir contraseña para desbloquear
torNetworkSettingWindow.header=Confirmación de red Tor
torNetworkSettingWindow.noBridges=No utilizar bridges
@@ -1934,37 +2016,38 @@ popup.reportError.gitHub=Reportar al rastreador de problemas de Github
popup.reportError={0}\n\nPara ayudarnos a mejorar el software por favor reporte el fallo en nuestro rastreador de fallos en https://github.com/bisq-network/bisq/issues.\nEl mensaje de error será copiado al portapapeles cuando haga clic en cualquiera de los botones inferiores.\nHará el depurado de fallos más fácil si puede adjuntar el archivo bisq.log presionando "Abrir archivo de log", guardando una copia y adjuntándola en su informe de errores.
popup.error.tryRestart=Por favor pruebe reiniciar la aplicación y comprobar su conexión a la red para ver si puede resolver el problema.
-popup.error.takeOfferRequestFailed=Un error ocurrió cuando alguien intentó tomar una de sus ofertas:/n{0}
+popup.error.takeOfferRequestFailed=Un error ocurrió cuando alguien intentó tomar una de sus ofertas:\n{0}
error.spvFileCorrupted=Ocurrió un error al leer el archivo de cadena SPV.\nPuede ser que el archivo de cadena SPV se haya corrompido.\n\nMensaje de error: {0}\n\n¿Quiere borrarlo y comenzar una resincronización?
error.deleteAddressEntryListFailed=No se pudo borrar el archivo AddressEntryList.\nError: {0}
popup.warning.walletNotInitialized=La cartera aún no sea ha iniciado
popup.warning.wrongVersion=Probablemente tenga una versión de Bisq incorrecta para este ordenador.\nLa arquitectura de su ordenador es: {0}.\nLos binarios de Bisq instalados son: {1}.\nPor favor cierre y reinstale la versión correcta ({2}).
-popup.warning.incompatibleDB=¡Hemos detectado archivos de base de datos incompatibles!\n\nEstos archivos de base de datos no son compatibles con nuestro actual código base:\n{0}\n\nHemos hecho una copia de seguridad de los archivos corruptos y aplicado los valores por defecto a la nueva versión de base de datos.\n\nLa copia de seguridad se localiza en:\n{1}/db/backup_of_corrupted_data.\n\nPor favor, compruebe si tiene la última versión de Bisq instalada.\nPuede descargarla en:\nhttps://bisq.io/downloads\n\nPor favor, reinicie la aplicación.
+popup.warning.incompatibleDB=¡Hemos detectado archivos de base de datos incompatibles!\n\nEstos archivos de base de datos no son compatibles con nuestro actual código base:\n{0}\n\nHemos hecho una copia de seguridad de los archivos corruptos y aplicado los valores por defecto a la nueva versión de base de datos.\n\nLa copia de seguridad se localiza en:\n{1}/db/backup_of_corrupted_data.\n\nPor favor, compruebe si tiene la última versión de Bisq instalada.\nPuede descargarla en:\nhttps://bisq.network/downloads\n\nPor favor, reinicie la aplicación.
popup.warning.startupFailed.twoInstances=Ya está ejecutando Bisq. No puede ejecutar dos instancias de Bisq.
popup.warning.cryptoTestFailed=Al parecer está utilizando un binario que ha compilado usted mismo y no ha seguido las instrucciones en https://github.com/bitsquare/bitsquare/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nSi no es el caso y está utilizando el binario oficial de Bisq, por favor informe del error en la página de Github.\nError={0}
popup.warning.tradePeriod.halfReached=Su intercambio con ID {0} ha alcanzado la mitad de el periodo máximo permitido de intercambio y aún no está completada.\n\nEl periodo de intercambio termina el {1}\n\nPor favor, compruebe el estado de su intercambio en \"Portafolio/Intercambios abiertos\" para más información.
-popup.warning.tradePeriod.ended=Su intercambio con ID {0} ha alcanzado el periodo máximo permitido de intercambio y aún no está completada.\n\nEl periodo de intercambio terminó el {1}\n\nPor favor, compruebe su intercambio en \"Portafolio/Intercambios abiertos\" para contactar con el árbitro.
+popup.warning.tradePeriod.ended=Su intercambio con ID {0} ha alcanzado el periodo máximo de intercambio y no se ha completado.\n\nEl periodo de intercambio finalizó en {1}\n\nPor favor, compruebe su intrecambio en \"Portafolio/Intercambios abiertos\" para contactar con el mediador.
popup.warning.noTradingAccountSetup.headline=No ha configurado una cuenta de intercambio
popup.warning.noTradingAccountSetup.msg=Necesita configurar una moneda nacional o cuenta de altcoin antes de crear una oferta.\n¿Quiere configurar una cuenta?
popup.warning.noArbitratorsAvailable=No hay árbitros disponibles.
+popup.warning.noMediatorsAvailable=No hay mediadores disponibles.
popup.warning.notFullyConnected=Necesita esperar hasta que esté completamente conectado a la red.\nPuede llevar hasta 2 minutos al inicio.
popup.warning.notSufficientConnectionsToBtcNetwork=Necesita esperar hasta que tenga al menos {0} conexiones a la red Bitcoin.
popup.warning.downloadNotComplete=Tiene que esperar hasta que finalice la descarga de los bloques Bitcoin que faltan.
popup.warning.removeOffer=¿Está seguro que quiere eliminar la oferta?\nLa comisión de creador de {0} se perderá si elimina la oferta.
popup.warning.tooLargePercentageValue=No puede establecer un porcentaje del 100% o superior.
popup.warning.examplePercentageValue=Por favor, introduzca un número de porcentaje como \"5.4\" para 5.4%
-popup.warning.noPriceFeedAvailable=No hay una fuente de precios disponible para esta moneda. No puede utilizar un precio pasado en porcentaje.\nPor favor, seleccione un precio fijo.
-popup.warning.sendMsgFailed=El envío de mensaje a su compañero de intercambio falló.\nPor favor, pruebe de nuevo y si continúa fallando, reporte la falla.
+popup.warning.noPriceFeedAvailable=No hay una fuente de precios disponible para esta moneda. No puede utilizar un precio basado en porcentaje.\nPor favor, seleccione un precio fijo.
+popup.warning.sendMsgFailed=El envío de mensaje a su compañero de intercambio falló.\nPor favor, pruebe de nuevo y si continúa fallando, reporte el fallo.
popup.warning.insufficientBtcFundsForBsqTx=No tiene suficientes fondos BTC para pagar la comisión de minado para esta transacción.\nPor favor ingrese fondos en su monedero BTC.\nFondos faltantes: {0}
-popup.warning.bsqChangeBelowDustException=Esta transacción crea una salida de cambio de BSQ que está por debajo del límite de dust (5.46 BSQ) y sería rechazada por la red Bitcoin.\n\nDebe enviar una cantidad mayor para evitar el output de cambio (Ej. , agregando la cantidad de dust a su cantidad de envío) o agregue más fondos de BSQ a su cartera para evitar generar un output de dust.\n\nEl output de dust es {0}.
-popup.warning.btcChangeBelowDustException=Esta transacción crea un output de cambio que está por debajo del límite de dust (546 Satoshi) y sería rechazada por la red de bitcoin.\n\nDebe agregar la cantidad de dust a su cantidad de envío para evitar generar un output de dust.\n\nEl output de dust es {0}.
+popup.warning.bsqChangeBelowDustException=Esta transacción crea un output BSQ de cambio que está por debajo del límite dust (5.46 BSQ) y sería rechazado por la red Bitcoin.\n\nTiene que enviar una cantidad mayor para evitar el output de cambio (Ej. agregando la cantidad de dust a su cantidad de envío) o añadir más fondos BSQ a su cartera para evitar generar un output de dust.\n\nEl output dust es {0}.
+popup.warning.btcChangeBelowDustException=Esta transacción crea un output de cambio que está por debajo del límite de dust (546 Satoshi) y sería rechazada por la red Bitcoin.\n\nDebe agregar la cantidad de dust a su cantidad de envío para evitar generar un output de dust.\n\nEl output de dust es {0}.
popup.warning.insufficientBsqFundsForBtcFeePayment=No tiene suficientes fondos BSQ para pagar la comisión de intercambio en BSQ. Puede pagar la tasa en BTC o tiene que fondear su monedero BSQ. Puede comprar BSQ en Bisq.\n\nFondos BSQ necesarios: {0}
popup.warning.noBsqFundsForBtcFeePayment=Su monedero BSQ no tiene suficientes fondos para pagar la comisión de intercambio en BSQ.
popup.warning.messageTooLong=Su mensaje excede el tamaño máximo permitido. Por favor, envíelo por partes o súbalo a un servicio como https://pastebin.com
-popup.warning.lockedUpFunds=Ha bloqueado fondos de un intercambio fallido.\nBalance bloqueado: {0} \nDirección de depósito TX: {1}\n ID de intercambio: {2}.\n\nPor favor, abra un ticket de soporte seleccionando el intercambio en la pantalla de intercambios pendientes y haciendo clic en \"alt + o\" o \"option + o\"."
+popup.warning.lockedUpFunds=Ha bloqueado fondos de un intercambio fallido.\nBalance bloqueado: {0}\nDirección de depósito TX: {1}\nID de intercambio: {2}.\n\nPor favor, abra un ticket de soporte seleccionando el intercambio en la pantalla de intercambios pendientes y haciendo clic en \"alt + o\" o \"option + o\"."
popup.warning.nodeBanned=Uno de los nodos {0} ha sido baneado. Por favor reinicie la aplicación para asegurarse de que no está conectada al nodo baneado.
popup.warning.priceRelay=retransmisión de precio
@@ -1989,23 +2072,40 @@ popup.securityRecommendation.msg=Nos gustaría recordarle que considere usar pro
popup.bitcoinLocalhostNode.msg=Bisq detectó un nodo Bitcoin Core operando localmente (en localhost).\nPor favor asegúrese de que este nodo esté completamente sincronizado antes de iniciar Bisq y el que no esté operando en modo de registro reducido (pruned mode).
popup.shutDownInProgress.headline=Cerrando aplicación...
-popup.shutDownInProgress.msg=Cerrrar la aplicación puede llevar unos segundos.\nPor favor no interrumpa el proceso.
+popup.shutDownInProgress.msg=Cerrar la aplicación puede llevar unos segundos.\nPor favor no interrumpa el proceso.
popup.attention.forTradeWithId=Se requiere atención para el intercambio con ID {0}
-popup.roundedFiatValues.headline=Nueva característica de privacidad: Valores fiat redondeados
-popup.roundedFiatValues.msg=Para incrementar la privacidad de sus intercambios la cantidad de {0} se redondeó.\n\nDependiendo de la versión del cliente pagará o recibirá valores con decimales o redondeados.\n\nAmbos valores cumplen a partir de ahora con el protocolo de intercambio.\n\nTambién tenga en cuenta que los valores BTC cambian automáticamente para igualar la cantidad fiat redondeada tan ajustada como sea posible.
-
popup.info.multiplePaymentAccounts.headline=Múltiples cuentas de pago disponibles
popup.info.multiplePaymentAccounts.msg=Tiene múltiples cuentes de pago disponibles para esta oferta. Por favor, asegúrese de que ha elegido la correcta.
-popup.dao.launch.headline=La visión completa, realizada
-popup.dao.launch.governance.title=Gobernanza
-popup.dao.launch.governance=La red de intercambio Bisq ya estaba descentralizada.\nCon la DAO Bisq, el liderazgo de Bisq está también descentralizado, haciendo Bisq excepcionalmente resistente a la censura.
-popup.dao.launch.trading.title=Intercambio
-popup.dao.launch.trading=Intercambie BSQ (bitcoin coloreados) para participar en la gobernanza Bisq. Puede comprar y vender BSQ como cualquier otro activo en Bisq.
-popup.dao.launch.cheaperFees.title=Comisiones más baratas
-popup.dao.launch.cheaperFees=Consiga un descuento del 90% en comisiones de intercambio al usar BSQ. ¡Ahorre dinero y apoye el proyecto al mismo tiempo!
+popup.news.launch.headline=Dos grandes actualizaciones
+popup.news.launch.accountSigning.headline=FIRMADO DE CUENTAS
+popup.news.launch.accountSigning.description=Se eleva el límite de intercambio de 0.01 BTC al comprar BTC desde un par firmado.
+popup.news.launch.ntp.headline=NUEVO PROTOCOLO DE INTERCAMBIO
+popup.news.launch.ntp.description=El nuevo sistema de resolución de disputas de 2 niveles hace Bisq más seguro, escalable y resistente a la censura.
+
+popup.accountSigning.selectAccounts.headline=Seleccionar cuentas de pago
+popup.accountSigning.selectAccounts.description=Basado en el método de pago y el momento de tiempo todas las cuentas de pago que estén conectadas a una disputa donde ocurra el pago a el comprador será seleccionada por usted para firmarlas.
+popup.accountSigning.selectAccounts.signAll=Firma todos los métodos de pago
+popup.accountSigning.selectAccounts.datePicker=Seleccione momento de tiempo hasta que las cuentas sean firmadas
+
+popup.accountSigning.confirmSelectedAccounts.headline=Confirmar cuentas de pago seleccionadas
+popup.accountSigning.confirmSelectedAccounts.description=Basado en su valor introducido, {0} cuentas de pago serán seleccionadas.
+popup.accountSigning.confirmSelectedAccounts.button=Confirmar cuentas de pago
+popup.accountSigning.signAccounts.headline=Confirmar firma de cuentas de pago
+popup.accountSigning.signAccounts.description=Según su selección, se firmarán {0} cuentas de pago.
+popup.accountSigning.signAccounts.button=Firmar cuentas de pago
+popup.accountSigning.signAccounts.ECKey=Introduzca clave privada del árbitro
+popup.accountSigning.signAccounts.ECKey.error=ECKey de mal árbitro
+
+popup.accountSigning.success.headline=Felicidades
+popup.accountSigning.success.description=Todas las cuentas de pago {0} se firmaron con éxito!
+popup.accountSigning.generalInformation=Encontrará el estado de firma de todas sus cuentas en la sección de cuentas.\n\nPara más información, por favor visite https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=Una de sus cuentas de pago ha sido verificada y firmada por un árbitro. Intercambiar con esta cuenta firmará automáticamente la cuenta de su par de intercambio después de un intercambio exitoso.\n\n{0}
+popup.accountSigning.signedByPeer=Una de sus cuentas de pago ha sido verificada y firmada por un par de intercambio. Su límite inicial de intercambio ha sido elevado y podrá firmar otras cuentas en {0} días desde ahora.\n\n{1}
+popup.accountSigning.peerLimitLifted=El límite inicial para una de sus cuentas se ha elevado.\n\n{0}
+popup.accountSigning.peerSigner=Una de sus cuentas es suficiente antigua para firmar otras cuentas de pago y el límite inicial para una de sus cuentas se ha elevado.\n\n{0}
####################################################################
# Notifications
@@ -2071,11 +2171,12 @@ list.currency.editList=Editar lista de monedas
table.placeholder.noItems=Actualmente no hay {0} disponible/s
table.placeholder.noData=Actualmente no hay datos disponibles
+table.placeholder.processingData=Procesando datos...
peerInfoIcon.tooltip.tradePeer=Pareja de intercambio
peerInfoIcon.tooltip.maker=Creador
-peerInfoIcon.tooltip.trade.traded=Dirección onion: {0}\nYa ha intercambiado en {1} ocasión/es con este creador.
+peerInfoIcon.tooltip.trade.traded={0} dirección onion: {1}\nYa ha intercambiado en {2} ocasión/es con esa persona.\n{3}
peerInfoIcon.tooltip.trade.notTraded=Dirección onion: {0}\nNo ha intercambiado con esta persona.\n{2}
peerInfoIcon.tooltip.age=Cuenta de pago creada hace {0}
peerInfoIcon.tooltip.unknownAge=Edad de cuenta de pago no conocida.
@@ -2093,7 +2194,8 @@ peerInfo.title=Información del par
peerInfo.nrOfTrades=Número de intercambios completados
peerInfo.notTradedYet=No ha comerciado con este usuario.
peerInfo.setTag=Configurar etiqueta para ese par
-peerInfo.age=Edad de la cuenta de pago
+peerInfo.age.noRisk=Edad de la cuenta de pago
+peerInfo.age.chargeBackRisk=Tiempo desde el firmado
peerInfo.unknownAge=Edad desconocida
addressTextField.openWallet=Abrir su cartera Bitcoin predeterminada
@@ -2130,8 +2232,8 @@ navigation.dao.wallet.receive=\"DAO/Monedero BSQ/Recibir\"
formatter.formatVolumeLabel={0} cantidad{1}
formatter.makerTaker=Creador como {0} {1} / Tomador como {2} {3}
-formatter.youAreAsMaker=Usted es {0} {1} como creador / Tomador es {2} {3}
-formatter.youAreAsTaker=Usted es {0} {1} como tomador / Creador es {2} {3}
+formatter.youAreAsMaker=Usted está {0} {1} como creador / Tomador está {2} {3}
+formatter.youAreAsTaker=Usted está {0} {1} como tomador / Creador está {2} {3}
formatter.youAre=Usted es {0} {1} ({2} {3})
formatter.youAreCreatingAnOffer.fiat=Está creando una oferta a {0} {1}
formatter.youAreCreatingAnOffer.altcoin=Está creando una oferta a {0} {1} ({2} {3})
@@ -2154,7 +2256,7 @@ BTC_REGTEST=Regtest Bitcoin
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=Testnet de Bitcoin DAO (depreciada)
# suppress inspection "UnusedProperty"
-BTC_DAO_BETANET=Bitcoin DAO Betanet (Bitcoin Mainnet)
+BTC_DAO_BETANET=DAO Bisq Betanet (red principal Bitcoin)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=Regtest de Bitcoin DAO
@@ -2177,13 +2279,13 @@ time.seconds=segundos
password.enterPassword=Introducir contraseña
password.confirmPassword=Confirmar contraseña
password.tooLong=La contraseña debe de tener menos de 500 caracteres.
-password.deriveKey=Derivar clave desde password
-password.walletDecrypted=El monedero se desencriptó con éxito y se eliminó la protección por password.
+password.deriveKey=Derivar clave desde contraseña
+password.walletDecrypted=El monedero se desencriptó con éxito y se eliminó la protección por contraseña.
password.wrongPw=Ha introducido la contraseña incorrecta.\n\nPor favor, introduzca nuevamente la contraseña, evitando errores.
-password.walletEncrypted=El monedero se encriptó con éxito y se activó la protección por password.
+password.walletEncrypted=El monedero se encriptó con éxito y se activó la protección por contraseña.
password.walletEncryptionFailed=No se pudo establecer la contraseña de la cartera. Puede que haya importado las palabras semilla que no corresponden a la base de datos de la cartera. Por favor, contacte con los desarrolladores en el foro de Bisq.
-password.passwordsDoNotMatch=Los 2 passwords introducidos no coinciden.
-password.forgotPassword=Password olvidado?
+password.passwordsDoNotMatch=Las 2 contraseñas introducidas no coinciden.
+password.forgotPassword=¿Ha olvidado la contraseña?
password.backupReminder=Por favor, tenga en cuenta que al configurar una contraseña de cartera todas las copias de seguridad creadas desde la cartera no cifrada se borrarán.\n\n¡Es altamente recomendable hacer una copia de seguridad del directorio de aplicación y anotar las palabras semilla antes de configurar la contraseña!
password.backupWasDone=Ya he hecho una copia de seguridad
@@ -2220,7 +2322,7 @@ payment.select.account=Seleccione tipo de cuenta
payment.select.region=Seleccione región
payment.select.country=Seleccione país
payment.select.bank.country=Seleccione país del banco
-payment.foreign.currency=Está seguro de que quiere elegir una moneda diferente que la del país por defecto?
+payment.foreign.currency=¿Está seguro de que quiere elegir una moneda diferente que la del país por defecto?
payment.restore.default=No, restaurar moneda por defecto.
payment.email=Email
payment.country=País
@@ -2245,7 +2347,7 @@ payment.promptPay.promptPayId=Citizen ID/Tax ID o número de teléfono
payment.supportedCurrencies=Monedas soportadas
payment.limitations=Límitaciones:
payment.salt="Salt" de la verificación de edad de la cuenta.
-payment.error.noHexSalt=El "salt" necesitar estar en formato HEX./nSólo se recomienda editar el "salt" si quiere transferir el "salt" desde una cuenta antigua para mantener su edad de cuenta. La edad de cuenta se verifica usando el "salt" de la cuenta y datos de identificación de cuenta (Ej. IBAN).
+payment.error.noHexSalt=El "salt" necesitar estar en formato HEX.\nSolo se recomienda editar el "salt" si quiere transferir el "salt" desde una cuenta antigua para mantener su edad de cuenta. La edad de cuenta se verifica usando el "salt" de la cuenta y datos de identificación de cuenta (Ej. IBAN).
payment.accept.euro=Aceptar tratos desde estos países Euro.
payment.accept.nonEuro=Aceptar tratos desde estos países no-Euro
payment.accepted.countries=Países aceptados
@@ -2253,6 +2355,7 @@ payment.accepted.banks=Bancos aceptados (ID)
payment.mobile=Número de móvil
payment.postal.address=Dirección postal
payment.national.account.id.AR=Número CBU
+shared.accountSigningState=Status de firmado de cuentas
#new
payment.altcoin.address.dyn=Dirección {0}:
@@ -2261,7 +2364,7 @@ payment.accountNr=Número de cuenta
payment.emailOrMobile=Email o número de móvil
payment.useCustomAccountName=Utilizar nombre de cuenta personalizado
payment.maxPeriod=Periodo máximo de intercambio
-payment.maxPeriodAndLimit=Duración máxima de intercambio: {0} / Límite máximo de intercambio: {1} / Edad de cuenta: {2}
+payment.maxPeriodAndLimit=Duración máxima de intercambio: {0} / Compra máx: {1} / Venta máx: {2} / Edad de cuenta: {3}
payment.maxPeriodAndLimitCrypto=Duración máxima de intercambio: {0} / Límite máximo de intercambio: {1}
payment.currencyWithSymbol=Moneda: {0}
payment.nameOfAcceptedBank=Nombre de banco aceptado
@@ -2284,12 +2387,13 @@ payment.moneyGram.info=Al utilizar MoneyGram, el comprador de BTC tiene que envi
payment.westernUnion.info=Al utilizar Western Union, el comprador de BTC tiene que enviar el número de autorización (MTCN) y una foto del recibo al vendedor de BTC por correo electrónico. El recibo debe mostrar claramente el monto, así como el nombre completo, país y demarcación (departamento,estado, etc.) del vendedor. Al comprador se le mostrará el correo electrónico del vendedor en el proceso de transacción.
payment.halCash.info=Al usar HalCash el comprador de BTC necesita enviar al vendedor de BTC el código HalCash a través de un mensaje de texto desde el teléfono móvil.\n\nPor favor asegúrese de que no excede la cantidad máxima que su banco le permite enviar con HalCash. La cantidad mínima por retirada es de 10 EUR y el máximo son 600 EUR. Para retiros frecuentes es 3000 por receptor al día y 6000 por receptor al mes. Por favor compruebe estos límites con su banco y asegúrese que son los mismos aquí expuestos.\n\nLa cantidad de retiro debe ser un múltiplo de 10 EUR ya que no se puede retirar otras cantidades desde el cajero automático. La Interfaz de Usuario en la pantalla crear oferta y tomar oferta ajustará la cantidad de BTC para que la cantidad de EUR sea correcta. No puede usar precios basados en el mercado ya que la cantidad de EUR cambiaría con el cambio de precios.\n\nEn caso de disputa el comprador de BTC necesita proveer la prueba de que ha enviado EUR.
payment.limits.info=Por favor, tenga en cuenta que todas las transferencias bancarias tienen cierto riesgo de reversión de pago.\n\nPara disminuir este riesgo, Bisq establece límites por intercambio basándose en dos factores:\n\n1. El nivel estimado de riesgo de reversión de pago para el método de pago usado\n2. La edad de su cuenta para ese método de pago\n\nLa cuenta que está creando ahora es nueva y su edad es cero. A medida que su cuenta gane edad en un periodo de dos meses, también aumentará el límite por transacción.\n\n● Durante el primer mes, el límite será {0}\n● Durante el segundo mes, el límite será {1}\n● Después del segundo mes, el límite será {2}\n\nTenga en cuenta que no hay límites en el total de transacciones que puede realizar.
+payment.limits.info.withSigning=Para limitar el riesgo de devolución de cargo, Bisq establece límites por compra basados en los 2 siguientes factores:\n\n1. Riesgo general de devolución de cargo para el método de pago\n2. Estado de firmado de cuenta\n\nEsta cuenta de pago que ha creado conlleva cierto riesgo de devolución de cargo y aún no ha sido firmada por un árbitro o par de confianza, con lo que ha sido limitado a comprar {0} por intercambio. Después de firmarse, los límites de compra se incrementarán de esta manera:\n\n● Antes de ser firmada, y hasta 30 días después de la firma, su límite por intercambio de compra será {0}\n● 30 días después de la firma, su límite de compra por intecambio será de {1}\n● 60 días después de la firma, su límite de compra por intercambio será de {2}\n\nLos límites de venta no se ven afectados por el firmado de cuentas, y aumenta solo con el incremente de edad de la cuenta. Más información en https://docs.bisq.network/payment-methods#account-signing.\n\nNo hay límites en el número de transacciones que se pueden hacer.
payment.cashDeposit.info=Por favor confirme que su banco permite enviar depósitos de efectivo a cuentas de otras personas. Por ejemplo, Bank of America y Wells Fargo ya no permiten estos depósitos.
payment.revolut.info=Por favor asegúrese de que el número de teléfono que ha usado para la cuenta Revolut está registrada en Revolut, de lo contrario el comprador BTC no podrá enviarle los fondos.
-payment.usPostalMoneyOrder.info=Los giros postales son uno de los métodos de adquisición de fiat más privados disponibles en Bisq\n\nAún así, por favor tenga en cuenta el elevado riesgo potencial asociado a su uso. Bisq no contrae ninguna responsabilidad en caso de que el dinero enviado sea robado, y los árbitros en estos casos adjudiquen los BTC a el emisor del giro postal, siempre que puedan mostrar recibos e información de seguimiento. Es aconsejable par el emisor escribir el nombre del emisor en el giro postal, para minimizar el riesgo de que el giro postal sea retirado por otra persona.
+payment.usPostalMoneyOrder.info=Los giros postales son uno de los métodos de adquisición de fiat más privados disponibles en Bisq\n\nAún así, por favor tenga en cuenta el elevado riesgo potencial asociado a su uso. Bisq no contrae ninguna responsabilidad en caso de que el dinero enviado sea robado, y el mediador o árbitro en estos casos adjudiquen los BTC al emisor del giro postal, siempre que puedan mostrar recibos e información de seguimiento. Es aconsejable para el emisor escribir el nombre del emisor en el giro postal, para minimizar el riesgo de que el giro postal sea retirado por otra persona.
payment.f2f.contact=Información de contacto
payment.f2f.contact.prompt=¿Cómo quiere ser contactado por el par de intercambio? (dirección email, número de teléfono...)
@@ -2299,11 +2403,15 @@ payment.f2f.optionalExtra=Información adicional opcional
payment.f2f.extra=Información adicional
payment.f2f.extra.prompt=El creador puede definir los 'términos y condiciones' o añadir información de contacto pública. Será mostrada junto con la oferta.
-payment.f2f.info=Los intercambios 'Cara a Cara' (F2F) tienen diferentes reglas y riesgos que las transacciones en línea.\n\nLas principales diferencias son:\n● Los pares de intercambio necesitan intercambiar información acerca del punto de reunión y la hora usando los detalles de contacto proporcionados.\n● Los pares de intercambio tienen que traer sus portátiles y hacer la confirmación de 'pago enviado' y 'pago recibido' en el lugar de reunión.\n● Si un creador tiene 'términos y condiciones' especiales necesita declararlos en el campo de texto 'información adicional' en la cuenta.\n● Tomando una oferta el tomador está de acuerdo con los 'términos y condiciones' declarados por el creador.\n● En caso de disputa el árbitro no puede ayudar mucho ya que normalmente es complicado obtener evidencias no manipulables de lo que ha pasado en una reunión. En estos casos los fondos BTC pueden bloquearse indefinidamente o hasta que los pares lleguen a un acuerdo.\n\nPara asegurarse de que comprende las diferencias con los intercambios 'Cara a Cara' por favor lea las instrucciones y recomendaciones en: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
+payment.f2f.info=intercambiar, operarLos intercambios 'Cara a Cara' (F2F) tienen diferentes reglas y riesgos que las transacciones en línea.\n\nLas principales diferencias son:\n● Los pares de intercambio necesitan intercambiar información acerca del punto de reunión y la hora usando los detalles de contacto proporcionados.\n● Los pares de intercambio tienen que traer sus portátiles y hacer la confirmación de 'pago enviado' y 'pago recibido' en el lugar de reunión.\n● Si un creador tiene 'términos y condiciones' especiales necesita declararlos en el campo de texto 'información adicional' en la cuenta.\n● Tomando una oferta el tomador está de acuerdo con los 'términos y condiciones' declarados por el creador.\n● En caso de disputa el árbitro no puede ayudar mucho ya que normalmente es complicado obtener evidencias no manipulables de lo que ha pasado en una reunión. En estos casos los fondos BTC pueden bloquearse indefinidamente o hasta que los pares lleguen a un acuerdo.\n\nPara asegurarse de que comprende las diferencias con los intercambios 'Cara a Cara' por favor lea las instrucciones y recomendaciones en: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
payment.f2f.info.openURL=Abrir paǵina web
-payment.f2f.offerbook.tooltip.countryAndCity=Provincia y ciudad: {0} / {1}
+payment.f2f.offerbook.tooltip.countryAndCity=País y ciudad: {0} / {1}
payment.f2f.offerbook.tooltip.extra=Información adicional: {0}
+payment.japan.bank=Banco
+payment.japan.branch=Branch
+payment.japan.account=Cuenta
+payment.japan.recipient=Nombre
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -2317,6 +2425,7 @@ CASH_DEPOSIT=Depósito en efectivo
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=Cara a cara (en persona)
+JAPAN_BANK=Japan Bank Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=Bancos nacionales
@@ -2334,6 +2443,8 @@ MONEY_GRAM_SHORT=MoneyGram
WESTERN_UNION_SHORT=Western Union
# suppress inspection "UnusedProperty"
F2F_SHORT=F2F
+# suppress inspection "UnusedProperty"
+JAPAN_BANK_SHORT=Japan Furikomi
# Do not translate brand names
# suppress inspection "UnusedProperty"
@@ -2479,7 +2590,7 @@ validation.bsq.invalidFormat=Formato inválido de la dirección BSQ.
validation.email.invalidAddress=Dirección inválida
validation.iban.invalidCountryCode=Código de país inválido
validation.iban.checkSumNotNumeric=El checksum debe ser numérico
-validation.iban.nonNumericChars=Detectado caracter no alfanumérico
+validation.iban.nonNumericChars=Detectado carácter no alfanumérico
validation.iban.checkSumInvalid=El checksum de IBAN es inválido
validation.iban.invalidLength=El número debe ser de una longitud de 15 a 34 carácteres.
validation.interacETransfer.invalidAreaCode=Código de area no canadiense
@@ -2495,7 +2606,12 @@ validation.pattern=El valor introducido debe ser de formato: {0}
validation.noHexString=El valor introducido no es un formato HEX.
validation.advancedCash.invalidFormat=Tiene que ser una dirección de email o ID de cartera de formato: X000000000000
validation.invalidUrl=No es una URL válida
-validation.mustBeDifferent=Su valor introducido debe ser diferente a el valor actual
+validation.mustBeDifferent=Su entrada debe ser diferente del valor actual
validation.cannotBeChanged=Este parámetro no se puede cambiar
validation.numberFormatException=Excepción en formato de número {0}
validation.mustNotBeNegative=El valor introducido no debe ser negativo
+validation.phone.missingCountryCode=Se necesitan dos letras de código de país para validar el número de teléfono
+validation.phone.invalidCharacters=Número de teléfono {0} tiene caracteres inválidos
+validation.phone.insufficientDigits=No hay suficientes dígitos en {0} para un número de teléfono válido
+validation.phone.tooManyDigits=Demasiados dígitos en {0} para ser un número de teléfono válido
+validation.phone.invalidDialingCode=Código de país en número {0} es inválido para el país {1}. El código correcto es {2}.
diff --git a/core/src/main/resources/i18n/displayStrings_fa.properties b/core/src/main/resources/i18n/displayStrings_fa.properties
index 304d2ee4db..59035b8339 100644
--- a/core/src/main/resources/i18n/displayStrings_fa.properties
+++ b/core/src/main/resources/i18n/displayStrings_fa.properties
@@ -62,6 +62,10 @@ shared.priceWithCur=قیمت در {0}
shared.priceInCurForCur=قیمت در {0} برای 1 {1}
shared.fixedPriceInCurForCur=قیمت مقطوع در {0} برای 1 {1}
shared.amount=مقدار
+shared.txFee=Transaction Fee
+shared.makerFee=Maker Fee
+shared.buyerSecurityDeposit=Buyer Deposit
+shared.sellerSecurityDeposit=Seller Deposit
shared.amountWithCur=مقدار در {0}
shared.volumeWithCur=حجم در {0}
shared.currency=ارز
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=لطفاً تاییدیه را دوباره ار
shared.exportCSV=به csv خروجی بگیرید
shared.exportJSON=به JSON خروجی بگیر
shared.noDateAvailable=تاریخ موجود نیست
-shared.arbitratorsFee=هزینه داور
shared.noDetailsAvailable=جزئیاتی در دسترس نیست
shared.notUsedYet=هنوز مورد استفاده قرار نگرفته
shared.date=تاریخ
@@ -149,11 +152,11 @@ shared.save=ذخیره
shared.onionAddress=آدرس شبکه Onion
shared.supportTicket=بلیط پشتیبانی
shared.dispute=مناقشه
+shared.mediationCase=mediation case
shared.seller=فروشنده
shared.buyer=خریدار
shared.allEuroCountries=تمام کشورهای یورو
shared.acceptedTakerCountries=کشورهای هدف برای پذیرش طرف معامله
-shared.arbitrator=داور انتخاب شده
shared.tradePrice=قیمت معامله
shared.tradeAmount=مقدار معامله
shared.tradeVolume=حجم معامله
@@ -203,6 +206,15 @@ shared.proposal=پیشنهاد
shared.votes=آرا
shared.learnMore=بیشتر بدانید
shared.dismiss=رد کردن
+shared.selectedArbitrator=داور انتخاب شده
+shared.selectedMediator=Selected mediator
+shared.selectedRefundAgent=داور انتخاب شده
+shared.mediator=واسط
+shared.arbitrator=داور
+shared.refundAgent=داور
+shared.refundAgentForSupportStaff=Refund agent
+shared.delayedPayoutTxId=Refund collateral transaction ID
+
####################################################################
# UI views
@@ -244,7 +256,7 @@ mainView.footer.btcInfo.synchronizingWith=در حال همگام شدن با
mainView.footer.btcInfo.synchronizedWith=همگام شده با
mainView.footer.btcInfo.connectingTo=در حال ایجاد ارتباط با
mainView.footer.btcInfo.connectionFailed=ارتباط ناموفق بود
-mainView.footer.p2pInfo=همتایان شبکه P2P: {0}
+mainView.footer.p2pInfo=Bisq network peers: {0}
mainView.footer.daoFullNode=گره کامل DAO
mainView.bootstrapState.connectionToTorNetwork=(1/4) در حال ارتباط با شبکه Tor ...
@@ -254,10 +266,10 @@ mainView.bootstrapState.initialDataReceived=(4/4) داده های اولیه د
mainView.bootstrapWarning.noSeedNodesAvailable=عدم وجود Node های اولیه
mainView.bootstrapWarning.noNodesAvailable=Node ها و همتایان اولیه موجود نیستند
-mainView.bootstrapWarning.bootstrappingToP2PFailed=راه اندازی خودکار برای شبکه P2P ناموفق بود
+mainView.bootstrapWarning.bootstrappingToP2PFailed=Bootstrapping to Bisq network failed
mainView.p2pNetworkWarnMsg.noNodesAvailable= Nodeی برای درخواست داده موجود نیست.\nلطفاً ارتباط اینترنت خود را بررسی کنید یا برنامه را مجدداً راه اندازی کنید.
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=ارتباط با شبکه P2P ناموفق بود (خطای گزارش شده : {0}).\nلطفاً اتصال اینترنت خود را بررسی کنید یا برنامه را مجددا راهاندازی کنید.
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Connecting to the Bisq network failed (reported error: {0}).\nPlease check your internet connection or try to restart the application.
mainView.walletServiceErrorMsg.timeout=ارتباط با شبکهی بیتکوین به دلیل وقفه، ناموفق بود.
mainView.walletServiceErrorMsg.connectionError=ارتباط با شبکهی بیتکوین به دلیل یک خطا: {0}، ناموفق بود.
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=بسته:
market.trades.tooltip.candle.high=بالا:
market.trades.tooltip.candle.low=پایین:
market.trades.tooltip.candle.average=میانگین:
+market.trades.tooltip.candle.median=Median:
market.trades.tooltip.candle.date=تاریخ:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=بانکهای کشورهای پذیرف
offerbook.availableOffers=پیشنهادهای موجود
offerbook.filterByCurrency=فیلتر بر اساس ارز
offerbook.filterByPaymentMethod=فیلتر بر اساس روش پرداخت
+offerbook.timeSinceSigning=Time since signing
+offerbook.timeSinceSigning.info=This account was verified and {0}
+offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
+offerbook.timeSinceSigning.info.peer=signed by a peer, waiting for limits to be lifted
+offerbook.timeSinceSigning.info.peerLimitLifted=signed by a peer and limits were lifted
+offerbook.timeSinceSigning.info.signer=signed by peer and can sign peer accounts (limits lifted)
+offerbook.timeSinceSigning.daysSinceSigning={0} روز
+offerbook.timeSinceSigning.daysSinceSigning.long={0} since signing
+
+offerbook.timeSinceSigning.help=When you successfully complete a trade with a peer who has a signed payment account, your payment account is signed.\n{0} days later, the initial limit of {1} is lifted and your account can sign other peers'' payment accounts.
+offerbook.timeSinceSigning.notSigned=Not signed yet
+offerbook.timeSinceSigning.notSigned.noNeed=بدون پاسخ
+shared.notSigned=This account hasn't been signed yet
+shared.notSigned.noNeed=This account type doesn't use signing
offerbook.nrOffers=تعداد پیشنهادها: {0}
offerbook.volume={0} (حداقل - حداکثر)
@@ -345,14 +372,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=حساب معاملاتی بر
offerbook.warning.noMatchingAccount.headline=حساب معاملاتی، مطابقت ندارد.
offerbook.warning.noMatchingAccount.msg=برای پذیرفتن این پیشنهاد، باید یک حساب پرداخت برای این روش پرداخت بسازید.\n\nآیا مایلید این کار را الان انجام دهید؟
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=این پیشنهاد نمی تواند به دلیل محدودیت های امنیتی بر اساس معیارهای زیر انجام داده شود:\nحساب درآمد سازنده پس از اول مارس 2019- ایجاد شده است.\n حداقل مبلغ معاملاتی بالاتر از 0.01 BTC می باشد\n - روش پرداخت برای این پیشنهاد از نظر اعتبارات بانکی ریسکی است\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=این پیشنهاد نمی تواند به دلیل محدودیت های امنیتی بر اساس معیارهای زیر انجام داده شود:\n- حساب درآمد سازنده پس از اول مارس 2019 ایجاد شده است.\n- حداقل مبلغ معاملاتی بالاتر از 0.01 BTC می باشد.\n- روش پرداخت برای این پیشنهاد از نظر اعتبارات بانکی ریسکی است.\n\n{0}
+offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=We needed to deploy this restriction as a short-term measure for enhanced security.\n\nThe next software release will provide more robust protection tools so that offers with this risk profile can be traded again.
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to 0.01 BTC because of security restrictions based on the following criteria:\n- The buyers account was created after March 1st 2019\n- The payment method for this offer is considered risky for bank chargebacks\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to 0.01 BTC because of security restrictions based on the following criteria:\n- Your payment account was created after March 1st 2019\n- The payment method for this offer is considered risky for bank chargebacks\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
offerbook.warning.wrongTradeProtocol=این پیشنهاد نیاز به نسخه پروتکل متفاوتی مانند پروتکل نسخه نرمافزار خودتان دارد.\n\nلطفا پس از نصب آخرین آپدیت نرمافزار دوباره تلاش کنید. در غیر این صورت، کاربری که این پیشنهاد را ایجاد کرده است، از نسخهای قدیمیتر استفاده میکند.\n\nکاربران نمی توانند با نسخههای پروتکل معاملاتی ناسازگار، معامله کنند.
offerbook.warning.userIgnored=شما آدرس onion کاربر را به لیست بیاعتنایی خودتان افزودهاید.
@@ -478,7 +503,7 @@ takeOffer.failed.offerTaken=شما نمی توانید آن پیشنهاد را
takeOffer.failed.offerRemoved=شما نمیتوانید آن پیشنهاد را بپذیرید، چون پیشنهاد در این فاصله حذف شده است.
takeOffer.failed.offererNotOnline=درخواست پذیرش پیشنهاد ناموفق بود، زیرا سفارش گذار دیگر آنلاین نیست.
takeOffer.failed.offererOffline=شما نمیتوانید آن پیشنهاد را بپذیرید، زیرا سفارش گذار آفلاین است.
-takeOffer.warning.connectionToPeerLost=ارتباط شما با سفارش گذار قطع شد. \nاو ممکن است آفلاین شده باشد یا ارتباط با شما را به دلیل ارتباطات باز بسیار زیاد، قطع کرده است.\n\nاگر هنوز می توانید پیشنهاد او را در دفتر پیشنهاد ببینید، میتوانید دوباره به پذیرش آن پیشنهاد اقدام نمایید.
+takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again.
takeOffer.error.noFundsLost=\n\nهیچ پولی تاکنون از کیف پول شما کم نشده است.\nلطفاً برنامه را مجدداً راه اندازی کرده و ارتباط اینترنت خود را بررسی نمایید تا ببینید آیا میتوانید مشکل را حل کنید یا خیر.
takeOffer.error.feePaid=\n\nPlease try to restart your application and check your network connection to see if you can resolve the issue.
@@ -516,8 +541,8 @@ portfolio.pending.step3_seller.confirmPaymentReceived=تأیید رسید پرد
portfolio.pending.step5.completed=تکمیل شده
portfolio.pending.step1.info=تراکنش سپرده منتشر شده است.\nباید برای حداقل یک تأییدیه بلاک چین قبل از آغاز پرداخت، {0} صبر کنید.
-portfolio.pending.step1.warn=تراکنش سپرده هنوز مورد تأیید قرار نگرفته است.\nدر موارد نادر، این ممکن است در زمانی اتفاق بیفتد که هزینهی تأمین مالی یک معامله گر از کیف پول خارجی خیلی کم باشد.
-portfolio.pending.step1.openForDispute=تراکنش سپرده هنوز مورد تأیید قرار نگرفته است.\nدر موارد نادر، این ممکن است در زمانی اتفاق بیفتد که هزینهی تأمین مالی یک معامله گر از کیف پول خارجی خیلی کم باشد.\nحداکثر دورهی زمانی برای معامله، سپری شده است.\n\nشما میتوانید بیشتر منتظر باشید یا برای گشودن یک مناقشه، با داور تماس بگیرید.
+portfolio.pending.step1.warn=The deposit transaction is still not confirmed. This sometimes happens in rare cases when the funding fee of one trader from an external wallet was too low.
+portfolio.pending.step1.openForDispute=The deposit transaction is still not confirmed. You can wait longer or contact the mediator for assistance.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=معامله شما، حداقل یک تأییدیه بلاکچین دریافت کرده است.\n(اگر بخواهید، می توانید برای تأییدیههای بیشتر صبر کنید - حداقل 6 تأییدیه، عدد بسیار امنی به شمار میآید.)\n\n
@@ -535,8 +560,10 @@ portfolio.pending.step2_buyer.altcoin=لطفاً از کیف پول {0} خارج
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=لطفاً به یک بانک بروید و {0} را به فروشنده ی بیتکوین پرداخت نمایید.\n\n
portfolio.pending.step2_buyer.cash.extra=مورد الزامی مهم:\nبعد از اینکه پرداخت را انجام دادید، روی کاغذ رسید بنویسید: بدون استرداد.\nسپس آن را به 2 قسمت پاره کنید، از آن ها عکس بگیرید و به آدرس ایمیل فروشندهی بیتکوین ارسال نمایید.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=لطفاً {0} را توسط مانیگرام، به فروشنده ی بیتکوین پرداخت نمایید.\n\n
portfolio.pending.step2_buyer.moneyGram.extra=مورد الزامی مهم:\nبعد از اینکه پرداخت را انجام دادید، شماره مجوز و یک عکس از رسید را با ایمیل به فروشندهی بیتکوین ارسال کنید.\nرسید باید به طور واضح نام کامل، کشور، ایالت فروشنده و مقدار را نشان دهد. ایمیل فروشنده: {0}.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=لطفاً {0} را با استفاده از Western Union به فروشندهی بیتکوین پرداخت کنید.\n\n
portfolio.pending.step2_buyer.westernUnion.extra=مورد الزامی مهم:\nبعد از اینکه پرداخت را انجام دادید، MTCN (عدد پیگیری) و یک عکس از رسید را با ایمیل به فروشندهی بیتکوین ارسال کنید.\nرسید باید به طور واضح نام کامل، کشور، ایالت فروشنده و مقدار را نشان دهد. ایمیل فروشنده: {0}.
@@ -544,14 +571,15 @@ portfolio.pending.step2_buyer.westernUnion.extra=مورد الزامی مهم:\n
portfolio.pending.step2_buyer.postal=لطفاً {0} را توسط \"US Postal Money Order\" به فروشندهی بیتکوین پرداخت کنید.\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.bank=لطفاً به صفحهی وبسایت بانکداری آنلاین خود رفته و {0} را فروشندهی بیتکوین پرداخت کنید.\n\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=لطفا با استفاده از راههای ارتباطی ارائه شده توسط فروشنده با وی تماس بگیرید و قرار ملاقاتی را برای پرداخت {0} تنظیم کنید.\n
portfolio.pending.step2_buyer.startPaymentUsing=آغاز پرداخت با استفاده از {0}
portfolio.pending.step2_buyer.amountToTransfer=مبلغ انتقال
portfolio.pending.step2_buyer.sellersAddress=آدرس {0} فروشنده
portfolio.pending.step2_buyer.buyerAccount=حساب پرداخت مورد استفاده
portfolio.pending.step2_buyer.paymentStarted=پرداخت آغاز شد
-portfolio.pending.step2_buyer.warn=شما هنوز پرداخت {0} خود را انجام ندادهاید.\nلطفاً توجه داشته باشید که معامله باید تا {1} تکمیل شود، در غیراینصورت معامله توسط داور مورد بررسی قرار خواهد گرفت.
-portfolio.pending.step2_buyer.openForDispute=شما پرداخت خود را تکمیل نکرده اید.\nحداکثر دورهی زمانی برای معامله، به پایان رسیده است. \n\nلطفاً برای بازگشایی یک مناقشه، با داور تماس بگیرید.
+portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
+portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.Please contact the mediator for assistance.
portfolio.pending.step2_buyer.paperReceipt.headline=آیا کاغذ رسید را برای فروشندهی بیتکوین فرستادید؟
portfolio.pending.step2_buyer.paperReceipt.msg=به یاد داشته باشید:\nباید روی کاغذ رسید بنویسید: غیر قابل استرداد.\nبعد آن را به 2 قسمت پاره کنید، عکس بگیرید و آن را به آدرس ایمیل فروشنده ارسال کنید.
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=شماره و رسید مجوز را ارسال کنید
@@ -569,7 +597,11 @@ portfolio.pending.step2_seller.waitPayment.headline=برای پرداخت منت
portfolio.pending.step2_seller.f2fInfo.headline=اطلاعات تماس خریدار
portfolio.pending.step2_seller.waitPayment.msg=تراکنش سپرده، حداقل یک تأییدیه بلاکچین دارد.شما\nباید تا آغاز پرداخت {0} از جانب خریدار بیتکوین، صبر نمایید.
portfolio.pending.step2_seller.warn=خریدار بیتکوین هنوز پرداخت {0} را انجام نداده است.\nشما باید تا آغاز پرداخت از جانب او، صبر نمایید.\nاگر معامله تا {1} تکمیل نشد، داور بررسی خواهد کرد.
-portfolio.pending.step2_seller.openForDispute=خریدار بیتکوین پرداخت خود را آغاز نکرده است.\nحداکثر دورهی زمانی مجاز برای معامله به پایان رسیده است.\nشما می توانید بیشتر صبر کرده و به همتای معامله زمان بیشتری بدهید یا برای بازگشایی یک مناقشه، با داور تماس بگیرید.
+portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance.
+
+tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}''
+tradeChat.openChat=Open chat window
+tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=تعریف نشده
@@ -578,7 +610,7 @@ message.state.SENT=پیام ارسال شد
# suppress inspection "UnusedProperty"
message.state.ARRIVED=پیام به همتا رسید
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=پیام در صندوق پستی ذخیره شد
+message.state.STORED_IN_MAILBOX=Message of payment sent but not yet received by peer
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=همتا رسید پیام را تأیید کرد
# suppress inspection "UnusedProperty"
@@ -589,22 +621,23 @@ portfolio.pending.step3_buyer.wait.info=برای تأییدیه رسید پرد
portfolio.pending.step3_buyer.wait.msgStateInfo.label=وضعیت پیام آغاز شدن پرداخت
portfolio.pending.step3_buyer.warn.part1a=بر بلاکچین {0}
portfolio.pending.step3_buyer.warn.part1b=در ارائه دهندهی پرداخت شما (برای مثال بانک)
-portfolio.pending.step3_buyer.warn.part2=فروشندهی بیتکوین هنوز پرداخت شما را تأیید نکرده است.\nلطفاً {0} را بررسی کنید اگر ارسال پرداخت موفقیت آمیز بوده است.\nاگر فروشندهی بیتکوین رسید پرداخت شما را تا {1} تأیید نکند، معامله توسط داور مورد بررسی قرار خواهد گرفت.
-portfolio.pending.step3_buyer.openForDispute=فروشندهی بیتکوین هنوز پرداخت شما را تأیید نکرده است.\nحداکثر دورهی زمانی مجاز برای معامله به پایان رسیده است.\nشما میتوانید بیشتر صبر کرده و به همتای معامله زمان بیشتری بدهید یا برای بازگشایی یک مناقشه، با داور تماس بگیرید.
+portfolio.pending.step3_buyer.warn.part2=The BTC seller still has not confirmed your payment. Please check {0} if the payment sending was successful.
+portfolio.pending.step3_buyer.openForDispute=The BTC seller has not confirmed your payment! The max. period for the trade has elapsed. You can wait longer and give the trading peer more time or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=شریک معاملاتی شما تأیید کرده که پرداخت {0} را آغاز نموده است.\n\n
portfolio.pending.step3_seller.altcoin.explorer=در کاوشگر بلاکچین محبوبتان {0}
portfolio.pending.step3_seller.altcoin.wallet=در کیفپول {0} شما
portfolio.pending.step3_seller.altcoin={0} لطفا بررسی کنید {1} که آیا تراکنش مربوط به آدرس شما\n{2}\n تعداد تاییدیههای کافی بر روی بلاکچین دریافت کرده است یا خیر.\nمبلغ پرداخت باید {3} باشد\nشما میتوانید آدرس {4} خود را پس از بستن پنجره از صفحه اصلی کپی کنید.
portfolio.pending.step3_seller.postal={0}لطفاً بررسی کنید که آیا {1} را با \"US Postal Money Order\" از خریدار بیتکوین دریافت کردهاید یا خیر.\n\nشناسه معامله (متن \"دلیل پرداخت\") تراکنش: \"{2}\"
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=شریک معاملاتی شما تأیید کرده که پرداخت {0} را آغاز نموده است.\n\nلطفاً به صفحه وبسایت بانکداری آنلاین خود رفته و بررسی کنید که آیا {1} را از خریدار BTC دریافته کردهاید یا خیر.\n\nشناسه معامله (متن \"دلیل پرداخت\") تراکنش: \"{2}\"\n\n
portfolio.pending.step3_seller.cash=چون پرداخت از طریق سپردهی نقدی انجام شده است، خریدار BTC باید عبارت \"غیر قابل استرداد\" را روی رسید کاغذی بنویسد، آن را به 2 قسمت پاره کند و از طریق ایمیل به شما یک عکس ارسال کند.\n\nبه منظور اجتناب از استرداد وجه، تنها در صورتی تایید کنید که ایمیل را دریافت کرده باشید و از صحت رسید کاغذی مطمئن باشید.\nاگر مطمئن نیستید، {0}
portfolio.pending.step3_seller.moneyGram=خریدار باید شماره مجوز و عکسی از رسید را به ایمیل شما ارسال کند.\nرسید باید به طور واضح نام کامل شما ، کشور، ایالت فروشنده و مقدار را نشان دهد. لطفاً ایمیل خود را بررسی کنید که آیا شماره مجوز را دریافت کردهاید یا خیر.\n\nپس از بستن پنجره، نام و آدرس خریدار بیتکوین را برای برداشت پول از مانیگرام خواهید دید.\n\nتنها پس از برداشت موفقیت آمیز پول، رسید را تأیید کنید!
portfolio.pending.step3_seller.westernUnion=خریدار باید MTCN (شماره پیگیری) و عکسی از رسید را به ایمیل شما ارسال کند.\nرسید باید به طور واضح نام کامل شما، کشور، ایالت فروشنده و مقدار را نشان دهد. لطفاً ایمیل خود را بررسی کنید که آیا MTCN را دریافت کرده اید یا خیر.\nپس از بستن پنجره، نام و آدرس خریدار بیتکوین را برای برداشت پول از Western Union خواهید دید.\nتنها پس از برداشت موفقیت آمیز پول، رسید را تأیید کنید!
portfolio.pending.step3_seller.halCash=خریدار باید کد HalCash را برای شما با پیامک بفرستد. علاوه برآن شما از HalCash پیامی را محتوی اطلاعات موردنیاز برای برداشت EUR از خودپردازهای پشتیبان HalCash دریافت خواهید کرد.\n\nپس از اینکه پول را از دستگاه خودپرداز دریافت کردید، لطفا در اینجا رسید پرداخت را تایید کنید.
-portfolio.pending.step3_seller.bankCheck=\n\nلطفاً همچنین تأیید کنید که نام فرستنده در اظهارنامه بانک شما، با نام فرستنده در قرارداد معامله مطابقت دارد:\nنام فرستنده: {0}\nاگر نام مذکور همان نامی نیست که در اینجا نشان داده شده است، {1}
-portfolio.pending.step3_seller.openDispute=لطفاً تأیید نکنید بلکه یک مناقشه را با وارد کردن \"alt + o\" یا \"option + o\" باز کنید.
+portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1}
+portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=تأیید رسید پرداخت
portfolio.pending.step3_seller.amountToReceive=مبلغ قابل دریافت
portfolio.pending.step3_seller.yourAddress=آدرس {0} شما
@@ -617,17 +650,18 @@ portfolio.pending.step3_seller.buyerStartedPayment.altcoin=تأییدیهها
portfolio.pending.step3_seller.buyerStartedPayment.fiat=حساب معاملاتی خود را بررسی کنید (برای مثال بانک) و وقتی وجه را دریافت کردید، تأیید نمایید.
portfolio.pending.step3_seller.warn.part1a=در بلاکچین {0}
portfolio.pending.step3_seller.warn.part1b=در ارائه دهندهی پرداخت شما (برای مثال بانک)
-portfolio.pending.step3_seller.warn.part2=شما هنوز رسید پرداخت را تأیید نکردهاید.\nلطفاً {0} را بررسی کنید که آیا وجه را دریافت کردهاید یا خیر.\nاگر رسید را تا {1} تأیید نکنید، معامله توسط داور مورد بررسی قرار خواهد گرفت.
-portfolio.pending.step3_seller.openForDispute=شما هنوز رسید پرداخت را تأیید نکردهاید.\nحداکثر دوره زمانی برای معامله به پایان رسیده است.\nلطفاً تأیید کنید یا برای بازگشایی یک مناقشه با داور تماس بگیرید.
+portfolio.pending.step3_seller.warn.part2=You still have not confirmed the receipt of the payment. Please check {0} if you have received the payment.
+portfolio.pending.step3_seller.openForDispute=You have not confirmed the receipt of the payment!\nThe max. period for the trade has elapsed.\nPlease confirm or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=آیا وجه {0} را از شریک معاملاتی خود دریافت کردهاید؟\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=شناسه معامله (متن \"دلیل پرداخت\") تراکنش: \"{0}\"\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=لطفاً همچنین تأیید کنید که نام فرستنده در اظهارنامه بانک شما، با نام فرستنده در قرارداد معامله مطابقت دارد:\nنام فرستنده: {0}\nاگر نام مذکور همان نامی نیست که در اینجا نشان داده شده است، لطفاً تأیید نکنید بلکه یک مناقشه را با وارد کردن \"alt + o\" یا \"option + o\" باز کنید.\n\n
-portfolio.pending.step3_seller.onPaymentReceived.note=لطفاً توجه داشته باشید، هرچه زودتر رسید را تأیید کنید، مبلغ معاملهی قفل شده برای خریدار بیتکوین آزاد میشود و سپردهی اطمینان مسترد خواهد شد.
+portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Please note, that as soon you have confirmed the receipt, the locked trade amount will be released to the BTC buyer and the security deposit will be refunded.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=تأیید کنید که وجه را دریافت کردهاید
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=بله وجه را دریافت کردهام
+portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANT: By confirming receipt of payment, you are also verifying the account of the counterparty and signing it accordingly. Since the account of the counterparty hasn't been signed yet, you should delay confirmation of the payment as long as possible to reduce the risk of a chargeback.
portfolio.pending.step5_buyer.groupTitle=خلاصهای از معاملهی کامل شده
portfolio.pending.step5_buyer.tradeFee=کارمزد معامله
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=کل کارمزد استخراج
portfolio.pending.step5_buyer.refunded=سپرده اطمینان مسترد شده
portfolio.pending.step5_buyer.withdrawBTC=برداشت بیتکوین شما
portfolio.pending.step5_buyer.amount=مبلغ قابل برداشت
+portfolio.pending.step5_buyer.signer=By withdrawing your bitcoins, you verify that the counterparty has acted according to the trade protocol.
portfolio.pending.step5_buyer.withdrawToAddress=برداشت به آدرس
portfolio.pending.step5_buyer.moveToBisqWallet=انتقال وجوه به کیف پول Bisq
portfolio.pending.step5_buyer.withdrawExternal=برداشت به کیف پول خارجی
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=پس از تأییدیه بلاکچین اول
portfolio.pending.tradePeriodWarning=اگر مهلت به پایان برسد، هر دو معامله گر می توانند یک مناقشه را باز کنند.
portfolio.pending.tradeNotCompleted=معامله به موقع (تا {0}) تکمیل نشد
portfolio.pending.tradeProcess=فرآیند معامله
-portfolio.pending.openAgainDispute.msg=اگر مطمئن نیستید که پیام به داور رسیده است (برای مثال اگر پس از 1 روز پاسخی دریافت نکردهاید)، مجدداً یک مناقشه باز کنید.
+portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community.
portfolio.pending.openAgainDispute.button=باز کردن مجدد مناقشه
portfolio.pending.openSupportTicket.headline=باز کردن تیکت پشتیبانی
-portfolio.pending.openSupportTicket.msg= لطفاً تنها در موارد اضطراری که دکمهی \"باز کردن پشتیبانی\" یا \"باز کردن مناقشه\" برای شما به نمایش درنیامده است، از آن استفاده کنید.\n\nوقتی شما یک تیکت پشتیبانی را باز میکنید، معامله متوقف شده و توسط داور رسیدگی خواهد شد.
+portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator.
+
+portfolio.pending.timeLockNotOver=You have to wait until ≈{0} ({1} more blocks) before you can open an arbitration dispute.
+
portfolio.pending.notification=اطلاع رسانی
-portfolio.pending.openDispute=باز کردن مناقشه
-portfolio.pending.arbitrationRequested=مناقشه باز شده است
+
+portfolio.pending.support.headline.getHelp=Need help?
+portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator.
+portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator.
+portfolio.pending.support.button.getHelp=Get support
+portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket?
+portfolio.pending.support.popup.button=باز کردن تیکت پشتیبانی
+portfolio.pending.support.headline.halfPeriodOver=Check payment
+portfolio.pending.support.headline.periodOver=Trade period is over
+
+portfolio.pending.mediationRequested=Mediation requested
+portfolio.pending.refundRequested=Refund requested
portfolio.pending.openSupport=باز کردن تیکت پشتیبانی
portfolio.pending.supportTicketOpened=تیکت پشتیبانی باز شد
portfolio.pending.requestSupport=درخواست پشتیبانی
-portfolio.pending.error.requestSupport=لطفاً مشکل را به داور خود گزارش کنید.\n\nداور اطلاعات را به منظور بررسی مشکل به توسعه دهندگان ارجاع میدهد.\nپس از این که مشکل مورد تجزیه و تحلیل قرار گرفت، تمام وجوه قفل شده به شما باز خواهد گشت.
+portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds.
portfolio.pending.communicateWithArbitrator=لطفا در صفحهی \"پشتیبانی\" با داور در ارتباط باشید.
+portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator.
portfolio.pending.supportTicketOpenedMyUser=شما در حال حاضر یک تیکت پشتیبانی باز کردهاید.\n{0}
portfolio.pending.disputeOpenedMyUser=شما در حال حاضر یک مناقشه باز کردهاید.\n{0}
portfolio.pending.disputeOpenedByPeer=طرف معامله شما یک مناقشه باز کرده است\n{0}
portfolio.pending.supportTicketOpenedByPeer=طرف معامله شما یک تیکت پشتیبانی باز کرده است.\n{0}
portfolio.pending.noReceiverAddressDefined=آدرسی برای گیرنده تعیین نشده است
-portfolio.pending.removeFailedTrade=اگر داور نتواند آن معامله را ببندد شما میتوانید خودتان آن را به صفحهی معاملات ناموفق منتقل نمایید.\nآیا میخواهید آن معامله ناموفق را از صفحهی معاملات در انتظار حذف کنید؟
+portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade?
+
+portfolio.pending.mediationResult.headline=Suggested payout from mediation
+portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout.
+portfolio.pending.mediationResult.info.selfAccepted=You have accepted the mediator's suggestion. Waiting for peer to accept as well.
+portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted the mediator's suggestion. Do you accept as well?
+portfolio.pending.mediationResult.button=View proposed resolution
+portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0}
+portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0}
+portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=تکمیل شده
-portfolio.closed.ticketClosed=تیکت بسته شده است
+portfolio.closed.ticketClosed=Arbitrated
+portfolio.closed.mediationTicketClosed=Mediated
portfolio.closed.canceled=لغو شده است
portfolio.failed.Failed=ناموفق
@@ -745,6 +807,9 @@ funds.tx.multiSigDeposit=سپرده چند امضایی: {0}
funds.tx.multiSigPayout=پرداخت چند امضایی: {0}
funds.tx.disputePayout=پرداخت مناقشه: {0}
funds.tx.disputeLost=مورد مناقشهی شکست خورده: {0}
+funds.tx.collateralForRefund=Refund collateral: {0}
+funds.tx.timeLockedPayoutTx=Time locked payout tx: {0}
+funds.tx.refund=Refund from arbitration: {0}
funds.tx.unknown=دلیل ناشناخته: {0}
funds.tx.noFundsFromDispute=عدم بازپرداخت از مناقشه
funds.tx.receivedFunds=وجوه دریافت شده
@@ -765,14 +830,15 @@ funds.tx.dustAttackTx.popup=This transaction is sending a very small BTC amount
# Support
####################################################################
-support.tab.mediation.support=تیکتهای پشتیبانی
-support.tab.ArbitratorsSupportTickets=تیکتهای پشتیبانی داور
-support.tab.TradersSupportTickets=تیکتهای پشتیبانی معامله گر
+support.tab.mediation.support=Mediation
+support.tab.arbitration.support=Arbitration
+support.tab.legacyArbitration.support=Legacy Arbitration
+support.tab.ArbitratorsSupportTickets={0}'s tickets
support.filter=لیست فیلتر
support.filter.prompt=Enter trade ID, date, onion address or account data
support.noTickets=هیچ تیکتی به صورت باز وجود ندارد
support.sendingMessage=در حال ارسال پیام ...
-support.receiverNotOnline=گیرنده آنلاین نیست. پیام در صندوق پستی او ذخیره شد.
+support.receiverNotOnline=Receiver is not online. Message is saved to their mailbox.
support.sendMessageError=ارسال پیام ناموفق بود. خطا: {0}
support.wrongVersion=پیشنهاد در آن مناقشه با یک نسخهی قدیمی از Bisq ایجاد شده است.\nشما نمی توانید آن مناقشه را با نسخهی برنامهی خودتان ببندید.\n\nلطفاً از یک نسخهی قدیمیتر با پروتکل نسخهی {0} استفاده کنید
support.openFile=انتخاب فایل به منظور پیوست (حداکثر اندازه فایل: {0} کیلوبایت)
@@ -782,7 +848,7 @@ support.attachment=ضمیمه
support.tooManyAttachments=شما نمیتوانید بیشتر از 3 ضمیمه در یک پیام ارسال کنید.
support.save=ذخیره فایل در دیسک
support.messages=پیامها
-support.input.prompt=لطفاً پیام خود به داور را در اینجا وارد کنید
+support.input.prompt=Enter message...
support.send=ارسال
support.addAttachments=افزودن ضمیمه
support.closeTicket=بستن تیکت
@@ -801,14 +867,18 @@ support.buyerOfferer=خریدار/سفارش گذار بیتکوین
support.sellerOfferer=فروشنده/سفارش گذار بیتکوین
support.buyerTaker=خریدار/پذیرندهی بیتکوین
support.sellerTaker=فروشنده/پذیرندهی بیتکوین
-support.backgroundInfo=Bisq یک شرکت نیست، درنتیجه روش مواجه آن با احتلافات متفاوت است.\n\nاگر اختلافی در روند معامله به وجود بیاید (مثلا یکی از معامله گران از پروتکل معامله پیروی نکند) نرمافزار، بعد از اتمام زمان معامله، دکمه \"ایجاد اختلاف\" را برای تماس با داور معامله نمایش میدهد.\n\nاگر مشکلی برای خود نرمافزار به وجود بیاید، خودش سعی میکند آن را شناسایی کند و اگر امکانش باشد دکمه \"ایجاد تیکت پشتیبانی\" را برای تماس با داور معامله نمایش میدهد تا او مشکل را به توسعهدهندگان منتقل کند.\n\nاگر مشکلی برای نرمافزار به وجود آمد و شما دکمه \"ایجاد تیکت پشتیبانی\" را ندیدید، برای ایجاد یک تیکت پشتیبانی به صورت دستی، معاملهای که ایجاد مشکل کرده است را از طریق \"سبد سهام/معاملات باز\" و فشردن کلیدهای \"alt + o\" یا \"option + o\" انتخاب کنید. لطفا تنها در صورتی از این روش استفاده کنید که مطمئن هستید نرمافزار آنگونه که باید عمل نکرده است. اگر مشکل یا سوالی دارید، لطفا بخش سوالات متداول را در سایت bisq.network بررسی کنید و یا آن را در تالار گفتگوی Bisq در بخش پشتیبانی مطرح کنید.
-support.initialInfo=لطفا یک توضیح برای مشکل پیش آمده در فضای متنی پایین بنویسید. تا حد امکان اطلاعات بیشتری وارد کنید تا زمان حل اختلاف شما تسریع شود.\n\nدر اینجا یک لیستی از اطلاعاتی که باید ارائه کنید آورده شده است:\n● اگر شما خریدار BTC هستید: آیا انتقال پول فیات یا آلت کوین را انجام دادهاید؟ اگر اینطور است، آیا روی دکمه «شروع پرداخت» در نرم افزار کلیک کردهاید؟\n● اگر شما فروشنده BTC هستید: آیا پول فیات یا آلت کوین را دریافت کردهاید؟ اگر اینطور است، آیا روی دکمه «پرداختی دریافت شد» در نرم افزار کلیک کردهاید؟\n● از کدام نسخه Bisq استفاده میکنید؟\n● از چه سیستم عاملی استفاده میکنید؟\n● اگر به مشکل خطا در تراکنش رخوردید لطفا یک پوشه جدید برای دادهها انتخاب کنید.\nبعضی اوقات پوشه دادهها خراب میشود و منجر به خطاهای عجیبی میشود.\nاینجا را ببینید: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nلطفا قوانین پایهای روند حل اختلاف را در نظر بگیرید:\n● شما باید حداکثر تا 2 روز به درخواستهای داور پاسخ بدهید.\n● حداکثر دوره زمانی یک اختلاف 14 روز است.\n● شما باید همکاری لازم را با داور در جهت ساخته شدن پرونده اختلاف به عمل بیارید و اطلاعاتی که درخواست میکند را ارائه کنید.\n● شما قوانین مشخص شده در سند اختلاف موجود در تواقنامه کاربری را زمانی که اولین بار برنامه را اجرا کردید، تایید کردهاید.\n\nاطلاعات بیشتر درباره روند حل اختلاف را در اینجا بخوانید: https://bisq.network/docs/exchange/arbitration-system
+support.backgroundInfo=Bisq is not a company, so it handles disputes differently.\n\nTraders can communicate within the application via a secure chat on the open trades screen to attempt solving a dispute on their own. If that is not sufficient, a mediator can step in to help. The mediator will evaluate the situation and give a recommendation for the payout of the trade funds. If both traders accept this suggestion, the payout transaction is completed and the trade is closed. If one or both traders do not agree to the mediator's recommended payout, they can request arbitration.The arbitrator has the third key of the deposit transaction and will make the payout based on their findings.
+support.initialInfo=Please enter a description of your problem in the text field below. Add as much information as possible to speed up dispute resolution time.\n\nHere is a check list for information you should provide:\n\t● If you are the BTC buyer: Did you make the Fiat or Altcoin transfer? If so, did you click the 'payment started' button in the application?\n\t● If you are the BTC seller: Did you receive the Fiat or Altcoin payment? If so, did you click the 'payment received' button in the application?\n\t● Which version of Bisq are you using?\n\t● Which operating system are you using?\n\t● If you encountered an issue with failed transactions please consider switching to a new data directory.\n\t Sometimes the data directory gets corrupted and leads to strange bugs. \n\t See: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPlease make yourself familiar with the basic rules for the dispute process:\n\t● You need to respond to the {0}''s requests within 2 days.\n\t● Mediators respond in between 2 days. Arbitrators respond in between 5 business days.\n\t● The maximum period for a dispute is 14 days.\n\t● You need to cooperate with the {1} and provide the information they request to make your case.\n\t● You accepted the rules outlined in the dispute document in the user agreement when you first started the application.\n\nYou can read more about the dispute process at: {2}
support.systemMsg=پیغام سیستم: {0}
support.youOpenedTicket=شما یک درخواست برای پشتیبانی باز کردید.\n\n{0}\n\nنسخه Bisq شما: {1}
support.youOpenedDispute=شما یک درخواست برای یک اختلاف باز کردید.\n\n{0}\n\nنسخه Bisq شما: {1}
-support.peerOpenedTicket=همتای معاملهی شما به دلیل مشکلات فنی درخواست پشتیبانی کرده است.\n\n{0}
-support.peerOpenedDispute=همتای معاملهی شما درخواست مناقشه کرده است.\n\n{0}
+support.youOpenedDisputeForMediation=You requested mediation.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedTicket=Your trading peer has requested support due to technical problems.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDispute=Your trading peer has requested a dispute.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDisputeForMediation=Your trading peer has requested mediation.\n\n{0}\n\nBisq version: {1}
+support.mediatorsDisputeSummary=System message:\nMediator''s dispute summary:\n{0}
+support.mediatorsAddress=Mediator''s node address: {0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=افزودن آلتکوین
setting.preferences.displayOptions=نمایش گزینهها
setting.preferences.showOwnOffers=نمایش پیشنهادهای من در دفتر پیشنهاد
setting.preferences.useAnimations=استفاده از انیمیشنها
+setting.preferences.useDarkMode=Use dark mode (beta)
setting.preferences.sortWithNumOffers=مرتب سازی لیستها با تعداد معاملات/پیشنهادها
setting.preferences.resetAllFlags=تنظیم مجدد تمام پرچمهای \"دوباره نشان نده\"
setting.preferences.reset=تنظیم مجدد
@@ -852,7 +923,7 @@ settings.preferences.selectCurrencyNetwork=انتخاب شبکه
setting.preferences.daoOptions=گزینههای DAO
setting.preferences.dao.resync.label=بازسازی وضعیت DAO از تراکنش پیدایش
setting.preferences.dao.resync.button=همگامسازی دوباره
-setting.preferences.dao.resync.popup=بعد از راهاندازی مجدد نرمافزار، دادههای حکمرانی شبکه P2P دوباره از گرههای seed بارگزاری خواهد شد و وضعیت اجماع BSQ از تراکنش پیدایش بازسازی میشود.
+setting.preferences.dao.resync.popup=After an application restart the Bisq 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=Bisq را به عنوان یک گره کامل DAO اجرا کن
setting.preferences.dao.rpcUser=نام کاربری RPC
setting.preferences.dao.rpcPw=رمزعبور RPC
@@ -862,7 +933,7 @@ setting.preferences.dao.fullNodeInfo.ok=باز کردن صفحه مستندات
setting.preferences.dao.fullNodeInfo.cancel=خیر، من با حالت «گره سبک» ادامه میدهم
settings.net.btcHeader=شبکه بیتکوین
-settings.net.p2pHeader=شبکه همتا به همتا P2P
+settings.net.p2pHeader=Bisq network
settings.net.onionAddressLabel=آدرس onion من
settings.net.btcNodesLabel=استفاده از گرههای Bitcoin Core اختصاصی
settings.net.bitcoinPeersLabel=همتایان متصل
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=دریافت شده
settings.net.peerTypeColumn=نوع همتا
settings.net.openTorSettingsButton=تنظیمات Tor را باز کنید.
+settings.net.versionColumn=Version
+settings.net.subVersionColumn=Subversion
+settings.net.heightColumn=Height
+
settings.net.needRestart=به منظور اعمال آن تغییر باید برنامه را مجدداً راه اندازی کنید.\nآیا میخواهید این کار را هم اکنون انجام دهید؟
settings.net.notKnownYet=هنوز شناخته شده نیست ...
settings.net.sentReceived=ارسال شده: {0}، دریافت شده: {1}
@@ -928,9 +1003,11 @@ setting.about.subsystems.val=نسخه ی شبکه: {0}; نسخه ی پیام ه
####################################################################
account.tab.arbitratorRegistration=ثبت نام داور
+account.tab.mediatorRegistration=Mediator registration
+account.tab.refundAgentRegistration=Refund agent registration
account.tab.account=حساب
account.info.headline=به حساب Bisq خود خوش آمدید
-account.info.msg=در اینجا شما می توانید حسابهای معاملاتی برای ارزهای ملی و رمزارزها تنظیم کنید، داوران را انتخاب نموده و از کیف پول و اطلاعات حساب خود پشتیبان بگیرید.\n\nاولین بار که Bisq را اجرا کردید، یک کیف پول خالی بیتکوین ایجاد شد.\n\nما توصیه میکنیم که کلمات seed کیف پول بیت کوین خود را در جایی یادداشت کنید (دکمه سمت چپ را ببینید) و درنظر بگیرید که قبل ازانتقال وجه یک رمزعبور تنظیم نمایید. سپردهها و برداشتهای بیتکوین در بخش \"وجوه\" مدیریت میشوند.\n\nحریم خصوصی و امنیت: Bisq یک صرافی غیرمتمرکز است - به این معنی که تمام دادههای شما بر روی کامپیوتر شما نگهداری میشود، هیچ سروری وجود ندارد و ما به اطلاعات شخصی شما، وجوه شما یا حتی آدرس IP شما دسترسی نداریم. دادههایی مانند شماره حسابهای بانکی، آدرسهای رمزارزها و بیتکوین و ... فقط با شریک تجاری شما برای انجام معاملاتتان به اشتراک گذاشته میشود (در صورت بروزاختلاف، داور اطلاعاتی مانند همتای معامله شما، مشاهده خواهد کرد).
+account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer).
account.menu.paymentAccount=حساب های ارز ملی
account.menu.altCoinsAccountView=حساب های آلت کوین
@@ -939,42 +1016,39 @@ account.menu.seedWords=رمز پشتیبان کیف پول
account.menu.backup=پشتیبان
account.menu.notifications=اعلانها
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=کلید عمومی
-account.arbitratorRegistration.register=ثبت نام داور
-account.arbitratorRegistration.revoke=لغو ثبت نام
-account.arbitratorRegistration.info.msg=لطفاً توجه داشته باشید که شما باید تا 15 روز پس از لغو کردن دردسترس باشید زیرا ممکن است معاملاتی وجود داشته باشند که شما داورشان باشید. حداکثر دوره زمانی مجاز برای معامله 8 روز است و فرآیند اختلاف ممکن است تا 7 روز طول بکشد.
+account.arbitratorRegistration.register=Register
+account.arbitratorRegistration.registration={0} registration
+account.arbitratorRegistration.revoke=ابطال
+account.arbitratorRegistration.info.msg=Please note that you need to stay available for 15 days after revoking as there might be trades which are using you as {0}. The max. allowed trade period is 8 days and the dispute process might take up to 7 days.
account.arbitratorRegistration.warn.min1Language=شما باید حداقل 1 زبان را انتخاب کنید.\nما زبان پیشفرض را برای شما اضافه کردیم.
-account.arbitratorRegistration.removedSuccess=شما با موفقیت داورتان را از شبکه ی P2P حذف کردید.
-account.arbitratorRegistration.removedFailed=حذف داور امکانپذیر نیست.{0}
-account.arbitratorRegistration.registerSuccess=شما با موفقیت داورتان را در شبکه ی P2P ثبت نام کردید.
-account.arbitratorRegistration.registerFailed=ثبت نام داور امکانپذیر نیست.{0}
-
-account.arbitratorSelection.minOneArbitratorRequired=شما باید حداقل 1 زبان را انتخاب کنید.\nما زبان پیشفرض را برای شما اضافه کردیم.
-account.arbitratorSelection.whichLanguages=شما به چه زبان هایی صحبت می کنید؟
-account.arbitratorSelection.whichDoYouAccept=کدام داورها را قبول می کنید؟
-account.arbitratorSelection.autoSelect=انتخاب خودکار تمام داوران با زبان مطابق
-account.arbitratorSelection.regDate=تاریخ ثبت نام
-account.arbitratorSelection.languages=زبان ها
-account.arbitratorSelection.cannotSelectHimself=یک داور نمی تواند خود را برای معامله انتخاب کند.
-account.arbitratorSelection.noMatchingLang=زبان مطابقی وجود ندارد.
-account.arbitratorSelection.noLang=شما می توانید داورانی را انتخاب کنید که حداقل به 1 زبان متداول صحبت می کنند.
-account.arbitratorSelection.minOne=شما باید حداقل یک داور را انتخاب کنید.
+account.arbitratorRegistration.removedSuccess=You have successfully removed your registration from the Bisq network.
+account.arbitratorRegistration.removedFailed=Could not remove registration.{0}
+account.arbitratorRegistration.registerSuccess=You have successfully registered to the Bisq network.
+account.arbitratorRegistration.registerFailed=Could not complete registration.{0}
account.altcoin.yourAltcoinAccounts=حسابهای آلتکوین شما
-account.altcoin.popup.wallet.msg=لطفا مطمئن شوید که الزامات استفاده از کیف پول {0} را همان طور که در صفحه {1} شرح داده شده است، رعایت میکنید.\nاستفاده از کیفپول صرافیهای متمرکز که در آن (الف) کلید های خود را تحت کنترل ندارید و یا (ب) از یک نرم افزار کیف پول ناسازگار میکند می تواند منجر به از دست رفتن وجوه معامله شده شود!\nداور یک متخصص {2} نیست و در چنین مواردی نمی تواند کمک کند.
+account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases.
account.altcoin.popup.wallet.confirm=من می فهمم و تأیید می کنم که می دانم از کدام کیف پول باید استفاده کنم.
-account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information.
-account.altcoin.popup.xmr.msg=اگر میخواهید XMR را در Bisq معامله کنید، لطفا مطمئن شوید که شرایط زیر را درک کرده و انجام می دهید:\n\nبرای ارسال XMR، شما باید یا از کیف پول Monero GUI یا کیف پول Monero CLI که store-tx-info در آن فعال است (به طور پیش فرض در نسخههای جدید فعال است) استفاده کنید. لطفا مطمئن شوید که به کلید تراکنش دسترسی دارید چرا که در صورت بروز اختلاف به آن نیاز دارید.\nدر monero-wallet-cli از دستور(get_tx_key) استفاده کنید\n در monero-wallet-gui برای دیدن اثبات پرداخت به برگه (تاریخچه) بروید و روی دکمه (P) بزنید\nعلاوه بر ابزار XMR checktx به آدرس (https://xmr.llcoins.net/checktx.html) تایید تراکنش از داخل کیفپول هم قابل انجام است.\nدر monero-wallet-cli از طریق دستور (check_tx_key) \nدر monero-wallet-gui از طریق منوی Advanced > Prove/Check\nدر کاوشگرهای بلاک عادی، انتقال قابل تایید نیست.\n\nدر صورت بروز اختلاف، باید داده های زیر را در اختیار داور بگذارید:\n- کلید خصوصی تراکنش\n- هش تراکنش\n- آدرس عمومی گیرنده\n\nاگر شما نمی توانید داده های بالا را ارائه نموده یا اگر از کیف پول ناسازگار استفاده کرده اید، این موضوع می تواند منجر به محکوم شدن در یک اختلاف شود. فرستنده ی XMR باید بتواند در صورت بروز اختلاف انتقال XMR را به داوراثبات کند.\n\nشناسه پرداخت لازم نیست، فقط آدرس عمومی معمولی.\n\nاگر شما درباره این فرآیند مطمئن نیستید به (https://www.getmonero.org/resources/user-guides/prove-payment.html) سر بزنید و یا برای کسب اطلاعات بیشتر به تالار گفتگوی مونرو (https://forum.getmonero.org) مراجعه نمایید.
-account.altcoin.popup.blur.msg=اگر میخواهید BLUR را در Bisq معامله کنید لطفا مطمئن شوید که پیشنیازهای زیر را میفهمید و آنها را انجام دادهاید:\n\nبرای ارسال BLUR باید از کیفپول CLI یا GUI مربوط به Blur Network استفاده کنید.\n\nاگر از یک کیفپول CLI استفاده میکنید، بعد از یک انتقال یک هش تراکنش (شناسه تراکنش) برای شما به نمایش در میآید. شما باید این اطلاعات را ذخیره کنید. بلافاصله بعد از ارسال یک انتقال، باید با دستور 'get_tx_key' کلید خصوصی تراکنش را بدست بیاورید. اگر موفق به انجام این مرحله نشوید، بعدا نمیتوانید کلید را بدست بیاورید.\n\nاگر از کیف پول Blur Network GUI استفاده میکنید، کلید خصوصی تراکنش و شناسه تراکنش به راحتی در برگه «تاریخچه» در دسترس هستند. بلافاصله بعد از ارسال، تراکنش مورد نظر را پیدا کنید و روی نماد «؟» ذر گوشه جعبه نمایشی حاوی تراکنش کلیک کنید.\n\nاگر زمانی داوری مورد نیاز بود، باید اطلاعات زیر را به داور ارائه بدهید: 1.) شناسه تراکنش، 2.) کلید خصوصی تراکنش و 3.) آدرس گیرنده. بعد از آن، داور، انتقال را از طریق نمایشگر تراکنش Blur به آدرس (https://blur.cash/#tx-viewer) تایید میکند.\n\nاگر نتوانید اطلاعات مورد نیاز را به داور ارائه دهید، اختلاف به وجود آمده به ضرر شما تمام خواهد شد. در هر نوعی اختلافی که به وجود بیاید، 100% مسئولیت تایید کردن تراکنش به عهده ارسال کننده BLUR میباشد.\n\nاگر از این پیشنیازها سر در نمیآورید در Bisq معامله انجام ندهید. قبل از هر چیز در Blur Network Discord به آدرس (https://discord.gg/dMWaqVW) کمک بگیرید.
-account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN).
-account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC).
-account.altcoin.popup.drgl.msg=معامله Dragonglass در Bisq نیازمند این است که پیشنیازهای زیر را بفهمید و انجام دهید:\n\nبا توجه به ویژگیهای حریم خصوصی که Dragonglass در اختیار میگذارد تراکنشها قابل تایید بر روی بلاکچین عمومی نیستند. اگر نیازبه این کار داشتید میتوانید پرداحت خود را از طریق کلید خصوصی TXN اثبات کنید.\nکلید خصوصی TXN کلیدی است که فقط یکبار به صورت خودکار برای هر تراکنش ساخته میشود و فقط میتوانید از طریق کیف پول DRGL به آن دسترسی پیدا کنید.\nیا از طریق کیف پول DRGL GUI (داخل پنجره جزئیات تراکنش) و یا از طریق کیفپول Dragonglass CLI simplewallet (از طریق دستور "get_tx_key").\n\nنسخه 'Oathkeeper' مربوط به DRGL یا بالاتر در هر دوی کیفپولها مورد نیاز است.\n\nدر صورت بروز اختلاف، شما باید اطلاعات زیر را به داور ارائه بدهید:\n- کلید خصوصی TXN\n- هش تراکنش \n- آدرس عمومی گیرنده\n\nتایید پرداخت با استفاده از اطلاعات بالا از طریق (http://drgl.info/#check_txn) امکان پذیر است.\n\nاگر نتوانید اطلاعات بالا را به داور ارائه بدهید و یا اینکه از یک کیفپول غیر سازگار استفاده کرده باشید، اگر اختلافی رخ بدهد به ضرر شما تمام خواهد شد. فرستنده Dragonglass مسئول این است که بتواند در صورت بروز اختلاف، انتقال را به داور اثبات کند. نیازی به استفاده از PaymentID نیست.\n\nاگر در مورد هر بخش از این فرآیند مطمئن نیستید از Dragonglass درDiscord به آدرس (http://discord.drgl.info) کمک بگیرید.
-account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t) not the z-addresses (private), because the arbitrator would not be able to verify the transaction with z-addresses.
-account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses not the untraceable addresses, because the arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer.
+account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information.
+account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information.
+account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending XMR, you need to use either the official Monero GUI wallet or Monero CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nmonero-wallet-cli (use the command get_tx_key)\nmonero-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nIn addition to XMR checktx tool (https://xmr.llcoins.net/checktx.html) verification can also be accomplished in-wallet.\nmonero-wallet-cli : using command (check_tx_key).\nmonero-wallet-gui : on the Advanced > Prove/Check page.\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The XMR sender is responsible for providing verification of the XMR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit (https://www.getmonero.org/resources/user-guides/prove-payment.html) or the Monero forum (https://forum.getmonero.org) to find more information.
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs).
+account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW).
+account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/).
+account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN).
+account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC).
+account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help.
+account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses.
+account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer.
account.altcoin.popup.grin.msg=GRIN requires an interactive process between the sender and receiver to create the transaction. Be sure to follow the instructions from the GRIN project web page to reliably send and receive GRIN (the receiver needs to be online or at least be online during a certain time frame). \n\nBisq supports only the Grinbox (Wallet713) wallet URL format. \n\nThe GRIN sender is required to provide proof that they have sent GRIN successfully. If the wallet cannot provide that proof, a potential dispute will be resolved in favor of the GRIN receiver. Please be sure that you use the latest Grinbox software which supports the transaction proof and that you understand the process of transferring and receiving GRIN as well as how to create the proof. \n\nSee https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only for more information about the Grinbox proof tool.
account.altcoin.popup.beam.msg=BEAM requires an interactive process between the sender and receiver to create the transaction. \n\nBe sure to follow the instructions from the BEAM project web page to reliably send and receive BEAM (the receiver needs to be online or at least be online during a certain time frame). \n\nThe BEAM sender is required to provide proof that they sent BEAM successfully. Be sure to use wallet software which can produce such a proof. If the wallet cannot provide the proof a potential dispute will be resolved in favor of the BEAM receiver.
-account.altcoin.popup.pars.msg=تجارت پارسی کوین در Bisq مستلزم آن است که شما نیازمندی های زیر را درک کرده و انجام دهید:\n\nبرای ارسال PARS، لازم است که از نسخه 3.0.0 به بعد کیف پول پارسی کوین استفاده کنید.\n\nشما می توانید هش تراکنش یا کلید تراکنش های خود را روی بخش تراکنش ها در کیف پول GUI خود (ParsiPay) بررسی کنید. برای این کار باید روی تراکنش، راست کلیک کرده و سپس روی نمایش جزئیات کلیک نمایید.\n\nدر مورد رخدادهایی که نیاز به داوری دارند، لازم است که موارد زیر را ارائه دهید: 1) هش تراکنش، 2) کلید تراکنش، 3) آدرس PARS دریافت کننده. سپس داور، با استفاده از مرورگر بلاک پارسی کوین به آدرس (http://explorer.parsicoin.net/#check_payment)، انتقال PARS را تائید می کند.\n\nبهتر است بدانید که عدم ارائه اطلاعات لازم به داور، منجر به از دست رفتن کیس دیسپوت خواهد شد. در همه موارد دیسپوت، فرستنده پارسی کوین، صد در صد مسئولیت های تائید تراکنش ها را به یک داور تحمیل می کند.\n\nاگر شما این ملزومات را درک نمی کنید، وارد تجارت در Bisq نشوید. لازم است که درابتدا، از ParciCoin Discord به آدرس (https://discord.gg/c7qmFNh) کمک بخواهید.
+account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh).
+
+account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash.
account.fiat.yourFiatAccounts=حسابهای ارزهای ملی شما
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=ویژگی واحد نقش تضمین شده در B
dao.param.ISSUANCE_LIMIT=محدودیت صدور در چرخه در BSQ
dao.param.currentValue=مقدار فعلی: {0}
+dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1})
dao.param.blocks={0} بلاک
dao.results.cycle.duration.label=زمان {0}
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} بلاک
dao.results.cycle.value.postFix.isDefaultValue=(مقدار پیشفرض)
dao.results.cycle.value.postFix.hasChanged=(در رای گیری تغییر کرده است)
-dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the P2P network.\n{0}
+dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=تعریف نشده
@@ -1503,7 +1578,7 @@ dao.proposal.create.publish=انتشار طرح پیشنهادی
dao.proposal.create.publishing=انتشار طرح پیشنهادی در حال انجام است ...
dao.proposal=طرح پیشنهادی
dao.proposal.display.type=نوع طرح پیشنهادی
-dao.proposal.display.name=نام/نام مستعار
+dao.proposal.display.name=Exact GitHub username
dao.proposal.display.link=پیوند اینترنتی به اطلاعات جزئی
dao.proposal.display.link.prompt=پیوند اینترنتی به طرح پیشنهادی
dao.proposal.display.requestedBsq=مبلغ درخواستی به BSQ
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=رای فعلی: ''{0}''. تغییر
dao.proposal.display.myVote.accepted=قبول شده
dao.proposal.display.myVote.rejected=رد شده
dao.proposal.display.myVote.ignored=نادیده گرفته شده
-dao.proposal.myVote.summary=رای: {0}؛ وزن رای: {1} (بدست آمده: {2} + سهام: {3})؛
+dao.proposal.display.myVote.unCounted=Vote was not included in result
+dao.proposal.myVote.summary=Voted: {0}; Vote weight: {1} (earned: {2} + stake: {3}) {4}
dao.proposal.myVote.invalid=رای نامعتبر بود
dao.proposal.voteResult.success=قبول شده
@@ -1680,6 +1756,7 @@ dao.monitor.daoState.utxoConflicts=تناقضات UTXO
dao.monitor.daoState.utxoConflicts.blockHeight=ارتفاع بلاک: {0}
dao.monitor.daoState.utxoConflicts.sumUtxo=مجموع همه UTXO ها:{0} BSQ
dao.monitor.daoState.utxoConflicts.sumBsq=مجموع همه BSQ ها:{BSQ {0
+dao.monitor.daoState.checkpoint.popup=DAO state is not in sync with the network. After restart the DAO state will resync.
dao.monitor.proposal.headline=وضعیت طرحهای پیشنهادی
dao.monitor.proposal.table.headline=زنجیره هش های وضعیت پروپوزال
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=تراکنشهای BSQ
dao.factsAndFigures.dashboard.marketPrice=دادههای بازار
dao.factsAndFigures.dashboard.price=آخرین قیمت معاملاتی BSQ/BTC (به Bisq)
+dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price
+dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price
dao.factsAndFigures.dashboard.marketCap=ارزش بازار (بر مبنای قیمت معاملاتی)
dao.factsAndFigures.dashboard.availableAmount=مجموع BSQ در دسترس
@@ -1769,10 +1848,6 @@ displayUpdateDownloadWindow.download.openDir=باز کردن راهنمای دا
disputeSummaryWindow.title=خلاصه
disputeSummaryWindow.openDate=تاریخ ایجاد تیکت
disputeSummaryWindow.role=نقش معامله گر
-disputeSummaryWindow.evidence=شواهد
-disputeSummaryWindow.evidence.tamperProof=شواهد اثبات رشوه:
-disputeSummaryWindow.evidence.id=اعتبارسنجی شناسه
-disputeSummaryWindow.evidence.video=ویدئو/ فیلم از صفحه
disputeSummaryWindow.payout=پرداختی مقدار معامله
disputeSummaryWindow.payout.getsTradeAmount=BTC {0} پرداختی مبلغ معامله را دریافت می کند
disputeSummaryWindow.payout.getsAll=BTC {0} همه را دریافت می کند
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=بانک
disputeSummaryWindow.summaryNotes=نکات خلاصه
disputeSummaryWindow.addSummaryNotes=افزودن نکات خلاصه
disputeSummaryWindow.close.button=بستن تیکت
-disputeSummaryWindow.close.msg=تیکت در {0} بسته شد.\n\nخلاصه:\n{1} شواهد اثبات رشوه را تحویل داد: {2}\n{3} اعتبارسنجی شناسه را انجام داد: {4}\n{5} یک ویدئو یا اسکرین کست انجام داد: {6}\nمبلغ پرداختی برای خریدار بیتکوین: {7}\nمبلغ پرداختی برای فروشنده بیتکوین: {8}\n\nنکات خلاصه:\n{9}
+disputeSummaryWindow.close.msg=Ticket closed on {0}\n\nSummary:\nPayout amount for BTC buyer: {1}\nPayout amount for BTC seller: {2}\n\nSummary notes:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\nNext steps:\nOpen ongoing trade and accept or reject the suggested mediation
disputeSummaryWindow.close.closePeer=شما باید همچنین تیکت همتایان معامله را هم ببندید!
+disputeSummaryWindow.close.txDetails.headline=Publish refund transaction
+disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction?
emptyWalletWindow.headline=ابزار اضطراری کیف پول {0}
emptyWalletWindow.info=لطفاً تنها در مورد اضطراری از آن استفاده کنید اگر نمی توانید به وجه خود از UI دسترسی داشته باشید.\n\nلطفاً توجه داشته باشید که تمام معاملات باز به طور خودکار در هنگام استفاده از این ابزار، بسته خواهد شد.\n\nقبل از به کار گیری این ابزار، از راهنمای داده ی خود پشتیبان بگیرید. می توانید این کار را در \"حساب/پشتیبان\" انجام دهید.\n\nلطفاً مشکل خود را به ما گزارش کنید و گزارش مشکل را در GitHub یا تالار گفتگوی Bisq بایگانی کنید تا ما بتوانیم منشأ مشکل را بررسی نماییم.
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=شما معاملات بازی دارید که
emptyWalletWindow.openOffers.yes=بله، مطمئن هستم
emptyWalletWindow.sent.success=تراز کیف پول شما به طور موفقیت آمیز منتقل شد.
-enterPrivKeyWindow.headline=ثبت نام فقط برای داوران دعوت شده، باز است
+enterPrivKeyWindow.headline=Enter private key for registration
filterWindow.headline=ویرایش لیست فیلتر
filterWindow.offers=پیشنهادهای فیلتر شده (جدا شده با ویرگول)
@@ -1815,6 +1895,8 @@ filterWindow.accounts=داده های حساب معاملاتی فیلترشده
filterWindow.bannedCurrencies=کدهای ارز فیلترشده (جدا شده با ویرگول)
filterWindow.bannedPaymentMethods=شناسههای روش پرداخت فیلتر شده (جدا شده با ویرگول)
filterWindow.arbitrators=داوران فیلتر شده (آدرس های Onion جدا شده با ویرگول)
+filterWindow.mediators=Filtered mediators (comma sep. onion addresses)
+filterWindow.refundAgents=Filtered refund agents (comma sep. onion addresses)
filterWindow.seedNode=گره های seed فیلتر شده (آدرس های Onion جدا شده با ویرگول)
filterWindow.priceRelayNode=گره های رله قیمت فیلترشده (آدرس های Onion جدا شده با ویرگول)
filterWindow.btcNode=گرههای بیتکوین فیلترشده (آدرس + پورت جدا شده با ویرگول)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(/BIC/SWIFT/شناسه بانک سفارش گذ
offerDetailsWindow.offerersBankName=(نام بانک سفارش گذار)
offerDetailsWindow.bankId=شناسه بانک (برای مثال BIC یا SWIFT)
offerDetailsWindow.countryBank=کشور بانک سفارشگذار
-offerDetailsWindow.acceptedArbitrators=داوران پذیرفته شده
offerDetailsWindow.commitment=تعهد
offerDetailsWindow.agree=من موافقم
offerDetailsWindow.tac=شرایط و الزامات
@@ -1883,6 +1964,7 @@ tradeDetailsWindow.tradeDate=تاریخ معامله
tradeDetailsWindow.txFee=کارمزد استخراج
tradeDetailsWindow.tradingPeersOnion=آدرس Onion همتایان معامله:
tradeDetailsWindow.tradeState=وضعیت معامله
+tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
walletPasswordWindow.headline=وارد کردن رمز عبور به منظور باز کردن
@@ -1945,10 +2027,11 @@ popup.warning.incompatibleDB=ما فایل های پایه داده ناسازگ
popup.warning.startupFailed.twoInstances=Bisq در حال اجرا است. شما نمیتوانید دو نمونه از Bisq را اجرا کنید.
popup.warning.cryptoTestFailed=به نظر می رسد که شما از باینری خود کامپایل استفاده می کنید و از دستورالعمل های ساخت در https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys پیروی نکرده اید.\n\n اگر این مورد نیست و شما از باینری رسمی Bisq استفاده می کنید، لطفا گزارش اشکال را به صفحه GitHub ارسال کنید.\n Error={0}
popup.warning.tradePeriod.halfReached=معامله شما با شناسه {0} نیمی از حداکثر مجاز دوره زمانی معامله را به پایان رسانده و هنوز کامل نشده است. \n\nدوره معامله در {1} به پایان می رسد\n\n لطفا وضعیت معامله خود را در \"سبد سهام/معاملات باز\" برای اطلاعات بیشتر، بررسی کنید.
-popup.warning.tradePeriod.ended=معامله شما با شناسه {0} به حداکثر مجاز دوره زمانی معامله رسیده و کامل نشده است.\n\n دوره معامله در {1} به پایان رسیده است.\n\n لطفا معامله خود را در \"سبد سهام/معاملات باز\" برای تماس با داور بررسی کنید.
+popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
popup.warning.noTradingAccountSetup.headline=شما یک حساب معاملاتی را راه اندازی نکرده اید
popup.warning.noTradingAccountSetup.msg=قبل از اینکه بتوانید یک پیشنهاد ایجاد کنید، باید یک ارز ملی یا حساب کاربری آلت کوین را تنظیم کنید. \nآیا می خواهید یک حساب کاربری را راه اندازی کنید؟
popup.warning.noArbitratorsAvailable=هیچ داوری در دسترس نیست.
+popup.warning.noMediatorsAvailable=There are no mediators available.
popup.warning.notFullyConnected=شما باید منتظر بمانید تا به طور کامل به شبکه متصل شوید. \nاین ممکن است در هنگام راه اندازی حدود 2 دقیقه طول بکشد.
popup.warning.notSufficientConnectionsToBtcNetwork=شما باید منتظر بمانید تا حداقل {0} اتصال به شبکه بیتکوین داشته باشید.
popup.warning.downloadNotComplete=شما باید منتظر بمانید تا بارگیری بلاک های بیتکوین باقیمانده کامل شود.
@@ -1958,13 +2041,13 @@ popup.warning.examplePercentageValue=لطفا یک عدد درصد مانند \"
popup.warning.noPriceFeedAvailable=برای این ارز هیچ خوراک قیمتی وجود ندارد. شما نمیتوانید از یک درصد بر اساس قیمت استفاده کنید. \nلطفا قیمت مقطوع را انتخاب کنید.
popup.warning.sendMsgFailed=ارسال پیام به شریک معاملاتی شما ناموفق بود. \nلطفا دوباره امتحان کنید و اگر همچنان ناموفق بود، گزارش یک اشکال را ارسال کنید.
popup.warning.insufficientBtcFundsForBsqTx=شما BTC کافی برای پرداخت کارمزد استخراج آن تراکنش BSQ را ندارید.\nلطفاً کیف پول BTC خود را شارژ نموده تا قادر به انتقال BSQ باشید.\nBTC موردنیاز: {0}
-popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
-popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the Bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the Bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
popup.warning.insufficientBsqFundsForBtcFeePayment=شما BTC کافی برای پرداخت کارمزد معامله آن تراکنش BSQ را ندارید. میتوانید کارمزد را با BTC پرداخت کنید و یا اینکه کیف پول BSQ خود را شارژ کنید. میتوانید از Bisq اقدام به خرید BSQ کنید.\n\nBSQ موردنیاز: {0}
popup.warning.noBsqFundsForBtcFeePayment=کیفپول BSQ شما BSQ کافی برای پرداخت کارمزد معامله به BSQ را ندارد.
popup.warning.messageTooLong=پیام شما بیش از حداکثر اندازه مجاز است. لطفا آن را در چند بخش ارسال کنید یا آن را در یک سرویس مانند https://pastebin.com آپلود کنید.
-popup.warning.lockedUpFunds=شما مبلغی را از یک معامله ی ناموفق قفل کرده اید.\n تراز قفل شده: {0} \nآدرس تراکنش سپرده: {1}\n شناسه معامله: {2} .\n\n لطفا یک تیکت پشتیبانی را با انتخاب معامله در صفحه معاملات در انتظار باز کنید و \"alt + o\" or \"option + o\" را بگیرید.
+popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"."
popup.warning.nodeBanned=یکی از گره های {0} مسدود شده است. لطفا برنامه خود را مجددا راه اندازی کنید تا مطمئن شوید که به گره ی مسدود وصل نیستید.
popup.warning.priceRelay=رله قیمت
@@ -1993,19 +2076,36 @@ popup.shutDownInProgress.msg=خاتمه دادن به برنامه می توان
popup.attention.forTradeWithId=توجه الزامی برای معامله با شناسه {0}
-popup.roundedFiatValues.headline=ویژگی جدید حریم خصوصی: مقادیرگرد شده برای فیاتها
-popup.roundedFiatValues.msg=برای محافظت از حریم خصوصی معامله شما، مقدار {0} گرد شده است.\n\nبسته به نسخه کلاینت، مقادیرپرداختی یا دریافتی به صورت گرد شده یا با خرده اعشاری خواهند بود.\n\nاز این به بعد، هر دوی این مقادیر در پروتکل معامله پذیرفته شده محسوب میشوند.\n\nهمچنین توجه داشته باشید که مقادیر BTC به صورت خودکار به عددی تغییر خواهند کرد که متناسب با مقدار فیات گرد شده بشود.
-
popup.info.multiplePaymentAccounts.headline=Multiple payment accounts available
popup.info.multiplePaymentAccounts.msg=You have multiple payment accounts available for this offer. Please make sure you've picked the right one.
-popup.dao.launch.headline=The complete vision, realized
-popup.dao.launch.governance.title=حکمرانی
-popup.dao.launch.governance=Bisq’s trading network was already decentralized. \nWith the Bisq DAO, Bisq’s leadership is now decentralized too, making Bisq exceptionally resistant to censorship.
-popup.dao.launch.trading.title=معامله
-popup.dao.launch.trading=Trade BSQ (colored bitcoin) to participate in Bisq governance. You can buy and sell BSQ just like any other asset on Bisq.
-popup.dao.launch.cheaperFees.title=Cheaper fees
-popup.dao.launch.cheaperFees=Get a 90% discount on trading fees when you use BSQ. Save money and support the project at the same time!\n\n
+popup.news.launch.headline=Two Major Updates
+popup.news.launch.accountSigning.headline=ACCOUNT SIGNING
+popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer.
+popup.news.launch.ntp.headline=NEW TRADE PROTOCOL
+popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant.
+
+popup.accountSigning.selectAccounts.headline=Select payment accounts
+popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign.
+popup.accountSigning.selectAccounts.signAll=Sign all payment methods
+popup.accountSigning.selectAccounts.datePicker=Select point of time until which accounts will be signed
+
+popup.accountSigning.confirmSelectedAccounts.headline=Confirm selected payment accounts
+popup.accountSigning.confirmSelectedAccounts.description=Based on your input, {0} payment accounts will be selected.
+popup.accountSigning.confirmSelectedAccounts.button=Confirm payment accounts
+popup.accountSigning.signAccounts.headline=Confirm signing of payment accounts
+popup.accountSigning.signAccounts.description=Based on your selection, {0} payment accounts will be signed.
+popup.accountSigning.signAccounts.button=Sign payment accounts
+popup.accountSigning.signAccounts.ECKey=Enter private arbitrator key
+popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey
+
+popup.accountSigning.success.headline=Congratulations
+popup.accountSigning.success.description=All {0} payment accounts were successfully signed!
+popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0}
+popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1}
+popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0}
+popup.accountSigning.peerSigner=One of your accounts is mature enough to sign other payment accounts and the initial limit for one of your accounts has been lifted.\n\n{0}
####################################################################
# Notifications
@@ -2071,6 +2171,7 @@ list.currency.editList=ویرایش لیست ارز
table.placeholder.noItems=در حال حاضر هیچ {0} موجود نیست
table.placeholder.noData=در حال حاضر داده ای موجود نیست
+table.placeholder.processingData=Processing data...
peerInfoIcon.tooltip.tradePeer=همتای معامله
@@ -2093,7 +2194,8 @@ peerInfo.title=اطلاعات همتا
peerInfo.nrOfTrades=تعداد معاملات انجام شده
peerInfo.notTradedYet=شما تاکنون با آن کاربر معامله نداشته اید.
peerInfo.setTag=تنظیم برچسب برای آن همتا
-peerInfo.age=عمر حساب پرداخت
+peerInfo.age.noRisk=عمر حساب پرداخت
+peerInfo.age.chargeBackRisk=Time since signing
peerInfo.unknownAge=عمر شناخته شده نیست
addressTextField.openWallet=باز کردن کیف پول بیتکوین پیشفرضتان
@@ -2154,7 +2256,7 @@ BTC_REGTEST=Bitcoin Regtest
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=Bitcoin DAO Testnet (deprecated)
# suppress inspection "UnusedProperty"
-BTC_DAO_BETANET=Bitcoin DAO Betanet (Bitcoin Mainnet)
+BTC_DAO_BETANET=Bisq DAO Betanet (Bitcoin Mainnet)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=Bitcoin DAO Regtest
@@ -2253,6 +2355,7 @@ payment.accepted.banks=بانک های پذیرفته شده (شناسه)
payment.mobile=شماره موبایل
payment.postal.address=آدرس پستی
payment.national.account.id.AR=شماره CBU
+shared.accountSigningState=Account signing status
#new
payment.altcoin.address.dyn=آدرس {0}
@@ -2261,7 +2364,7 @@ payment.accountNr=شماره حساب
payment.emailOrMobile=ایمیل یا شماره موبایل
payment.useCustomAccountName=استفاده از نام حساب سفارشی
payment.maxPeriod=حداکثر دوره ی زمانی مجاز معامله
-payment.maxPeriodAndLimit=حداکثر طول مدت معامله: {0} / حداکثر حد معامله: {1} / عمر حساب: {2}
+payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3}
payment.maxPeriodAndLimitCrypto=حداکثر طول مدت معامله: {0} / حداکثر معامله: {1}
payment.currencyWithSymbol=ارز: {0}
payment.nameOfAcceptedBank=نام بانک پذیرفته شده
@@ -2284,12 +2387,13 @@ payment.moneyGram.info=هنگام استفاده از MoneyGram، خریدار B
payment.westernUnion.info=هنگام استفاده از Western Union، خریدار BTC باید شماره MTCN (شماره پیگیری) را از طریق ایمیل به فروشنده BTC ارسال کند. رسید باید به وضوح نام کامل فروشنده، کشور، دولت و مبلغ را نشان دهد. ایمیل فروشنده در فرآیند معامله به خریدار نشان داده می شود.
payment.halCash.info=زمانی که از HalCash استفاده میکنید، خریدار باید کد HalCash را از طریق پیام کوتاه موبایل به فروشنده BTC ارسال کند.\n\nلطفا مطمئن شوید که از حداکثر میزانی که بانک شما برای انتقال از طریق HalCash مجاز میداند تجاوز نکردهاید. حداقل مقداردر هر برداشت معادل 10 یورو و حداکثر مقدار 600 یورو میباشد. این محدودیت برای برداشتهای تکراری برای هر گیرنده در روز 3000 یورو و در ماه 6000 یورو میباشد. لطفا این محدودیتها را با بانک خود مطابقت دهید و مطمئن شوید که آنها هم همین محدودیها را دارند.\n\nمقدار برداشت باید شریبی از 10 یورو باشد چرا که مقادیر غیر از این را نمیتوانید از طریق ATM برداشت کنید. رابط کاربری در صفحه ساخت پینشهاد و پذیرش پیشنهاد مقدار BTC را به گونهای تنظیم میکنند که مقدار EUR درست باشد. شما نمیتوانید از قیمت بر مبنای بازار استفاده کنید چون مقدار یورو با تغییر قیمتها عوض خواهد شد.\n\nدر صورت بروز اختلاف خریدار BTC باید شواهد مربوط به ارسال یورو را ارائه دهد.
payment.limits.info=لطفا توجه داشته باشید که تمام انتقال های بانکی مقدار مشخصی از ریسک استرداد وجه را تقبل می کنند. برای کاهش این ریسک، Bisq محدودیت به ازای هر معامله را بر اساس دو عامل تعیین می کند: \n\n1. میزان برآورد ریسک استرداد وجه برای روش پرداخت استفاده شده.\n\n2. عمر حساب کاربری شما برای این روش پرداخت\n\n حسابی که اکنون ایجاد می کنید، جدید است و عمر آن صفر است. همانطور که عمر حساب شما در طول یک دوره دو ماهه رشد می کند، محدودیت به ازای هر معامله ی شما نیز با آن رشد می کند:\n\n ● در ماه اول، میزان محدودیت به ازای هر معامله شما {0} خواهد بود\n ● در طول ماه دوم محدودیت شما {1} خواهد بود\n ● پس از ماه دوم، محدودیت شما {2} خواهد بود \n\n لطفا توجه داشته باشید که هیچ محدودیتی در کل تعداد دفعاتی که می توانید معامله کنید، وجود ندارد.
+payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade buy limits based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account you just created carries some chargeback risk and is not yet signed by an arbitrator or trusted peer, so it is limited to buying {0} per trade. After it is signed, buy limits will increase as follows:\n\n● Before signing, and up to 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase merely as account age increases. More information is at https://docs.bisq.network/payment-methods#account-signing.\n\nThere are no limits on the number of trades you can make.
payment.cashDeposit.info=لطفا مطمئن شوید که بانک شما اجازه پرداخت سپرده نفد به حساب دیگر افراد را میدهد. برای مثال، Bank of America و Wells Fargo دیگر اجازه چنین پرداختهایی را نمیدهند.
payment.revolut.info=Please be sure that the phone number you used for your Revolut account is registered at Revolut otherwise the BTC buyer cannot send you the funds.
-payment.usPostalMoneyOrder.info=Money orders are one of the more private fiat purchase methods available on Bisq.\n\nHowever, please be aware of potentially increased risks associated with their use. Bisq will not bear any responsibility in case a sent money order is stolen, and the arbitrators will in such cases award the BTC to the sender of the money order, provided they can produce tracking information and receipts. It may be advisable for the sender to write the BTC seller's name on the money order, in order to minimize the risk that the money order is cashed by someone else.
+payment.usPostalMoneyOrder.info=Money orders are one of the more private fiat purchase methods available on Bisq.\n\nHowever, please be aware of potentially increased risks associated with their use. Bisq will not bear any responsibility in case a sent money order is stolen, and the mediator or arbitrator will in such cases award the BTC to the sender of the money order, provided they can produce tracking information and receipts. It may be advisable for the sender to write the BTC seller's name on the money order, in order to minimize the risk that the money order is cashed by someone else.
payment.f2f.contact=اطلاعات تماس
payment.f2f.contact.prompt=از چه طریقی میخواهید توسط همتای معاملاتی با شما تماس حاصل شود؟ (آدرس ایمیل، شماره تلفن، ...)
@@ -2299,11 +2403,15 @@ payment.f2f.optionalExtra=اطلاعات اضافی اختیاری
payment.f2f.extra=اطلاعات اضافی
payment.f2f.extra.prompt=سفارشگذار میتواند متن 'شرایط و الزامات' را تعیین کند و یا اطلاعات تماس عمومی را تنظیم کند. این اطلاعات به همراه پیشنهاد نمایش داده خواهد شد.
-payment.f2f.info=معاملات 'رو در رو' قوانین متفاوتی دارند و در نتیجه مخاطرات متفاوتی نسبت به تراکنشهای بر خط دارند.\n\nتفاوتهای اصلی اینها هستند:\n● دو طرف معامله باید اطلاعات مربوط به مکان و زمان ملاقات را به یکدیگر از طریق اطلاعات تماسشان اطلاع دهند.\n● دو طرف معامله باید لپ تاپ هایشان را به همراه داشته باشند تا در محل ملاقات 'تاییدیه پرداخت' و 'تاییدیه دریافت' را انجام دهند.\n● اگر سفارش گذار 'شرایط و الزامات' خاصی دارد باید آن را در محل 'اطلاعات اضافی' حسابش قرار داده باشد.\n● با پذیرفتن یک پیشنهاد در واقع پذیرنده 'شرایط و الزامات' سفارش گذار را پذیرفته است.\n● در صورت بروز اختلاف، داور کمک خاصی نمیتواند بکند چرا که شواهد قابل استنادی وجود ندارد که دقیقا در محل ملاقات چه اتفاقی افتاده است. در چنین مواقعی ممکن است وجوه BTC برای همیشه قفل بشوند تا اینکه طرفین معامله به یک توافق برسند.\n\nبرای مطمئن شوید که تمام تفاوتهای معاملات 'رو در رو' را فهمیدهاید لطفا دستورالعمل و پیشنهادات زیر را مطالعه کنید: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
+payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
payment.f2f.info.openURL=باز کردن صفحه وب
-payment.f2f.offerbook.tooltip.countryAndCity=کشور و شهر: {0} / {1}
+payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
payment.f2f.offerbook.tooltip.extra=اطلاعات اضافی: {0}
+payment.japan.bank=بانک
+payment.japan.branch=Branch
+payment.japan.account=حساب
+payment.japan.recipient=نام
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -2317,6 +2425,7 @@ CASH_DEPOSIT=سپرده ی نقدی
MONEY_GRAM=مانی گرام
WESTERN_UNION=Western Union
F2F=رو در رو (به طور فیزیکی)
+JAPAN_BANK=Japan Bank Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=بانک های ملی
@@ -2334,6 +2443,8 @@ MONEY_GRAM_SHORT=مانی گرام
WESTERN_UNION_SHORT=Western Union
# suppress inspection "UnusedProperty"
F2F_SHORT=رو در رو
+# suppress inspection "UnusedProperty"
+JAPAN_BANK_SHORT=Japan Furikomi
# Do not translate brand names
# suppress inspection "UnusedProperty"
@@ -2495,7 +2606,12 @@ validation.pattern=ورودی باید در این قالب باشد: {0}
validation.noHexString=ورودی در قالب HEX نیست
validation.advancedCash.invalidFormat=باید یک ایمیل درست باشد و یا یک شناسه کیفپول در قالب: X000000000000
validation.invalidUrl=این یک URL معتبر نیست
-validation.mustBeDifferent=Your input must be different to the current value
+validation.mustBeDifferent=Your input must be different from the current value
validation.cannotBeChanged=Parameter cannot be changed
validation.numberFormatException=Number format exception {0}
validation.mustNotBeNegative=ورودی نباید منفی باشد
+validation.phone.missingCountryCode=Need two letter country code to validate phone number
+validation.phone.invalidCharacters=Phone number {0} contains invalid characters
+validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number
+validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number
+validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}.
diff --git a/core/src/main/resources/i18n/displayStrings_fr.properties b/core/src/main/resources/i18n/displayStrings_fr.properties
index 12ade104e6..d932d3d0e1 100644
--- a/core/src/main/resources/i18n/displayStrings_fr.properties
+++ b/core/src/main/resources/i18n/displayStrings_fr.properties
@@ -62,6 +62,10 @@ shared.priceWithCur=Prix en {0}
shared.priceInCurForCur=Prix en {0} pour 1 {1}
shared.fixedPriceInCurForCur=Prix fixé en {0} pour 1 {1}
shared.amount=Montant
+shared.txFee=Transaction Fee
+shared.makerFee=Maker Fee
+shared.buyerSecurityDeposit=Buyer Deposit
+shared.sellerSecurityDeposit=Seller Deposit
shared.amountWithCur=Montant en {0}
shared.volumeWithCur=Volume en {0}
shared.currency=Devise
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=Veuillez envoyer de nouveau la confirmation
shared.exportCSV=Exporter au format csv
shared.exportJSON=Exporter vers JSON
shared.noDateAvailable=Pas de date disponible
-shared.arbitratorsFee=Frais d'arbitrage
shared.noDetailsAvailable=Pas de détails disponibles
shared.notUsedYet=Pas encore utilisé
shared.date=Date
@@ -149,11 +152,11 @@ shared.save=Sauvegarder
shared.onionAddress=Adresse Onion
shared.supportTicket=Ticket de support
shared.dispute=conflit
+shared.mediationCase=mediation case
shared.seller=vendeur
shared.buyer=acheteur
shared.allEuroCountries=Tous les pays de la zone Euro
shared.acceptedTakerCountries=Pays acceptés par le taker
-shared.arbitrator=Arbitre sélectionné
shared.tradePrice=Prix de l'échange
shared.tradeAmount=Montant de l'échange
shared.tradeVolume=Volume d'échange
@@ -203,6 +206,15 @@ shared.proposal=Proposition
shared.votes=Votes
shared.learnMore=En savoir plus
shared.dismiss=Rejeter
+shared.selectedArbitrator=Arbitre sélectionné
+shared.selectedMediator=Selected mediator
+shared.selectedRefundAgent=Arbitre sélectionné
+shared.mediator=Médiateur
+shared.arbitrator=Arbitre
+shared.refundAgent=Arbitre
+shared.refundAgentForSupportStaff=Refund agent
+shared.delayedPayoutTxId=Refund collateral transaction ID
+
####################################################################
# UI views
@@ -244,20 +256,20 @@ mainView.footer.btcInfo.synchronizingWith=Synchronisation avec
mainView.footer.btcInfo.synchronizedWith=Synchronisé avec
mainView.footer.btcInfo.connectingTo=Se connecte à
mainView.footer.btcInfo.connectionFailed=Echec de la connexion
-mainView.footer.p2pInfo=Pairs du réseau P2P: {0}
+mainView.footer.p2pInfo=Bisq network peers: {0}
mainView.footer.daoFullNode=DAO full node
mainView.bootstrapState.connectionToTorNetwork=(1/4) Connection au réseau Tor...
-mainView.bootstrapState.torNodeCreated=(2/4) Tor node crée
+mainView.bootstrapState.torNodeCreated=(2/4) Noeud Tor créé
mainView.bootstrapState.hiddenServicePublished=(3/4) Hidden Service published
mainView.bootstrapState.initialDataReceived=(4/4) Données initiales reçues
mainView.bootstrapWarning.noSeedNodesAvailable=Pas de seed nodes disponible
mainView.bootstrapWarning.noNodesAvailable=Pas de noeuds de seed ou de pairs disponibles
-mainView.bootstrapWarning.bootstrappingToP2PFailed=Le Bootstrapping sur le réseau P2P a échoué
+mainView.bootstrapWarning.bootstrappingToP2PFailed=Bootstrapping to Bisq network failed
mainView.p2pNetworkWarnMsg.noNodesAvailable=Il n'y a pas de noeud de seed ou de persisted pairs disponibles pour demander des données.\nVeuillez vérifier votre connexion Internet ou essayer de redémarrer l'application.
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Échec de la connexion au réseau P2P (erreur signalée : {0}).\nMerci de vérifier votre connexion internet ou essayez de redémarrer l''application.
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Connecting to the Bisq network failed (reported error: {0}).\nPlease check your internet connection or try to restart the application.
mainView.walletServiceErrorMsg.timeout=La connexion au réseau Bitcoin a échoué car le délai d'attente a expiré.
mainView.walletServiceErrorMsg.connectionError=La connexion au réseau Bitcoin a échoué à cause d''une erreur: {0}
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=Fermer:
market.trades.tooltip.candle.high=Haut:
market.trades.tooltip.candle.low=Bas:
market.trades.tooltip.candle.average=Moyenne:
+market.trades.tooltip.candle.median=Median:
market.trades.tooltip.candle.date=Date:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=Pays acceptés où se situe le siège de la
offerbook.availableOffers=Ordres disponibles
offerbook.filterByCurrency=Filtrer par devise
offerbook.filterByPaymentMethod=Filtrer par mode de paiement
+offerbook.timeSinceSigning=Time since signing
+offerbook.timeSinceSigning.info=This account was verified and {0}
+offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
+offerbook.timeSinceSigning.info.peer=signed by a peer, waiting for limits to be lifted
+offerbook.timeSinceSigning.info.peerLimitLifted=signed by a peer and limits were lifted
+offerbook.timeSinceSigning.info.signer=signed by peer and can sign peer accounts (limits lifted)
+offerbook.timeSinceSigning.daysSinceSigning={0} jours
+offerbook.timeSinceSigning.daysSinceSigning.long={0} since signing
+
+offerbook.timeSinceSigning.help=When you successfully complete a trade with a peer who has a signed payment account, your payment account is signed.\n{0} days later, the initial limit of {1} is lifted and your account can sign other peers'' payment accounts.
+offerbook.timeSinceSigning.notSigned=Not signed yet
+offerbook.timeSinceSigning.notSigned.noNeed=N/A
+shared.notSigned=This account hasn't been signed yet
+shared.notSigned.noNeed=This account type doesn't use signing
offerbook.nrOffers=Nombre d'ordres: {0}
offerbook.volume={0} (min - max)
@@ -345,14 +372,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=Vous n'avez pas de compte de t
offerbook.warning.noMatchingAccount.headline=Pas de compte de trading correspondant.
offerbook.warning.noMatchingAccount.msg=Pour accepter cet ordre, vous devrez établir un compte de paiement qui utilise ce mode de paiement.\n\nSouhaitez-vous le faire maintenant ?
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=Cette ordre ne peut être accepté en raison des restrictions de sécurité basées sur les critères suivants:\n- Le compte de paiement du maker a été créé après le 1er mars 2019.\n- Le montant minimum de transaction est supérieur à 0,01 BTC\n- Le mode de paiement pour cet ordre est considéré comme risqué au regard du risque de rétrofacturation bancaire\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=Cet ordre ne peut être accepté en raison des restrictions de sécurité basées sur les critères suivants:\n- Votre compte de paiement a été créé après le 1er mars 2019\n- Le montant minimum de transaction est supérieur à 0,01 BTC\n- Le mode de paiement pour cet ordre est considéré comme risqué au regard du risque de rétrofacturation bancaire\n\n{0}
+offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=Nous avons dû appliquer cette restriction comme mesure à court terme pour renforcer la sécurité..\n\nLa prochaine mise à jour du logiciel fournira des outils de protection plus robustes afin que les ordres présentant ce type de risque puissent à nouveau être conclues.
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=Le montant de transaction autorisé est limité à 0,01 BTC en raison des restrictions de sécurité basées sur les critères suivants:\n- Le compte acheteur a été créé après le 1er mars 2019\n- Le mode de paiement pour cet ordre est considéré comme risqué au regard du risque de rétrofacturation bancaire\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=Le montant de transaction autorisé est limité à 0,01 BTC en raison des restrictions de sécurité basées sur les critères suivants:\n- Votre compte de paiement a été créé après le 1er mars 2019\n- Le mode de paiement pour cet ordre est considéré comme risqué au regard du risque de rétrofacturation bancaire\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
offerbook.warning.wrongTradeProtocol=Cet ordre exige une version de protocole différente de celle utilisée actuellement par votre logiciel.\n\nVeuillez vérifier que vous avez bien la dernière version d'installée, il est possible que l'utilisateur qui a créé cet ordre utilise une ancienne version.\n\nIl n'est pas possible de trader avec des versions différentes de protocole.
offerbook.warning.userIgnored=Vous avez ajouté l'adresse onion de cet utilisateur à votre liste noire.
@@ -478,7 +503,7 @@ takeOffer.failed.offerTaken=Vous ne pouvez pas saisir cet ordre car elle a déj
takeOffer.failed.offerRemoved=Vous ne pouvez pas saisir cet ordre car elle a été supprimée entre-temps.
takeOffer.failed.offererNotOnline=La demande de prise de l'ordre a échoué parce que le maker n'est plus en ligne.
takeOffer.failed.offererOffline=Vous ne pouvez pas saisir cet ordre car le maker n'est pas connecté.
-takeOffer.warning.connectionToPeerLost=Vous avez perdu la connexion avec le maker.\nIl se peut qu'il se soit déconnecté ou qu'il ait fermé la connexion avec vous à cause d'un trop grand nombre de connexions ouvertes.\n\nSi vous pouvez encore voir son ordre dans le livre des ordres, vous pouvez essayer d'accepter de nouveau cet ordre.
+takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again.
takeOffer.error.noFundsLost=\n\nAucun fonds n'a quitté votre portefeuille pour le moment.\nVeuillez essayer de redémarrer votre application et vérifier votre connexion réseau pour voir si vous pouvez résoudre le problème.
takeOffer.error.feePaid=\n\nVeuillez essayer de redémarrer votre application et vérifier votre connexion réseau pour voir si vous pouvez résoudre le problème.
@@ -516,8 +541,8 @@ portfolio.pending.step3_seller.confirmPaymentReceived=Confirmation de paiement r
portfolio.pending.step5.completed=Terminé
portfolio.pending.step1.info=La transaction de dépôt à été publiée.\n{0} devez attendre au moins une confirmation de la blockchain avant d''initier le paiement.
-portfolio.pending.step1.warn=La transaction de dépôt n'a toujours pas été confirmée.\nCela peut se produire dans de rares cas lorsque les frais de transaction payés par un trader à partir d'un portefeuille externe sont trop peu élevés.
-portfolio.pending.step1.openForDispute=La transaction de dépôt n'a toujours pas été confirmée.\nCela peut se produire dans de rares cas lorsque les frais de transaction payés par un trader à partir d'un portefeuille externe sont trop peu élevés.\nLa période maximale pour ce trade est écoulée.\n\nVeuillez contacter un arbitre pour afin d'ouvrir une dispute.
+portfolio.pending.step1.warn=The deposit transaction is still not confirmed. This sometimes happens in rare cases when the funding fee of one trader from an external wallet was too low.
+portfolio.pending.step1.openForDispute=The deposit transaction is still not confirmed. You can wait longer or contact the mediator for assistance.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=Votre échange a été confirmé au moins une fois par la blockchain.\n(Vous pouvez attendre davantage pour obtenir plus de confirmations - 6 confirmations sont considérés comme très sures.)\n\n
@@ -534,9 +559,11 @@ portfolio.pending.step2_buyer.fees=Si votre banque vous facture des frais, vous
portfolio.pending.step2_buyer.altcoin=Veuillez transférer à partir de votre portefeuille externe {0}.\n{1} au vendeur de BTC.\n\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=Veuillez vous rendre dans une banque et payer {0} au vendeur de BTC.\n
-portfolio.pending.step2_buyer.cash.extra=CONDITIONS REQUISES: \nAprès avoir effectuer le paiement veuillez écrire sur le reçu papier : PAS DE REMBOURSEMENT.\nPuis déchirer le en 2, prenez en une photo et envoyer le à l'adresse email du vendeur de BTC.
+portfolio.pending.step2_buyer.cash.extra=CONDITIONS REQUISES: \nAprès avoir effectué le paiement veuillez écrire sur le reçu papier : PAS DE REMBOURSEMENT.\nPuis déchirer le en 2, prenez en une photo et envoyer le à l'adresse email du vendeur de BTC.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=Veuillez s''il vous plaît payer {0} au vendeur de BTC en utilisant MoneyGram.\n\n
portfolio.pending.step2_buyer.moneyGram.extra=CONDITIONS REQUISES:\nAprès avoir effectué le paiement envoyez le numéro d'autorisation et une photo du reçu par e-mail au vendeur de BTC.\nLe reçu doit faire clairement figurer le nom complet du vendeur, son pays, l''état et le montant. Le mail du vendeur est: {0}.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=Veuillez s''il vous plaît payer {0} au vendeur de BTC en utilisant Western Union.\n\n
portfolio.pending.step2_buyer.westernUnion.extra=CONDITIONS REQUISES:\nAprès avoir effectué le paiement envoyez le MTCN (numéro de suivi) et une photo du reçu par e-mail au vendeur de BTC.\nLe reçu doit faire clairement figurer le nom complet du vendeur, son pays, l''état et le montant. Le mail du vendeur est: {0}.
@@ -544,14 +571,15 @@ portfolio.pending.step2_buyer.westernUnion.extra=CONDITIONS REQUISES:\nAprès av
portfolio.pending.step2_buyer.postal=Merci d''envoyer {0} par \"US Postal Money Order\" au vendeur de BTC.\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.bank=Merci de vous rendre sur le site de votre banque en ligne et payer {0} au vendeur de BTC.\n\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=Veuillez s''il vous plaît contacter le vendeur de BTC via le contact fourni, et planifiez un rendez-vous pour effectuer le paiement {0}.\n\n
portfolio.pending.step2_buyer.startPaymentUsing=Initier le paiement en utilisant {0}
portfolio.pending.step2_buyer.amountToTransfer=Montant à transférer
portfolio.pending.step2_buyer.sellersAddress=Adresse {0} du vendeur
portfolio.pending.step2_buyer.buyerAccount=Votre compte de paiement à utiliser
portfolio.pending.step2_buyer.paymentStarted=Paiement initié
-portfolio.pending.step2_buyer.warn=Vous n''avez toujours pas effectué votre paiement {0}!\nVeuillez noter que cette transaction doit être effectuée avant {1} sinon la transaction sera inspectée par un arbitre.
-portfolio.pending.step2_buyer.openForDispute=Vous n'avez toujours pas effectué votre paiement!\nLa période maximale pour cette transaction est terminée.\n\nMerci de contacter l'arbitre afin d'ouvrir une dispute.
+portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
+portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.Please contact the mediator for assistance.
portfolio.pending.step2_buyer.paperReceipt.headline=Avez-vous envoyé le reçu papier au vendeur de BTC?
portfolio.pending.step2_buyer.paperReceipt.msg=Rappelez-vous: \nVous devez écrire sur le reçu papier: PAS DE REMBOURSEMENT.\nEnsuite, veuillez le déchirer en 2, faire une photo et l'envoyer à l'adresse email du vendeur.
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=Envoyer le numéro d'autorisation ainsi que le reçu
@@ -569,7 +597,11 @@ portfolio.pending.step2_seller.waitPayment.headline=En attende du paiement
portfolio.pending.step2_seller.f2fInfo.headline=Coordonnées de l'acheteur
portfolio.pending.step2_seller.waitPayment.msg=La transaction de dépôt a été vérifiée au moins une fois sur la blockchain\nVous devez attendre que l''acheteur de BTC lance le {0} payment.
portfolio.pending.step2_seller.warn=L''acheteur de BTC n'a toujours pas effectué le paiement {0}.\nVeuillez attendre qu'il effectue celui-ci.\nSi la transaction n'est pas effectuée le {1}, un arbitre enquêtera.
-portfolio.pending.step2_seller.openForDispute=L'acheteur de BTC n'a pas démarré son paiement!\nLe temps maximal alloué pour la transaction est écoulé.\nVous pouvez attendre encore pour laisser plus de temps au votre pair de trading, ou contacter l'arbitre pour ouvrir une dispute.
+portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance.
+
+tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}''
+tradeChat.openChat=Open chat window
+tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=Indéfini
@@ -578,7 +610,7 @@ message.state.SENT=Message envoyé
# suppress inspection "UnusedProperty"
message.state.ARRIVED=Message reçu par le pair
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=Message stocké dans la boîte de réception
+message.state.STORED_IN_MAILBOX=Message of payment sent but not yet received by peer
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=Le pair a confirmé la réception du message
# suppress inspection "UnusedProperty"
@@ -589,22 +621,23 @@ portfolio.pending.step3_buyer.wait.info=En attente de la confirmation du vendeur
portfolio.pending.step3_buyer.wait.msgStateInfo.label=État du message de lancement du paiement
portfolio.pending.step3_buyer.warn.part1a=sur la {0} blockchain
portfolio.pending.step3_buyer.warn.part1b=chez votre prestataire de paiement (par ex. banque)
-portfolio.pending.step3_buyer.warn.part2=Le vendeur de BTC n''a toujours pas confirmé votre paiement!\nVeuillez vérifier {0} si l''envoi du paiement a été effectué.\nSi le vendeur ne confirme pas la réception du paiement avant {1} la transaction fera l''objet d''une enquête par l'arbitre.
-portfolio.pending.step3_buyer.openForDispute=Le vendeur de BTC n'a pas confirmé votre paiement!\nLe temps maximal alloué pour la transaction est écoulé.\nVous pouvez attendre plus longtemps afin de donner plus de temps à votre pair de trading ou contacter l'arbitre pour ouvrir un litige.
+portfolio.pending.step3_buyer.warn.part2=The BTC seller still has not confirmed your payment. Please check {0} if the payment sending was successful.
+portfolio.pending.step3_buyer.openForDispute=The BTC seller has not confirmed your payment! The max. period for the trade has elapsed. You can wait longer and give the trading peer more time or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=Votre partenaire de trading a confirmé qu''il a initié le paiement {0}.\n
portfolio.pending.step3_seller.altcoin.explorer=Sur votre explorateur blockchain {0} favori
portfolio.pending.step3_seller.altcoin.wallet=Dans votre portefeuille {0}
portfolio.pending.step3_seller.altcoin={0}Veuillez s''il vous plaît vérifier {1} que la transaction vers votre adresse de réception\n{2}\ndispose de suffisamment de confirmations sur la blockchain.\nLe montant du paiement doit être {3}\n\nVous pouvez copier & coller votre adresse {4} à partir de l''écran principal après avoir fermé ce popup.
portfolio.pending.step3_seller.postal={0}Veuillez s''il vous plaît vérifier si vous avez reçu {1} avec \"US Postal Money Order\" de la part de l''acheteur de BTC.\n\nL''ID de la transaction (\"reason for payment\" text) de la transaction est: \"{2}\"
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=Votre partenaire de trading a confirmé qu''il a initié le paiement {0}.\n\nVeuillez vous rendre sur le site internet de votre banque afin de vérifier si vous avez bien reçu les documents suivants {1} de la part de votre acheteur de BTC.\n\nLe trade ID (\"reason for payment\" text) de la transaction est: \"{2}\"\n\n
portfolio.pending.step3_seller.cash=Du fait que le paiement est réalisé via Cash Deposit l''acheteur de BTC doit inscrire \"NO REFUND\" sur le reçu papier, le déchirer en 2 et vous envoyer une photo par email.\n\nPour éviter un risque de rétrofacturation, ne confirmez que si vous recevez le mail et que vous êtes sûr que le reçu papier est valide.\nSi vous n''êtes pas sûr, {0}
portfolio.pending.step3_seller.moneyGram=L'acheteur doit vous envoyer le numéro d'autorisation et une photo du reçu par e-mail .\nLe reçu doit faire clairement figurer votre nom complet, votre pays, l'état et le montant. Veuillez s'il vous plaît vérifier que vous avez bien reçu par e-mail le numéro d'autorisation.\n\nAprès avoir fermé ce popup vous verrez le nom de l'acheteur de BTC et l'adresse où retirer l'argent depuis MoneyGram.\n\nN'accusez réception qu'après avoir retiré l'argent avec succès!
portfolio.pending.step3_seller.westernUnion=L'acheteur doit vous envoyer le MTCN (numéro de suivi) et une photo du reçu par e-mail .\nLe reçu doit faire clairement figurer votre nom complet, votre pays, l'état et le montant. Veuillez s'il vous plaît vérifier si vous avez reçu par e-mail le MTCN.\n\nAprès avoir fermé ce popup vous verrez le nom de l'acheteur de BTC et l'adresse où retirer l'argent depuis Western Union.\n\nN'accusez réception qu'après avoir retiré l'argent avec succès!
portfolio.pending.step3_seller.halCash=L'acheteur doit vous envoyer le code HalCash par message texte SMS. Par ailleurs, vous recevrez un message de la part d'HalCash avec les informations nécessaires pour retirer les EUR depuis un DAB Bancaire supportant HalCash.\n\nAprès avoir retiré l'argent au DAB, veuillez confirmer ici la réception du paiement !
-portfolio.pending.step3_seller.bankCheck=\n\nVérifiez aussi s''il vous plaît que le nom de l''émetteur sur votre récapitulatif bancaire correspond à celui du contrat de la transaction:\nNom de l''émetteur: {0}\n\nSi le nom n''est pas le même que celui indiqué ici, {1}
-portfolio.pending.step3_seller.openDispute=s'il vous plaît, ne confirmez pas mais ouvrez un litige en entrant \"alt + o\" ou \"option + o\".
+portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1}
+portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=Confirmer la réception du paiement
portfolio.pending.step3_seller.amountToReceive=Montant à recevoir
portfolio.pending.step3_seller.yourAddress=Votre adresse {0}
@@ -617,17 +650,18 @@ portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Vérifiez la présenc
portfolio.pending.step3_seller.buyerStartedPayment.fiat=Vérifiez sur votre compte de trading (par ex. compte bancaire) et confirmez quand vous avez reçu le paiement.
portfolio.pending.step3_seller.warn.part1a=sur la {0} blockchain
portfolio.pending.step3_seller.warn.part1b=Auprès de votre prestataire de paiement (par ex. banque)
-portfolio.pending.step3_seller.warn.part2=Vous n''avez toujours pas accusé réception du paiement!\nVeuillez vérifier {0} si vous avez reçu le paiement.\nSi vous n''accusez pas réception avant {1} la transaction fera l''objet d''une enquête par l''arbitre.
-portfolio.pending.step3_seller.openForDispute=Vous n'avez pas accusé réception du paiement!\nLe temps maximal alloué pour la transaction est écoulé.\nVeuillez s'il vous plaît confirmer ou contacter l'arbitre pour ouvrir une dispute.
+portfolio.pending.step3_seller.warn.part2=You still have not confirmed the receipt of the payment. Please check {0} if you have received the payment.
+portfolio.pending.step3_seller.openForDispute=You have not confirmed the receipt of the payment!\nThe max. period for the trade has elapsed.\nPlease confirm or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=Avez-vous reçu le paiement {0} de votre partenaire de trading?\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=Le trade ID (\"reason for payment\" text) de la transaction est: \"{0}\"\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=Veuillez également vérifier que le nom de l''expéditeur sur votre relevé bancaire correspond à celui du contrat de trade :\nNom de l''expéditeur: {0}\n\nSi le nom n''est pas le même que celui affiché ici, veuillez ne pas confirmer mais ouvrir un litige en entrant \"alt + o\" or \"option + o\".\n\n
-portfolio.pending.step3_seller.onPaymentReceived.note=Veuillez noter que dès que vous aurez confirmé la réception, le montant verrouillé de la transaction sera remis à l'acheteur BTC et le dépôt de garantie vous sera remboursé.
+portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Please note, that as soon you have confirmed the receipt, the locked trade amount will be released to the BTC buyer and the security deposit will be refunded.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Confirmez que vous avez bien reçu le paiement
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Oui, j'ai reçu le paiement
+portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANT: By confirming receipt of payment, you are also verifying the account of the counterparty and signing it accordingly. Since the account of the counterparty hasn't been signed yet, you should delay confirmation of the payment as long as possible to reduce the risk of a chargeback.
portfolio.pending.step5_buyer.groupTitle=Résumé de l'opération réalisée
portfolio.pending.step5_buyer.tradeFee=Frais de transaction
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=Total des frais de minage
portfolio.pending.step5_buyer.refunded=Dépôt de garantie remboursé
portfolio.pending.step5_buyer.withdrawBTC=Retirer vos Bitcoins
portfolio.pending.step5_buyer.amount=Montant à retirer
+portfolio.pending.step5_buyer.signer=By withdrawing your bitcoins, you verify that the counterparty has acted according to the trade protocol.
portfolio.pending.step5_buyer.withdrawToAddress=Retirer vers l'adresse
portfolio.pending.step5_buyer.moveToBisqWallet=Transférer les fonds vers le portefeuille bisq
portfolio.pending.step5_buyer.withdrawExternal=Retrait vers un portefeuille externe
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=Après la première confirmation de la blockch
portfolio.pending.tradePeriodWarning=Si le délai est dépassé, l'es deux participants du trade peuvent ouvrir un litige.
portfolio.pending.tradeNotCompleted=Trade inachevé dans le temps imparti (jusqu''à {0})
portfolio.pending.tradeProcess=Processus de transaction
-portfolio.pending.openAgainDispute.msg=Si vous n'êtes pas certain que le message adressé à l'arbitre soit arrivé (par exemple si vous n'avez pas reçu de réponse après 1 journée) n'hésitez pas à ouvrir à nouveau un litige.
+portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community.
portfolio.pending.openAgainDispute.button=Ouvrir à nouveau le litige
portfolio.pending.openSupportTicket.headline=Ouvrir un ticket d'assistance
-portfolio.pending.openSupportTicket.msg=S'il vous plaît utilisez ceci seulement en cas d'urgence si vous ne pouvez pas afficher le bouton \"Open support\" or \"Ouvrir un litige\.\n\nLorsque vous ouvrez un ticket de support, la transaction est interrompue et traitée par l'arbitre.
+portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator.
+
+portfolio.pending.timeLockNotOver=You have to wait until ≈{0} ({1} more blocks) before you can open an arbitration dispute.
+
portfolio.pending.notification=Notification
-portfolio.pending.openDispute=Déclencher un litige
-portfolio.pending.arbitrationRequested=Litige ouvert
+
+portfolio.pending.support.headline.getHelp=Need help?
+portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator.
+portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator.
+portfolio.pending.support.button.getHelp=Get support
+portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket?
+portfolio.pending.support.popup.button=Ouvrir un ticket d'assistance
+portfolio.pending.support.headline.halfPeriodOver=Check payment
+portfolio.pending.support.headline.periodOver=La période d'échange été terminé
+
+portfolio.pending.mediationRequested=Mediation requested
+portfolio.pending.refundRequested=Refund requested
portfolio.pending.openSupport=Ouvrir un ticket d'assistance
portfolio.pending.supportTicketOpened=Ticket d'assistance ouvert
portfolio.pending.requestSupport=Demander de l'aide
-portfolio.pending.error.requestSupport=Veuillez signaler le problème à votre arbitre.\n\nIl transmettra l'information aux développeurs pour enquêter sur le problème.\nUne fois le problème analysé, vous récupérerez tous les fonds bloqués.
+portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds.
portfolio.pending.communicateWithArbitrator=Veuillez communiquer avec l'arbitre depuis l'écran "Support".
+portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator.
portfolio.pending.supportTicketOpenedMyUser=Vous avez déjà ouvert un ticket d''assistance.\n{0}
portfolio.pending.disputeOpenedMyUser=Vous avez déjà ouvert un litige.\n{0}
portfolio.pending.disputeOpenedByPeer=Votre pair de trading à ouvert un litige\n{0}
portfolio.pending.supportTicketOpenedByPeer=Votre pair de trading a ouvert un ticket d’assistance.\n{0}
portfolio.pending.noReceiverAddressDefined=Aucune adresse de destinataire définie
-portfolio.pending.removeFailedTrade=Si l'arbitre ne peut clore la transaction, vous pouvez vous-même la déplacer vers l'onglet correspondant aux transactions échouées\nVoulez-vous supprimer cette transaction échouée de l'onglet correspondant aux transactions en attente ?
+portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade?
+
+portfolio.pending.mediationResult.headline=Suggested payout from mediation
+portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout.
+portfolio.pending.mediationResult.info.selfAccepted=You have accepted the mediator's suggestion. Waiting for peer to accept as well.
+portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted the mediator's suggestion. Do you accept as well?
+portfolio.pending.mediationResult.button=View proposed resolution
+portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0}
+portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0}
+portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=Terminé
-portfolio.closed.ticketClosed=Ticket clôturé
+portfolio.closed.ticketClosed=Arbitrated
+portfolio.closed.mediationTicketClosed=Mediated
portfolio.closed.canceled=Annulé
portfolio.failed.Failed=Echec
@@ -745,6 +807,9 @@ funds.tx.multiSigDeposit=Dépôt multisig: {0}
funds.tx.multiSigPayout=Versement Multisig: {0}
funds.tx.disputePayout=Versement du litige: {0}
funds.tx.disputeLost=Cas de litige perdu: {0}
+funds.tx.collateralForRefund=Refund collateral: {0}
+funds.tx.timeLockedPayoutTx=Time locked payout tx: {0}
+funds.tx.refund=Refund from arbitration: {0}
funds.tx.unknown=Raison inconnue: {0}
funds.tx.noFundsFromDispute=Aucun remboursement en cas de litige
funds.tx.receivedFunds=Fonds reçus
@@ -765,14 +830,15 @@ funds.tx.dustAttackTx.popup=Cette transaction va envoyer un faible montant en BT
# Support
####################################################################
-support.tab.mediation.support=Tickets d'assistance
-support.tab.ArbitratorsSupportTickets=Tickets de support de l'arbitre
-support.tab.TradersSupportTickets=Tickets de support du trader
+support.tab.mediation.support=Mediation
+support.tab.arbitration.support=Arbitration
+support.tab.legacyArbitration.support=Legacy Arbitration
+support.tab.ArbitratorsSupportTickets={0}'s tickets
support.filter=Liste de filtre
support.filter.prompt=Saisissez l'ID du trade, la date, l'adresse "onion" ou les données du compte.
support.noTickets=Il n'y a pas de tickets ouverts
support.sendingMessage=Envoi du message...
-support.receiverNotOnline=Le destinataire n'est pas en ligne. Le message est sauvegardé dans sa boîte mail.
+support.receiverNotOnline=Receiver is not online. Message is saved to their mailbox.
support.sendMessageError=Échec de l''envoi du message. Erreur: {0}
support.wrongVersion=L''ordre relatif au litige en question a été créé avec une ancienne version de Bisq.\nVous ne pouvez pas clore ce litige avec votre version de l''application.\n\nVeuillez utiliser une version plus ancienne avec la version du protocole {0}
support.openFile=Ouvrir le fichier à joindre (taille max. du fichier : {0} kb)
@@ -782,7 +848,7 @@ support.attachment=Pièces jointes
support.tooManyAttachments=Vous ne pouvez envoyer plus de 3 pièces jointes dans un message.
support.save=Sauvegarder le fichier sur le disque
support.messages=Messages
-support.input.prompt=Veuillez saisir ici votre message à l'arbitre
+support.input.prompt=Enter message...
support.send=Envoyer
support.addAttachments=Ajouter des pièces jointes
support.closeTicket=Fermer le ticket
@@ -801,14 +867,18 @@ support.buyerOfferer=Acheteur BTC/Maker
support.sellerOfferer=Vendeur BTC/Maker
support.buyerTaker=Acheteur BTC/Taker
support.sellerTaker=Vendeur BTC/Taker
-support.backgroundInfo=Bisq n'est pas une entreprise, nous traitons donc les litiges différemment.\n\nEn cas de désaccords pendant le processus de l'échange (par exemple, un trader ne suivant pas le protocole d'échange) l'application affichera un bouton \"Ouvrir un litige\" une fois que la période d'échange terminée pour contacter l'arbitre.\n\nEn cas de problème avec l'application, le logiciel essaiera de le détecter et, si possible, affichera un bouton \"Ouvrir un ticket de support\" pour contacter l'arbitre qui transmettra le problème aux développeurs.\n\nSi vous rencontrez un problème et que nous ne pouvez pas voir le bouton \"Ouvrir un ticket de support", ouvrez un ticket de support manuellement en sélectionnant le trade causant des difficultés sous \"Portfolio/Échanges en cours" et en appuyant sur \"Alt + o\" ou \"Option + o\". Veuillez utiliser cette méthode uniquement si vous êtes certain que le logiciel ne fonctionne pas comme prévu. Si vous rencontrez des problèmes ou si vous avez des questions, veuillez consulter le FAQ sur la page web de bisq.network ou poster votre question sur le forum Bisq dans la section Support.
-support.initialInfo=Veuillez décrire votre problème dans le champ de texte ci-dessous. Ajoutez autant d'information que possible pour accélérer le règlement du litige.\nVoici une check list des informations que vous devez fournir :\n\t● Si vous êtes l'acheteur de BTC : Avez-vous fait le transfert en Fiat ou en Altcoin ? Si oui, avez-vous cliqué sur le bouton 'paiement commencé' dans l'application ?\n\t● Si vous êtes le vendeur de BTC : Avez-vous reçu le paiement en Fiat ou en Altcoin ? Si oui, avez-vous cliqué sur le bouton " paiement reçu " dans l`application ?\n\t● Quelle version de Bisq utilisez-vous?\n\t● Quel système d'exploitation utilisez-vous ?\n\t● Si vous rencontrez un problème avec des transactions qui échouent, veuillez envisager de changer de répertoire de données.\n\t Parfois, le répertoire de données est corrompu et conduit à des bugs étranges. \n\t Voir: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nVeuillez vous familiariser avec les règles de base du processus de règlement des litiges:\n\t● Vous devez répondre aux demandes de l'arbitre dans les 2 jours.\n\t● Le délai maximum pour un litige est de 14 jours.\n\t● Vous devez coopérer avec l'arbitre et lui fournir les renseignements qu'il demande pour faire valoir votre cause.\n\t● Vous avez accepté les règles énoncées dans le document de litige et dans le contrat d'utilisation lorsque vous avez lancé l'application pour la première fois.\n\nPour en savoir plus sur le processus de règlement des litiges, consultez: https://bisq.network/docs/exchange/arbitration-system
+support.backgroundInfo=Bisq is not a company, so it handles disputes differently.\n\nTraders can communicate within the application via a secure chat on the open trades screen to attempt solving a dispute on their own. If that is not sufficient, a mediator can step in to help. The mediator will evaluate the situation and give a recommendation for the payout of the trade funds. If both traders accept this suggestion, the payout transaction is completed and the trade is closed. If one or both traders do not agree to the mediator's recommended payout, they can request arbitration.The arbitrator has the third key of the deposit transaction and will make the payout based on their findings.
+support.initialInfo=Please enter a description of your problem in the text field below. Add as much information as possible to speed up dispute resolution time.\n\nHere is a check list for information you should provide:\n\t● If you are the BTC buyer: Did you make the Fiat or Altcoin transfer? If so, did you click the 'payment started' button in the application?\n\t● If you are the BTC seller: Did you receive the Fiat or Altcoin payment? If so, did you click the 'payment received' button in the application?\n\t● Which version of Bisq are you using?\n\t● Which operating system are you using?\n\t● If you encountered an issue with failed transactions please consider switching to a new data directory.\n\t Sometimes the data directory gets corrupted and leads to strange bugs. \n\t See: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPlease make yourself familiar with the basic rules for the dispute process:\n\t● You need to respond to the {0}''s requests within 2 days.\n\t● Mediators respond in between 2 days. Arbitrators respond in between 5 business days.\n\t● The maximum period for a dispute is 14 days.\n\t● You need to cooperate with the {1} and provide the information they request to make your case.\n\t● You accepted the rules outlined in the dispute document in the user agreement when you first started the application.\n\nYou can read more about the dispute process at: {2}
support.systemMsg=Message du système: {0}
support.youOpenedTicket=Vous avez ouvert une demande de support.\n\n{0}\n\nBisq version: {1}
support.youOpenedDispute=Vous avez ouvert une demande de litige.\n\n{0}\n\nBisq version: {1}
-support.peerOpenedTicket=Votre pair de trading a demandé de l''aide en raison de problèmes techniques.\n\n{0}
-support.peerOpenedDispute=Votre pair de trading a ouvert un litige.\n{0}
+support.youOpenedDisputeForMediation=You requested mediation.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedTicket=Your trading peer has requested support due to technical problems.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDispute=Your trading peer has requested a dispute.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDisputeForMediation=Your trading peer has requested mediation.\n\n{0}\n\nBisq version: {1}
+support.mediatorsDisputeSummary=System message:\nMediator''s dispute summary:\n{0}
+support.mediatorsAddress=Mediator''s node address: {0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=Ajouter un altcoin
setting.preferences.displayOptions=Afficher les options
setting.preferences.showOwnOffers=Montrer mes ordres dans le livre des ordres
setting.preferences.useAnimations=Utiliser des animations
+setting.preferences.useDarkMode=Use dark mode (beta)
setting.preferences.sortWithNumOffers=Trier les listes de marché avec le nombre d'ordres/de transactions
setting.preferences.resetAllFlags=Réinitialiser toutes les balises de notification \"Don't show again\"
setting.preferences.reset=Réinitialiser
@@ -852,7 +923,7 @@ settings.preferences.selectCurrencyNetwork=Sélectionner un réseau
setting.preferences.daoOptions=Options DAO
setting.preferences.dao.resync.label=Reconstituer l'état de la DAO à partir du tx genesis
setting.preferences.dao.resync.button=Resynchronisation
-setting.preferences.dao.resync.popup=Après un redémarrage de l'application, les données de gouvernance du réseau P2P seront retransmises à partir des seed nodes et l'état de consensus BSQ sera rétabli depuis la transaction genesis.
+setting.preferences.dao.resync.popup=After an application restart the Bisq 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=Exécuter la DAO de Bisq en tant que full node
setting.preferences.dao.rpcUser=Nom d'utilisateur RPC
setting.preferences.dao.rpcPw=Mot de passe RPC
@@ -862,7 +933,7 @@ setting.preferences.dao.fullNodeInfo.ok=Ouvrir la page des docs
setting.preferences.dao.fullNodeInfo.cancel=Non, je m'en tiens au mode lite node
settings.net.btcHeader=Réseau Bitcoin
-settings.net.p2pHeader=Réseau P2P
+settings.net.p2pHeader=Bisq network
settings.net.onionAddressLabel=Mon adresse onion
settings.net.btcNodesLabel=Utiliser des nœuds Bitcoin Core personnalisés
settings.net.bitcoinPeersLabel=Pairs connectés
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=Reçu
settings.net.peerTypeColumn=type de pair
settings.net.openTorSettingsButton=Ouvrez les paramètres de Tor
+settings.net.versionColumn=Version
+settings.net.subVersionColumn=Subversion
+settings.net.heightColumn=Height
+
settings.net.needRestart=Vous devez redémarrer l'application pour appliquer cette modification.\nVous voulez faire cela maintenant?
settings.net.notKnownYet=Pas encore connu...
settings.net.sentReceived=Envoyé: {0}, reçu: {1}
@@ -928,9 +1003,11 @@ setting.about.subsystems.val=Version du réseau: {0}; version des messages P2P:
####################################################################
account.tab.arbitratorRegistration=Enregistrement de l'arbitre
+account.tab.mediatorRegistration=Mediator registration
+account.tab.refundAgentRegistration=Refund agent registration
account.tab.account=Compte
account.info.headline=Bienvenue sur votre compte Bisq
-account.info.msg=Ici, vous pouvez ajouter des comptes de trading en devises nationales et en altcoins, sélectionner des arbitres, et créer une sauvegarde de votre portefeuille ainsi que des données de votre compte.\n\nUn nouveau portefeuille Bitcoin a été créé un premier lancement de Bisq.\n\nNous vous recommandons vivement d'écrire les mots-clés de votre seed Bitcoin (voir l'onglet en haut) et d'envisager d'ajouter un mot de passe avant le transfert de fonds. Les dépôts et retraits de Bitcoin sont gérés dans la section \"Fonds\".\n\nConfidentialité et sécurité : Bisq étant une plateforme d'échange décentralisée, toutes vos données sont conservées sur votre ordinateur. Il n'y a pas de serveurs, nous n'avons donc pas accès à vos informations personnelles, à vos fonds ou même à votre adresse IP. Les données telles que les numéros de compte bancaire, les adresses altcoin & Bitcoin, etc. ne sont partagées avec votre partenaire de trading que pour effectuer les transactions que vous initiez (en cas de litige, l'arbitre verra les mêmes données que votre pair de trading).
+account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer).
account.menu.paymentAccount=Comptes en devise nationale
account.menu.altCoinsAccountView=Compte Altcoins
@@ -939,42 +1016,39 @@ account.menu.seedWords=Seed du portefeuille
account.menu.backup=Sauvegarde
account.menu.notifications=Notifications
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=Clé publique
-account.arbitratorRegistration.register=Enregistrer l'arbitre
-account.arbitratorRegistration.revoke=Révoquer l'inscription
-account.arbitratorRegistration.info.msg=Veuillez noter que vous devez rester disponible pendant 15 jours après la révocation, car il se peut que certaines opérations fassent appel à vous comme arbitre. La période d'échange maximale permise est de 8 jours et la procédure de contestation peut prendre jusqu'à 7 jours.
+account.arbitratorRegistration.register=Register
+account.arbitratorRegistration.registration={0} registration
+account.arbitratorRegistration.revoke=Révoquer
+account.arbitratorRegistration.info.msg=Please note that you need to stay available for 15 days after revoking as there might be trades which are using you as {0}. The max. allowed trade period is 8 days and the dispute process might take up to 7 days.
account.arbitratorRegistration.warn.min1Language=Vous devez définir au moins 1 langue.\nNous avons ajouté la langue par défaut pour vous.
-account.arbitratorRegistration.removedSuccess=Vous avez bien retiré votre arbitre du réseau P2P.
-account.arbitratorRegistration.removedFailed=N''a pas pu supprimer l''arbitre.{0}
-account.arbitratorRegistration.registerSuccess=Vous avez enregistré avec succès votre arbitre sur le réseau P2P.
-account.arbitratorRegistration.registerFailed=N''a pas pu enregistrer l''arbitre.{0}
-
-account.arbitratorSelection.minOneArbitratorRequired=Vous devez définir au moins 1 langue.\nNous avons ajouté la langue par défaut pour vous.
-account.arbitratorSelection.whichLanguages=Quelles langues parlez-vous?
-account.arbitratorSelection.whichDoYouAccept=Quels sont les arbitres que vous acceptez ?
-account.arbitratorSelection.autoSelect=Sélectionner automatiquement tous les arbitres avec la langue correspondante
-account.arbitratorSelection.regDate=Date d'inscription
-account.arbitratorSelection.languages=Langues
-account.arbitratorSelection.cannotSelectHimself=Un arbitre ne peut pas se choisir lui-même pour le trading.
-account.arbitratorSelection.noMatchingLang=Pas de langue correspondante.
-account.arbitratorSelection.noLang=Vous ne pouvez choisir que des arbitres qui parlent au moins 1 langue que vous connaissez.
-account.arbitratorSelection.minOne=Vous devez avoir au moins désigné un arbitre.
+account.arbitratorRegistration.removedSuccess=You have successfully removed your registration from the Bisq network.
+account.arbitratorRegistration.removedFailed=Could not remove registration.{0}
+account.arbitratorRegistration.registerSuccess=You have successfully registered to the Bisq network.
+account.arbitratorRegistration.registerFailed=Could not complete registration.{0}
account.altcoin.yourAltcoinAccounts=Vos comptes altcoin
-account.altcoin.popup.wallet.msg=Veuillez vous assurer que vous respectez les exigences relatives à l''utilisation des {0} portefeuilles, telles qu''elles sont décrites sur la page {1} du site Web.\nL''utilisation des portefeuilles provenant de plateformes de trading centralisées où (a) vous ne contrôlez pas vos clés ou (b) qui ne disposent pas d''un portefeuille compatible est risquée : cela peut entraîner la perte des fonds échangés!\nL''arbitre n''est pas un spécialiste {2} et ne pourra pas intervenir dans de ce cas.
+account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases.
account.altcoin.popup.wallet.confirm=Je comprends et confirme que je sais quel portefeuille je dois utiliser.
-account.altcoin.popup.arq.msg=Le fait d'échanger des ARQ sur Bisq exige que vous compreniez et remplissiez les exigences suivantes:\n\nPour envoyer des ARQ, vous devez utiliser soit le portefeuille officiel ArQmA GUI soit le portefeuille ArQmA CLI avec le drapeau store-tx-info activé (par défaut dans les nouvelles versions). Veuillez vous assurer que vous pouvez accéder à la tx key car cela pourrait être nécessaire en cas de litige.\narqma-wallet-cli (utiliser la commande get_tx_key)\narqma-wallet-gui (allez à dans l'onglet Historique et cliquez sur le bouton (P) pour accéder à la preuve de paiement)\n\nAvec le mode normal de l'explorateur de bloc le transfert n'est pas vérifiable.\n\nVous devez fournir à l'arbitre les données suivantes en cas de litige:\n- Le tx de la clé privée\n- Le hash de la transaction\n- L'adresse publique du destinataire\n\nSi vous manquez de communiquer les données ci-dessus ou si vous utilisez un portefeuille incompatible, le litige sera rejeté. L'expéditeur des ARQ est responsable de la transmission à l'arbitre de la vérification du transfert ces informations en cas de litige.\n\nIl n'est pas nécessaire de fournir l' ID de paiement, seulement l'adresse publique normale.\nSi vous n'êtes pas sûr au sujet de cette opération, visitez le canal discord ArQmA (https://discord.gg/s9BQpJT) ou le forum ArQmA (https://labs.arqma.com) pour en savoir plus.
-account.altcoin.popup.xmr.msg=Le trading de XMR sur Bisq nécessite que vous compreniez et remplissiez les conditions suivantes :\n\nPour envoyer des XMR, vous devez utiliser le portefeuille officiel de l'interface graphique Monero ou le portefeuille Monero CLI avec le drapeau store-tx-info activé (par défaut dans les nouvelles versions). Veuillez vous assurer que vous pouvez accéder à la clé tx car cela pourrait être nécessaire en cas de litige.\nmonero-wallet-cli (utiliser la commande get_tx_key)\nmonero-wallet-gui (aller dans l'onglet historique et cliquez sur le bouton (P) pour voir la preuve de paiement)\n\nEn plus de l'outil XMR checktx (https://xmr.llcoins.net/checktx.html), la vérification peut également être effectuée dans le portefeuille.\nmonero-wallet-cli : en utilisant la commande (check_tx_key).\nmonero-wallet-gui : sur la page Avancé > Prove/Check page.\nAvec les explorateurs de blocs classiques, le transfert n'est pas vérifiable.\n\nVous devez fournir à l'arbitre les données suivantes en cas de litige :\n- Le tx de clé privée \n- Le hach de la transaction\n- L'adresse publique du destinataire\n\nSi vous ne fournissez pas les données ci-dessus ou si vous utilisez un portefeuille incompatible, vous perdrez le litige. L'expéditeur XMR est responsable de la vérification du transfert des XMR à l'arbitre en cas de litige.\n\nIl n'est pas nécessaire de fournir l'ID de paiement, seulement l'adresse publique normale.\nSi vous n'êtes pas sûr de ce processus, visitez le site (https://www.getmonero.org/resources/user-guides/prove-payment.html) ou le forum Monero (https://forum.getmonero.org) pour obtenir de plus amples renseignements.
-account.altcoin.popup.blur.msg=Le trading de BLUR on Bisq nécessite que vous compreniez et remplissiez les conditions suivantes:\n\nPour envoyer des BLUR vous devez utiliser le réseau Blur CLI ou un porfefeuile GUI. \n\nSi vous utilisez le portefeuille CLI, un hash de transaction (tx ID) sera affiché après que le transfert sera effectué. Vous devez sauvegarder ces informations. Immédiatement après l'envoi du transfert, vous devez utiliser la command 'get_tx_key' pour récupérer la clé privée de la transaction. Si vous ne procédez pas à cette étape, il se peut que vous ne puissiez pas récupérer la clé ultérieurement. \n\nSi vous utilisez le réseau Blur GUI Wallet, la clé privée de transaction et l'ID de transaction se trouvent facilement dans l'onglet "Historique". Immédiatement après l'envoi, localisez la transaction qui vous intéresse. Cliquez sur le symbole " ? " dans le coin inférieur droit de la boîte contenant la transaction. Vous devez sauvegarder ces informations. \n\nSi un arbitrage est nécessaire, vous devrez présenter les informations suivantes à un arbitre : 1) l'ID de la transaction, 2) la clé privée de la transaction et 3) l'adresse du destinataire. L'arbitre vérifiera ensuite le transfert BLUR à l'aide du vérificateur de transactions Blur (https://blur.cash/#tx-viewer).\n\nSi vous omettez de fournir les renseignements requis par l'arbitre, votre différend sera rejeté. Dans tous les cas de litige, l'expéditeur des BLUR assume 100 % de la responsabilité de la vérification des transactions par un arbitre. \n\nSi vous ne comprenez pas ces conditions, ne tradez pas Bisq. Tout d'abord, demandez de l'aide sur le Discord Blur Network (https://discord.gg/dMWaqVW).
-account.altcoin.popup.cash2.msg=Le trading de CASH2 sur Bisq nécessite que vous compreniez et remplissiez les conditions suivantes :\n\nPour envoyer des CASH2, vous devez utiliser le portefeuille Cash2 version 3 ou supérieur.\n\nAprès l'envoi d'une transaction, l'ID de transaction s'affiche. Vous devez sauvegarder ces informations. Immédiatement après l'envoi de la transaction, vous devez utiliser la commande 'getTxKey' en simplewallet pour récupérer la clé secrète de la transaction.\n\nDans le cas où un arbitrage est nécessaire, vous devez présenter les éléments suivants à un arbitre : 1) l'ID de transaction, 2) la clé secrète de transaction et 3) l'adresse Cash2 du destinataire. L'arbitre vérifiera ensuite le transfert de CASH2 à l'aide du Cash2 Block Explorer (https://blocks.cash2.org).\n\nSi vous omettez de fournir les renseignements requis par l'arbitre, votre différend sera rejeté. Dans tous les cas de litige, l'expéditeur de CASH2 supporte 100% de la responsabilité de la vérification des transactions par un arbitre.\n\nSi vous ne comprenez pas ces exigences, ne tradez pas sur Bisq. Tout d'abord, demandez de l'aide sur le Discord de Cash2 (https://discord.gg/FGfXAYN).
-account.altcoin.popup.qwertycoin.msg=Le trading de Qwertycoin sur Bisq nécessite que vous compreniez et remplissiez les conditions suivantes :\n\nPour envoyer des QWC, vous devez utiliser la version 5.1.3 ou une version plus récente du portefeuille officiel de QWC.\n\nAprès l'envoi d'une transaction, l'ID de transaction s'affiche. Vous devez sauvegarder ces informations. Immédiatement après l'envoi de la transaction, vous devez utiliser la commande 'get_Tx_Key' dans simplewallet pour récupérer la clé secrète de la transaction.\n\nSi un arbitrage est nécessaire, vous devez présenter les éléments suivants à un arbitre : 1) l'ID de transaction, 2) la clé secrète de transaction et 3) l'adresse QWC du destinataire. L'arbitre vérifiera ensuite le transfert à l'aide du QWC Block Explorer (https://explorer.qwertycoin.org).\n\nLe fait de ne pas fournir les renseignements requis par l'arbitre entraînera la perte du litige. Dans tous les cas de litige, l'expéditeur des QWC assume 100 % de la responsabilité de la vérification des transactions par un arbitre.\n\nSi vous ne comprenez pas ces exigences, ne tradez pas sur Bisq. Dans un premier temps, demandez de l'aide sur le Discord de QWC (https://discord.gg/rUkfnpC).
-account.altcoin.popup.drgl.msg=Le trading de Dragonglass sur Bisq nécessite que vous compreniez et remplissiez les conditions suivantes :\n\nEn raison de la confidentialité offerte par Dragonglass, une transaction n'est pas vérifiable sur la blockchain publique. Si nécessaire, vous pouvez prouver votre paiement à l'aide de votre clé privée TXN.\nLa clé privée TXN est une clé unique générée automatiquement à chaque transaction et accessible uniquement à partir de votre portefeuille DRGL.\nSoit par l'interface graphique du portefeuille DRGL (dans la boîte de dialogue et de détails des transactions), soit grâce CLI simplewallet de Dragonglass (avec la commande "get_tx_key").\n\nla version DRGL 'Oathkeeper' et les versions supérieures sont REQUISES pour les deux.\n\nEn cas de litige, vous devez fournir à l'arbitre les données suivantes :\n- La clé privée TXN\n- Le hash de la transaction\n- L'adresse publique du destinataire\n\nLa vérification du paiement peut être effectuée en utilisant les données ci-dessus en saisie (http://drgl.info/#check_txn).\n\nSi vous ne fournissez pas les données ci-dessus ou si vous utilisez un portefeuille incompatible, vous perdrez le litige. L'expéditeur des Dragonglass est responsable de la vérification du transfert des DRGL par un arbitre en cas de litige. L' utilisation du PaymentID n'est pas nécessaire.\n\nSi vous êtes dans l'incertitude en ce qui concerne une partie de ce processus, visitez le Discord Dragonglass (http://discord.drgl.info) pour obtenir de l'aide.
-account.altcoin.popup.ZEC.msg=Lorsque vous utilisez Zcash, vous ne pouvez utiliser que les adresses transparentes (commençant par t) et non les adresses z (privées), car l'arbitre ne peut vérifier la transaction avec les adresses z.
-account.altcoin.popup.XZC.msg=Lorsque vous utilisez Zcoin, vous ne pouvez utiliser que les adresses transparentes (traçables) et non les adresses non traçables, car l'arbitre ne serait pas en mesure de vérifier la transaction avec des adresses non traçables dans un explorateur de blocs.
+account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information.
+account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information.
+account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending XMR, you need to use either the official Monero GUI wallet or Monero CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nmonero-wallet-cli (use the command get_tx_key)\nmonero-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nIn addition to XMR checktx tool (https://xmr.llcoins.net/checktx.html) verification can also be accomplished in-wallet.\nmonero-wallet-cli : using command (check_tx_key).\nmonero-wallet-gui : on the Advanced > Prove/Check page.\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The XMR sender is responsible for providing verification of the XMR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit (https://www.getmonero.org/resources/user-guides/prove-payment.html) or the Monero forum (https://forum.getmonero.org) to find more information.
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs).
+account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW).
+account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/).
+account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN).
+account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC).
+account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help.
+account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses.
+account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer.
account.altcoin.popup.grin.msg=GRIN nécessite un échange interactif entre l'émetteur et le récepteur pour créer la transaction. Assurez-vous de suivre les instructions de la page Web du projet GRIN pour envoyer et recevoir des GRIN de façon fiable (le récepteur doit être en ligne au moins pendant un certain temps).\n\nBisq ne supporte que le portefeuille Grinbox (Wallet713) format URL.\n\nL'expéditeur des GRIN doit fournir la preuve qu'il a envoyé les GRIN avec succès. Si le portefeuille ne peut pas fournir cette preuve, un litige potentiel sera résolu en faveur du destinataire des GRIN. Veuillez vous assurer que vous utilisez le dernier logiciel Grinbox qui supporte la preuve de transaction et que vous comprenez le processus de transfert et de réception des GRIN ainsi que la façon de créer la preuve.\n\nVisitez https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only pour plus d'informations sur l'outil de preuve de Grinbox.
account.altcoin.popup.beam.msg=BEAM nécessite un processus interactif entre l'émetteur et le récepteur pour créer la transaction.\n\nAssurez-vous de suivre les instructions de la page Web du projet BEAM pour envoyer et recevoir les BEAM de façon fiable (le récepteur doit être en ligne pendant au moins un certain temps).\n\nL'expéditeur de BEAM est tenu de fournir la preuve qu'il a envoyé BEAM avec succès. Assurez-vous d'utiliser un portefeuille qui peut produire une telle preuve. Si le portefeuille ne peut fournir la preuve, un litige potentiel sera résolu en faveur du récepteur des BEAM.
-account.altcoin.popup.pars.msg=Le trading de ParsiCoin sur Bisq nécessite que vous compreniez et remplissiez les conditions suivantes :\n\nPour envoyer des PARS , vous devez utiliser la version officielle du portefeuille ParsiCoin 3.0.0 ou une version supérieure.\n\nVous pouvez vérifier le Hash de la transaction et la Transaction Key dans l'onglet transaction de l'interface de votre portefeuille (ParsiPay). Vous devez faire un clic droit sur la transaction, puis cliquer sur Afficher les détails.\n\nSi un arbitrage est nécessaire, vous devez présenter les éléments suivants à celui-ci : 1) le hash de la transaction, 2) la clé de transaction ainsi que 3) l'adresse du destinataire des PARS. L'arbitre vérifiera ensuite le transfert à l'aide du ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nEn cas de manquement à fournir les renseignements requis par l'arbitre entraînera la perte du litige. Dans tous les cas de litige, l'expéditeur des ParsiCoin supporte 100% de la responsabilité de la vérification des transactions par un arbitre.\n\nSi vous ne comprenez pas ces exigences, ne tradez pas sur Bisq. Demandez d'abord sur le Discord de ParsiCoin (https://discord.gg/c7qmFNh).
+account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh).
+
+account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash.
account.fiat.yourFiatAccounts=Vos comptes en devise nationale
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=Bonded role unit factor en BSQ
dao.param.ISSUANCE_LIMIT=Limite d'émission par cycle en BSQ
dao.param.currentValue=Valeur actuelle: {0}
+dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1})
dao.param.blocks={0} blocs
dao.results.cycle.duration.label=Durée de {0}
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} bloc(s)
dao.results.cycle.value.postFix.isDefaultValue=(valeur par défaut)
dao.results.cycle.value.postFix.hasChanged=(a été modifié par le vote)
-dao.results.invalidVotes=Nous avons obtenu des votes invalides au cours de ce cycle de vote. Cela peut arriver si un vote n'a pas été bien distribué sur le réseau P2P.\n{0}
+dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=Indéfini
@@ -1276,7 +1351,7 @@ dao.bond.bondedReputation=Bonded Reputation
dao.bond.bondedRoles=Bonded roles
dao.bond.details.header=Détails du rôle
-dao.bond.details.role=Role
+dao.bond.details.role=Rôle
dao.bond.details.requiredBond=BSQ requis pour le bond
dao.bond.details.unlockTime=Délai de déverrouillage en blocs
dao.bond.details.link=Lien vers la description des rôles
@@ -1439,7 +1514,7 @@ dao.phase.separatedPhaseBar.PROPOSAL=Phase de proposition
# suppress inspection "UnusedProperty"
dao.phase.separatedPhaseBar.BLIND_VOTE=Cacher le vote
# suppress inspection "UnusedProperty"
-dao.phase.separatedPhaseBar.VOTE_REVEAL=Dévoilement le vote
+dao.phase.separatedPhaseBar.VOTE_REVEAL=Dévoilement du vote
# suppress inspection "UnusedProperty"
dao.phase.separatedPhaseBar.RESULT=Résultat du vote
@@ -1503,7 +1578,7 @@ dao.proposal.create.publish=Publier la demande
dao.proposal.create.publishing=La publication de la demande est en cours...
dao.proposal=Demande
dao.proposal.display.type=Type de demande
-dao.proposal.display.name=Nom/speudonyme
+dao.proposal.display.name=Exact GitHub username
dao.proposal.display.link=Lien vers les informations détaillées
dao.proposal.display.link.prompt=Lien vers la proposition
dao.proposal.display.requestedBsq=Montant démandé en BSQ
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=Vote actuel: ''{0}'''. Modifier le vo
dao.proposal.display.myVote.accepted=Accepté
dao.proposal.display.myVote.rejected=Rejeté
dao.proposal.display.myVote.ignored=Ignoré
-dao.proposal.myVote.summary=Voté: {0}; Poids du vote: {1} (gagné: {2} + mise: {3});
+dao.proposal.display.myVote.unCounted=Vote was not included in result
+dao.proposal.myVote.summary=Voted: {0}; Vote weight: {1} (earned: {2} + stake: {3}) {4}
dao.proposal.myVote.invalid=Le vote n'est pas valide
dao.proposal.voteResult.success=Accepté
@@ -1680,6 +1756,7 @@ dao.monitor.daoState.utxoConflicts=conflits UTXO
dao.monitor.daoState.utxoConflicts.blockHeight=Hauteur de bloc: {0}
dao.monitor.daoState.utxoConflicts.sumUtxo=Somme de tous les UTXO: {0} BSQ
dao.monitor.daoState.utxoConflicts.sumBsq=Somme de tous les BSQ: {0} BSQ
+dao.monitor.daoState.checkpoint.popup=DAO state is not in sync with the network. After restart the DAO state will resync.
dao.monitor.proposal.headline=État des propositions
dao.monitor.proposal.table.headline=Etat du hachage de la chaîne de proposition
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=Transactions BSQ
dao.factsAndFigures.dashboard.marketPrice=Données du marché
dao.factsAndFigures.dashboard.price=Prix du dernier Trade BSQ/BTC (en Bisq)
+dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price
+dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price
dao.factsAndFigures.dashboard.marketCap=Capitalisation boursière (basé sur la valeur d'échange)
dao.factsAndFigures.dashboard.availableAmount=BSQ disponible au total
@@ -1769,10 +1848,6 @@ displayUpdateDownloadWindow.download.openDir=Ouvrir le répertoire de téléchar
disputeSummaryWindow.title=Résumé
disputeSummaryWindow.openDate=Date d'ouverture du ticket
disputeSummaryWindow.role=Rôle du trader
-disputeSummaryWindow.evidence=Preuve
-disputeSummaryWindow.evidence.tamperProof=Preuve d'intégrité
-disputeSummaryWindow.evidence.id=Vérification de l'ID
-disputeSummaryWindow.evidence.video=Vidéo/Screencast
disputeSummaryWindow.payout=Versement du montant de l'opération
disputeSummaryWindow.payout.getsTradeAmount=BTC {0} obtient le montant du versement de la transaction
disputeSummaryWindow.payout.getsAll=BTC {0} à reçu l'intégralité
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=Banque
disputeSummaryWindow.summaryNotes=Notes de synthèse
disputeSummaryWindow.addSummaryNotes=Ajouter des notes de synthèse
disputeSummaryWindow.close.button=Fermer le ticket
-disputeSummaryWindow.close.msg=Ticket clos le {0}\n\nRésumé:\n{1} a fourni une preuve inviolable: {2}\n{3} a fait une vérification d''identité: {4}\n{5} a fait un screencast ou une vidéo: {6}\nMontant du versement pour l''acheteur de BTC: {7}\nMontant du versement pour le vendeur de BTC: {8}\n\nNotes de synthèse:\n{9}
+disputeSummaryWindow.close.msg=Ticket closed on {0}\n\nSummary:\nPayout amount for BTC buyer: {1}\nPayout amount for BTC seller: {2}\n\nSummary notes:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\nNext steps:\nOpen ongoing trade and accept or reject the suggested mediation
disputeSummaryWindow.close.closePeer=Vous devez également clore le ticket de trading des pairs!
+disputeSummaryWindow.close.txDetails.headline=Publish refund transaction
+disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction?
emptyWalletWindow.headline={0} Outil de secours du portefeuille
emptyWalletWindow.info=Veuillez utiliser ceci qu'en cas d'urgence si vous ne pouvez pas accéder à vos fonds à partir de l'interface utilisateur.\n\nVeuillez remarquer que touts les ordres en attente seront automatiquement fermés lors de l'utilisation de cet outil.\n\nAvant d'utiliser cet outil, veuillez sauvegarder votre répertoire de données. Vous pouvez le faire sur \"Compte/sauvegarde\".\n\nVeuillez nous signaler votre problème et déposer un rapport de bug sur GitHub ou sur le forum Bisq afin que nous puissions enquêter sur la source du problème.
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=Vous avez des ordres en cours qui seront suppr
emptyWalletWindow.openOffers.yes=Oui, j'en suis certain
emptyWalletWindow.sent.success=Le solde de votre portefeuille a été transféré avec succès.
-enterPrivKeyWindow.headline=Inscription ouverte aux arbitres invités seulement
+enterPrivKeyWindow.headline=Enter private key for registration
filterWindow.headline=Modifier la liste de filtres
filterWindow.offers=Ordres filtrés (séparer avec une virgule)
@@ -1815,6 +1895,8 @@ filterWindow.accounts=Données filtrées du compte de trading:\nFormat: séparer
filterWindow.bannedCurrencies=Codes des devises filtrées (séparer avec une virgule.)
filterWindow.bannedPaymentMethods=IDs des modes de paiements filtrés (séparer avec une virgule.)
filterWindow.arbitrators=Arbitres filtrés (adresses onion séparées par une virgule)
+filterWindow.mediators=Filtered mediators (comma sep. onion addresses)
+filterWindow.refundAgents=Filtered refund agents (comma sep. onion addresses)
filterWindow.seedNode=Nœuds de seed filtrés (adresses onion séparées par une virgule)
filterWindow.priceRelayNode=Nœuds relais avec prix filtrés (adresses onion séparées par une virgule)
filterWindow.btcNode=Nœuds Bitcoin filtrés (adresses séparées par une virgule + port)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(ID/BIC/SWIFT de la banque du maker)
offerDetailsWindow.offerersBankName=(nom de la banque du maker)
offerDetailsWindow.bankId=Identifiant bancaire (par ex. BIC ou SWIFT)
offerDetailsWindow.countryBank=Pays de la banque du Maker
-offerDetailsWindow.acceptedArbitrators=Arbitres acceptés
offerDetailsWindow.commitment=Engagement
offerDetailsWindow.agree=J'accepte
offerDetailsWindow.tac=Conditions d'utilisation
@@ -1883,6 +1964,7 @@ tradeDetailsWindow.tradeDate=Date de l'échange
tradeDetailsWindow.txFee=Frais de minage
tradeDetailsWindow.tradingPeersOnion=Adresse onion du pairs de trading
tradeDetailsWindow.tradeState=État du trade
+tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
walletPasswordWindow.headline=Entrer le mot de passe pour déverouiller
@@ -1945,10 +2027,11 @@ popup.warning.incompatibleDB=Nous avons détecté des fichiers de base de donné
popup.warning.startupFailed.twoInstances=Bisq est déjà lancé. Vous ne pouvez pas lancer deux instances de bisq.
popup.warning.cryptoTestFailed=Il semble que vous utilisez un binaire auto-compilé et que vous n'avez pas suivi les instructions de compilation dans https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nSi ce n'est pas le cas et que vous utilisez le binaire officiel du Bisq, veuillez déposer un rapport de bug sur la page GitHub.\nErreur={0}
popup.warning.tradePeriod.halfReached=Votre transaction avec ID {0} a atteint la moitié de la période de trading maximale autorisée et n''est toujours pas terminée.\n\nLa période de trade se termine le {1}.\n\nVeuillez vérifier l''état de votre transaction dans \"Portfolio/échanges en cours\" pour obtenir de plus amples informations.
-popup.warning.tradePeriod.ended=Votre transaction avec ID {0} a atteint la période de trading maximale autorisée et n''est pas terminée.\n\nLa période de trade s''est terminée le {1}.\n\nVeuillez vérifier votre transaction dans \"Portfolio/échanges en cours\" pour contacter l''arbitre.
+popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
popup.warning.noTradingAccountSetup.headline=Vous n'avez pas configuré de compte de trading
popup.warning.noTradingAccountSetup.msg=Vous devez configurer une devise nationale ou un compte altcoin avant de pouvoir créer un ordre.\nVoulez-vous configurer un compte ?
popup.warning.noArbitratorsAvailable=Les arbitres ne sont pas disponibles.
+popup.warning.noMediatorsAvailable=There are no mediators available.
popup.warning.notFullyConnected=Vous devez attendre d'être complètement connecté au réseau.\nCela peut prendre jusqu'à 2 minutes au démarrage.
popup.warning.notSufficientConnectionsToBtcNetwork=Vous devez attendre d''avoir au minimum {0} connexions au réseau Bitcoin.
popup.warning.downloadNotComplete=Vous devez attendre que le téléchargement des blocs Bitcoin manquants soit terminé.
@@ -1958,13 +2041,13 @@ popup.warning.examplePercentageValue=Merci de saisir un nombre sous la forme d'u
popup.warning.noPriceFeedAvailable=Il n'y a pas de flux pour le prix de disponible pour cette devise. Vous ne pouvez pas utiliser un prix basé sur un pourcentage.\nVeuillez sélectionner le prix fixé.
popup.warning.sendMsgFailed=L'envoi du message à votre partenaire d'échange a échoué.\nMerci d'essayer de nouveau et si l'échec persiste merci de reporter le bug.
popup.warning.insufficientBtcFundsForBsqTx=Vous ne disposez pas de suffisamment de fonds BTC pour payer les frais du minage de cette transaction.\nVeuillez approvisionner votre portefeuille BTC.\nFonds manquants: {0}
-popup.warning.bsqChangeBelowDustException=Cette transaction crée un change output en BSQ inférieur à la limite définie comme dust (5.46 BSQ) et qui serait rejeté par le réseau Bitcoin.\n\nVous devez soit envoyer un montant plus élevé afin d'éviter ce change output (par exemple en ajoutant la quantité de dust à votre montant d'envoi), soit ajouter plus de fonds BSQ à votre portefeuille pour éviter de générer un dust output.\n\nLe dust output est {0}.
-popup.warning.btcChangeBelowDustException=Cette transaction crée un change output inférieur à la limite de définie comme dust (546 Satoshi) qui serait rejeté par le réseau Bitcoin.\n\nVous devez ajouter le montant de dust au montant que vous souhaitez envoyer afin d'éviter de générer un dust output.\n\nLe dust output est {0}.
+popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the Bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the Bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
popup.warning.insufficientBsqFundsForBtcFeePayment=Vous ne disposez pas de suffisamment de fonds en BSQ pour payer les frais de transaction en BSQ. Vous pouvez payer les frais en BTC ou vous aurez besoin de provisionner votre portefeuille BSQ. Vous pouvez acheter des BSQ sur Bisq.\n\nFonds BSQ manquants: {0}
popup.warning.noBsqFundsForBtcFeePayment=Votre portefeuille BSQ ne dispose pas de suffisamment de fonds pour payer les frais de transaction en BSQ.
popup.warning.messageTooLong=Votre message dépasse la taille maximale autorisée. Veuillez l'envoyer en plusieurs parties ou le télécharger depuis un service comme https://pastebin.com.
-popup.warning.lockedUpFunds=Vous avez bloqué les fonds provenant d'une opération ratée.\nSolde bloqué: {0}\nTx de l'adresse de dépôt: {1}\nID de l'échange: {2}.\n\nVeuillez ouvrir un ticket de support en sélectionnant l'échange dans l'écran des échanges en attente et en cliquant sur \"alt + o\" or \"option + o\"."
+popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"."
popup.warning.nodeBanned=Un des nœuds {0} a été banni. Veuillez redémarrer votre application pour vous assurer de ne pas être connecté au nœud banni.
popup.warning.priceRelay=Relais de prix
@@ -1993,19 +2076,36 @@ popup.shutDownInProgress.msg=La fermeture de l'application nécessite quelques s
popup.attention.forTradeWithId=Attention requise la transaction avec l''ID {0}
-popup.roundedFiatValues.headline=Nouvelle option de confidentialité: Montants en fiat arrondies
-popup.roundedFiatValues.msg=Pour augmenter la confidentialité de votre transaction, le montant {0} a été arrondi.\n\nSelon la version du client, vous paierez ou recevrez soit des valeurs avec des décimales, soit des valeurs arrondies.\n\nCes deux valeurs sont désormais conformes au protocole d'échange.\n\nSachez également que les valeurs en BTC sont automatiquement modifiées pour correspondre au montant arrondi en fiat le plus exactement possible.
-
popup.info.multiplePaymentAccounts.headline=Comptes de paiement multiples disponibles
popup.info.multiplePaymentAccounts.msg=Vous disposez de plusieurs comptes de paiement disponibles pour cet ordre. Assurez-vous de choisir le bon.
-popup.dao.launch.headline=La vision d'ensemble, réalisée
-popup.dao.launch.governance.title=Gouvernance
-popup.dao.launch.governance=Le réseau d'échange de Bisq était déjà décentralisé.\nAvec la DAO de Bisq , le leadership de Bisq est maintenant aussi décentralisé, rendant Bisq exceptionnellement résistant à la censure.
-popup.dao.launch.trading.title=Échanger
-popup.dao.launch.trading=Échangez des BSQ (Bitcoin coloré) pour participer à la gouvernance de Bisq. Vous pouvez acheter et vendre des BSQ ainsi que tout autre actif sur Bisq.
-popup.dao.launch.cheaperFees.title=Frais réduits
-popup.dao.launch.cheaperFees=Obtenez une réduction de 90% sur les frais de trading lorsque vous utilisez BSQ. Économisez de l'argent et soutenez le projet en même temps!\n\n
+popup.news.launch.headline=Two Major Updates
+popup.news.launch.accountSigning.headline=ACCOUNT SIGNING
+popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer.
+popup.news.launch.ntp.headline=NEW TRADE PROTOCOL
+popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant.
+
+popup.accountSigning.selectAccounts.headline=Select payment accounts
+popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign.
+popup.accountSigning.selectAccounts.signAll=Sign all payment methods
+popup.accountSigning.selectAccounts.datePicker=Select point of time until which accounts will be signed
+
+popup.accountSigning.confirmSelectedAccounts.headline=Confirm selected payment accounts
+popup.accountSigning.confirmSelectedAccounts.description=Based on your input, {0} payment accounts will be selected.
+popup.accountSigning.confirmSelectedAccounts.button=Confirm payment accounts
+popup.accountSigning.signAccounts.headline=Confirm signing of payment accounts
+popup.accountSigning.signAccounts.description=Based on your selection, {0} payment accounts will be signed.
+popup.accountSigning.signAccounts.button=Sign payment accounts
+popup.accountSigning.signAccounts.ECKey=Enter private arbitrator key
+popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey
+
+popup.accountSigning.success.headline=Congratulations
+popup.accountSigning.success.description=All {0} payment accounts were successfully signed!
+popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0}
+popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1}
+popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0}
+popup.accountSigning.peerSigner=One of your accounts is mature enough to sign other payment accounts and the initial limit for one of your accounts has been lifted.\n\n{0}
####################################################################
# Notifications
@@ -2071,6 +2171,7 @@ list.currency.editList=Modifier la liste des devises
table.placeholder.noItems=Il y a {0} disponible pour le moment
table.placeholder.noData=Il n'y a actuellement aucune donnée disponible
+table.placeholder.processingData=Processing data...
peerInfoIcon.tooltip.tradePeer=Du pair de trading
@@ -2093,7 +2194,8 @@ peerInfo.title=info sur le pair
peerInfo.nrOfTrades=Nombre d'opérations effectuées
peerInfo.notTradedYet=Vous n'avez pas encore échangé avec cet utilisateur.
peerInfo.setTag=Définir un tag pour ce pair
-peerInfo.age=Âge du compte de paiement
+peerInfo.age.noRisk=Âge du compte de paiement
+peerInfo.age.chargeBackRisk=Time since signing
peerInfo.unknownAge=Âge inconnu
addressTextField.openWallet=Ouvrir votre portefeuille Bitcoin par défaut
@@ -2154,7 +2256,7 @@ BTC_REGTEST=Bitcoin Regtest
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=Bitcoin DAO Testnet (obsolète)
# suppress inspection "UnusedProperty"
-BTC_DAO_BETANET=Bitcoin DAO Betanet (Bitcoin Mainnet)
+BTC_DAO_BETANET=Bisq DAO Betanet (Bitcoin Mainnet)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=Bitcoin DAO Regtest
@@ -2253,6 +2355,7 @@ payment.accepted.banks=Banques acceptées (ID)
payment.mobile=N° de téléphone portable
payment.postal.address=Adresse postale
payment.national.account.id.AR=Numéro CBU
+shared.accountSigningState=Account signing status
#new
payment.altcoin.address.dyn={0} adresse
@@ -2261,7 +2364,7 @@ payment.accountNr=Numéro de compte
payment.emailOrMobile=Email ou numéro de portable
payment.useCustomAccountName=Utiliser un nom de compte personnalisé
payment.maxPeriod=Durée d'échange max. autorisée
-payment.maxPeriodAndLimit=Durée maximale de l''échange: {0} / Limite maximale d''échange: {1}. / Ancienneté du compte: {2}
+payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3}
payment.maxPeriodAndLimitCrypto=Durée maximale de trade: {0} / Limite maximale de trading {1}
payment.currencyWithSymbol=Devise:{0}
payment.nameOfAcceptedBank=Nom de la banque acceptée
@@ -2284,12 +2387,13 @@ payment.moneyGram.info=Lors de l'utilisation de MoneyGram, l'acheteur de BTC doi
payment.westernUnion.info=Lors de l'utilisation de Western Union, l'acheteur BTC doit envoyer le MTCN (numéro de suivi) et une photo du reçu par e-mail au vendeur de BTC. Le reçu doit indiquer clairement le nom complet du vendeur, la ville, le pays et le montant. L'acheteur verra ensuite s'afficher le mail du vendeur pendant le processus de la transaction.
payment.halCash.info=Lors de l'utilisation de HalCash, l'acheteur de BTC doit envoyer au vendeur de BTC le code HalCash par SMS depuis son téléphone portable.\n\nVeuillez vous assurer de ne pas dépasser le montant maximum que votre banque vous permet d'envoyer avec HalCash. Le montant minimum par retrait est de 10 EUR et le montant maximum est de 600 EUR. Pour les retraits récurrents, il est de 3000 EUR par destinataire par jour et 6000 EUR par destinataire par mois. Veuillez vérifier ces limites auprès de votre banque pour vous assurer qu'elles utilisent les mêmes limites que celles indiquées ici.\n\nLe montant du retrait doit être un multiple de 10 EUR car vous ne pouvez pas retirer d'autres montants à un distributeur automatique. Pendant les phases de create-offer et take-offer l'affichage de l'interface utilisateur ajustera le montant en BTC afin que le montant en euros soit correct. Vous ne pouvez pas utiliser le prix basé sur le marché, car le montant en euros varierait en fonction de l'évolution des prix.\n\nEn cas de litige, l'acheteur de BTC doit fournir la preuve qu'il a envoyé la somme en EUR.
payment.limits.info=Veuillez prendre note que tous les transferts bancaires présentent un risque certain de rétrofacturation.\n\nPour atténuer ce risque, Bisq fixe des limites par opération selon deux critères:\n\n1. Une estimation du niveau de risque de rétrofacturation selon le mode de paiement utilisé\n2. l'ancienneté de votre compte avec ce mode de paiement\n\nLe compte que vous venez de créer est nouveau et son âge est égal à zéro. Au fur et à mesure que votre compte prendra de l'âge sur une période de deux mois, vos limites par opération augmenteront avec lui :\n\n● Au cours du 1er mois, votre limite par transaction sera de {0}.\n● Au cours du 2e mois, votre limite par opération sera de {1}.\n● Après le 2e mois, votre limite par opération sera de {2}.\n\nVeuillez noter qu'il n'y a pas de limite sur le nombre total de transactions que vous pouvez effectuer.
+payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade buy limits based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account you just created carries some chargeback risk and is not yet signed by an arbitrator or trusted peer, so it is limited to buying {0} per trade. After it is signed, buy limits will increase as follows:\n\n● Before signing, and up to 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase merely as account age increases. More information is at https://docs.bisq.network/payment-methods#account-signing.\n\nThere are no limits on the number of trades you can make.
payment.cashDeposit.info=Veuillez confirmer que votre banque vous permet d'envoyer des dépôts en espèces sur le compte d'autres personnes. Par exemple, Bank of America et Wells Fargo n'autorisent plus de tels dépôts.
payment.revolut.info=Veuillez vous assurer que le numéro de téléphone que vous avez utilisé pour votre compte Revolut est enregistré chez Revolut sinon l'acheteur de BTC ne pourra pas vous envoyer les fonds.
-payment.usPostalMoneyOrder.info=Les ordres en numéraire sont l'une des méthodes d'achat les plus privées disponibles sur Bisq.\n\nCependant, vous devez être conscient des risques potentiellement accrus associés à son utilisation. Bisq n'assumera aucune responsabilité en cas du vol d'un de vos virements, et les arbitres octroieront dans ce cas les BTC à l'expéditeur de l'ordre de virement, à condition de pouvoir produire les informations de suivi et les reçus. Il peut être conseillé à l'expéditeur d'inscrire le nom du vendeur de BTC dans le virement, afin de minimiser le risque que le virement soit encaissé par une tiers personne.
+payment.usPostalMoneyOrder.info=Money orders are one of the more private fiat purchase methods available on Bisq.\n\nHowever, please be aware of potentially increased risks associated with their use. Bisq will not bear any responsibility in case a sent money order is stolen, and the mediator or arbitrator will in such cases award the BTC to the sender of the money order, provided they can produce tracking information and receipts. It may be advisable for the sender to write the BTC seller's name on the money order, in order to minimize the risk that the money order is cashed by someone else.
payment.f2f.contact=information de contact
payment.f2f.contact.prompt=Comment souhaitez-vous être contacté par votre pair de trading? (adresse mail, numéro de téléphone,...)
@@ -2299,11 +2403,15 @@ payment.f2f.optionalExtra=Informations complémentaires facultatives
payment.f2f.extra=Informations complémentaires
payment.f2f.extra.prompt=Le maker peut définir des " conditions générales " ou ajouter des informations publiques de contact. Elles seront affichées avec l'ordre.
-payment.f2f.info=Les transactions en face à face comportent des règles différentes et des risques différents par rapport aux transactions en ligne.\n\nLes principales différences sont :\n● Les pairs de trading doivent échanger des informations sur le lieu et l'heure de la réunion en utilisant les coordonnées communiquées.\n● Les pairs de trading doivent apporter leur ordinateur portable et faire la confirmation du 'payment sent' et du 'payment received' sur le lieu de la rencontre.\n● Si un maker a des 'terms and conditions', il doit les indiquer dans le champ de texte 'Informations supplémentaires' du compte.\n● En acceptant un ordre, le taker accepte les 'terms and conditions' énoncées par le maker.\n● En cas de litige, l'arbitre ne peut pas beaucoup aider car il est généralement difficile d'obtenir une preuve inviolable de ce qui s'est passé lors de la rencontre. Dans de tels cas, les fonds en BTC peuvent être bloqués indéfiniment ou jusqu'à ce que les pairs de trading parviennent à un accord.\n\nPour être sûr que vous comprenez bien les différences induites par les transactions en face à face, veuillez lire les instructions et les recommandations à l'adresse : https://docs.bisq.network/trading-rules.html#f2f-trading
+payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
payment.f2f.info.openURL=Ouvrir la page web
-payment.f2f.offerbook.tooltip.countryAndCity=Pays et ville: {0} / {1}
+payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
payment.f2f.offerbook.tooltip.extra=Informations complémentaires: {0}
+payment.japan.bank=Banque
+payment.japan.branch=Branch
+payment.japan.account=Compte
+payment.japan.recipient=Nom
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -2317,6 +2425,7 @@ CASH_DEPOSIT=Dépôt en espèces
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=Face à face (en personne)
+JAPAN_BANK=Japan Bank Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=Banques nationales
@@ -2334,6 +2443,8 @@ MONEY_GRAM_SHORT=MoneyGram
WESTERN_UNION_SHORT=Western Union
# suppress inspection "UnusedProperty"
F2F_SHORT=F2F
+# suppress inspection "UnusedProperty"
+JAPAN_BANK_SHORT=Japan Furikomi
# Do not translate brand names
# suppress inspection "UnusedProperty"
@@ -2495,7 +2606,12 @@ validation.pattern=La valeur saisie doit être au format: {0}
validation.noHexString=La valeur saisie n'est pas au format HEX.
validation.advancedCash.invalidFormat=Doit être un email valide ou un identifiant de portefeuille de type: X000000000000
validation.invalidUrl=Ceci n'est pas une URL valide
-validation.mustBeDifferent=La valeur saisie doit être différente de la valeur actuelle
+validation.mustBeDifferent=Your input must be different from the current value
validation.cannotBeChanged=Le paramètre ne peut pas être modifié
validation.numberFormatException=Number format exception {0}
validation.mustNotBeNegative=La saisie ne doit pas être négative
+validation.phone.missingCountryCode=Need two letter country code to validate phone number
+validation.phone.invalidCharacters=Phone number {0} contains invalid characters
+validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number
+validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number
+validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}.
diff --git a/core/src/main/resources/i18n/displayStrings_ja.properties b/core/src/main/resources/i18n/displayStrings_ja.properties
index 5a94f5c68f..c224507674 100644
--- a/core/src/main/resources/i18n/displayStrings_ja.properties
+++ b/core/src/main/resources/i18n/displayStrings_ja.properties
@@ -59,11 +59,15 @@ shared.openTrades=オープントレード
shared.dateTime=日付/時間
shared.price=価格
shared.priceWithCur={0}の価格
-shared.priceInCurForCur=1{1}に対する{0}の価格
+shared.priceInCurForCur=1{1}当りの{0}の価格
shared.fixedPriceInCurForCur=1 {1}あたりの{0}で価格を固定
shared.amount=金額
+shared.txFee=Transaction Fee
+shared.makerFee=Maker Fee
+shared.buyerSecurityDeposit=Buyer Deposit
+shared.sellerSecurityDeposit=Seller Deposit
shared.amountWithCur={0}の金額
-shared.volumeWithCur={0}での取引高
+shared.volumeWithCur={0}取引高
shared.currency=通貨
shared.market=相場
shared.paymentMethod=支払い方法
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=もう一度承認を送信してください
shared.exportCSV=CSVにエクスポート
shared.exportJSON=JSONにエクスポート
shared.noDateAvailable=日付がありません
-shared.arbitratorsFee=調停手数料
shared.noDetailsAvailable=詳細不明
shared.notUsedYet=未使用
shared.date=日付
@@ -149,11 +152,11 @@ shared.save=保存
shared.onionAddress=Onionアドレス
shared.supportTicket=サポートチケット
shared.dispute=係争
+shared.mediationCase=mediation case
shared.seller=売り手
shared.buyer=買い手
shared.allEuroCountries=ユーロ全諸国
shared.acceptedTakerCountries=取引可能なテイカーの国
-shared.arbitrator=選択された調停人
shared.tradePrice=取引価格
shared.tradeAmount=取引額
shared.tradeVolume=取引量
@@ -203,6 +206,15 @@ shared.proposal=提案
shared.votes=投票
shared.learnMore=もっと詳しく知る
shared.dismiss=却下する
+shared.selectedArbitrator=選択された調停人
+shared.selectedMediator=Selected mediator
+shared.selectedRefundAgent=選択された調停人
+shared.mediator=調停者
+shared.arbitrator=調停人
+shared.refundAgent=調停人
+shared.refundAgentForSupportStaff=Refund agent
+shared.delayedPayoutTxId=Refund collateral transaction ID
+
####################################################################
# UI views
@@ -244,7 +256,7 @@ mainView.footer.btcInfo.synchronizingWith=同期中
mainView.footer.btcInfo.synchronizedWith=同期されています:
mainView.footer.btcInfo.connectingTo=接続中:
mainView.footer.btcInfo.connectionFailed=接続失敗
-mainView.footer.p2pInfo=P2Pネットワークピア: {0}
+mainView.footer.p2pInfo=Bisq network peers: {0}
mainView.footer.daoFullNode=DAOのフルノード
mainView.bootstrapState.connectionToTorNetwork=(1/4) Torネットワークに接続中...
@@ -254,10 +266,10 @@ mainView.bootstrapState.initialDataReceived=(4/4) 初期データを受信しま
mainView.bootstrapWarning.noSeedNodesAvailable=シードノードが見つかりません
mainView.bootstrapWarning.noNodesAvailable=シードノードとピアが見つかりません
-mainView.bootstrapWarning.bootstrappingToP2PFailed=P2Pネットワークとの同期に失敗しました
+mainView.bootstrapWarning.bootstrappingToP2PFailed=Bootstrapping to Bisq network failed
mainView.p2pNetworkWarnMsg.noNodesAvailable=データを要求するためのシードノードと永続ピアが見つかりません。\nインターネット接続を確認するか、アプリケーションを再起動してみてください。
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=P2Pネットワークへの接続に失敗しました(報告されたエラー: {0})。\nインターネット接続を確認するか、アプリケーションを再起動してみてください。
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Connecting to the Bisq network failed (reported error: {0}).\nPlease check your internet connection or try to restart the application.
mainView.walletServiceErrorMsg.timeout=タイムアウトのためビットコインネットワークへの接続に失敗しました
mainView.walletServiceErrorMsg.connectionError=次のエラーのためビットコインネットワークへの接続に失敗しました: {0}
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=クローズ:
market.trades.tooltip.candle.high=最高:
market.trades.tooltip.candle.low=最低:
market.trades.tooltip.candle.average=平均:
+market.trades.tooltip.candle.median=Median:
market.trades.tooltip.candle.date=日付:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=利用可能な銀行の国名(テイカ
offerbook.availableOffers=利用可能なオファー
offerbook.filterByCurrency=通貨でフィルター
offerbook.filterByPaymentMethod=支払い方法でフィルター
+offerbook.timeSinceSigning=Time since signing
+offerbook.timeSinceSigning.info=This account was verified and {0}
+offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
+offerbook.timeSinceSigning.info.peer=signed by a peer, waiting for limits to be lifted
+offerbook.timeSinceSigning.info.peerLimitLifted=signed by a peer and limits were lifted
+offerbook.timeSinceSigning.info.signer=signed by peer and can sign peer accounts (limits lifted)
+offerbook.timeSinceSigning.daysSinceSigning={0}日
+offerbook.timeSinceSigning.daysSinceSigning.long={0} since signing
+
+offerbook.timeSinceSigning.help=When you successfully complete a trade with a peer who has a signed payment account, your payment account is signed.\n{0} days later, the initial limit of {1} is lifted and your account can sign other peers'' payment accounts.
+offerbook.timeSinceSigning.notSigned=Not signed yet
+offerbook.timeSinceSigning.notSigned.noNeed=N/A
+shared.notSigned=This account hasn't been signed yet
+shared.notSigned.noNeed=This account type doesn't use signing
offerbook.nrOffers=オファー数: {0}
offerbook.volume={0} (下限 - 上限)
@@ -345,14 +372,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=選択した通貨のトレー
offerbook.warning.noMatchingAccount.headline=一致するトレードアカウントがありません
offerbook.warning.noMatchingAccount.msg=このオファーを利用するには、この支払い方法を使用する支払いアカウントを設定する必要があります。\n\n今すぐ設定しますか?
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=以下の基準に基づくセキュリティ制限のため、このオファーは受けられません。\n- メーカーの支払いアカウントは2019年3月1日以降に作成されました\n- 最小取引額が0.01 BTCを超えている\n- オファーの支払い方法は銀行のチャージバックのリスクが高いと考えられます\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=以下の基準に基づくセキュリティ制限のため、このオファーは受けられません。\n- あなたの支払いアカウントは2019年3月1日以降に作成されました\n- 最小取引額が0.01 BTCを超えている\n- オファーの支払い方法は銀行のチャージバックのリスクが高いと考えられます\n\n{0}
+offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=セキュリティを強化するための短期的な措置として、この制限を適用する必要がありました。\n\n次のソフトウェアリリースでは、より堅牢な保護ツールが提供されるため、このリスクプロファイルを持つオファーと再度取引することができます。
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=次の基準に基づくセキュリティ上の制限から、許容取引額は0.01 BTCに制限されています。\n- 買い手のアカウントは2019年3月1日以降に作成されました\n- このオファーの支払い方法は、銀行のチャージバックのリスクが高いと考えられます\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=次の基準に基づくセキュリティ上の制限から、利用可能な取引額は0.01 BTCに制限されています。\n- お支払いアカウントは2019年3月1日以降に作成されました\n- このオファーの支払い方法は、銀行のチャージバックのリスクが高いと考えられます\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
offerbook.warning.wrongTradeProtocol=そのオファーには、ご使用のソフトウェアのバージョンで使用されているものとは異なるプロトコルバージョンが必要です。\n\n最新バージョンがインストールされているかどうかを確認してください。そうでなければ、オファーを作成したユーザーが古いバージョンを使用しています。\n\nユーザーは、互換性のないトレードプロトコルバージョンと取引することはできません。
offerbook.warning.userIgnored=そのユーザのonionアドレスを無視リストに追加しました。
@@ -478,7 +503,7 @@ takeOffer.failed.offerTaken=そのオファーは既に別の取引者によっ
takeOffer.failed.offerRemoved=そのオファーはこの間に削除されたため、そのオファーは受け取れません
takeOffer.failed.offererNotOnline=メイカーがオンラインになっていないため、オファー受け入れに失敗しました。
takeOffer.failed.offererOffline=このオファーはメーカーがオフラインのため受け取れません
-takeOffer.warning.connectionToPeerLost=メイカーとの接続が切れました。\n相手がオフラインになったか、オープンな接続が多すぎるため、あなたへの接続を閉じた可能性があります。\n\nまだオファーブックに相手のオファーが表示されている場合は、もう一度そのオファーを受け取って下さい。
+takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again.
takeOffer.error.noFundsLost=\n\nあなたのウォレットにはまだ資金がありません\nアプリケーションを再起動し、ネットワーク接続を確認して問題を解決できるかどうかを確認してください。
takeOffer.error.feePaid=\n\nアプリケーションを再起動し、ネットワーク接続を確認して問題を解決できるかどうかを確認してください。
@@ -516,8 +541,8 @@ portfolio.pending.step3_seller.confirmPaymentReceived=支払いを受領した
portfolio.pending.step5.completed=完了
portfolio.pending.step1.info=デポジットトランザクションが発行されました。\n{0}は、支払いを開始する前に少なくとも1つのブロックチェーンの承認を待つ必要があります。
-portfolio.pending.step1.warn=デポジットトランザクションがまだ承認されていません。\n外部ウォレットからの取引者の資金調達手数料が低すぎるときに、それはまれなケースで起こるかもしれません。
-portfolio.pending.step1.openForDispute=デポジットトランザクションがまだ承認されていません。\n外部ウォレットからの取引者の資金調達手数料が低すぎるとき、それはまれなケースで起こるかもしれません。\n最大トレード期間が経過しました。\n\nあなたはもう少し待つか、係争を解決するために調停人に連絡することができます。
+portfolio.pending.step1.warn=The deposit transaction is still not confirmed. This sometimes happens in rare cases when the funding fee of one trader from an external wallet was too low.
+portfolio.pending.step1.openForDispute=The deposit transaction is still not confirmed. You can wait longer or contact the mediator for assistance.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=あなたの取引は少なくとも1つのブロックチェーン承認に達しました。\n(必要に応じてさらに承認を待つことができます - 6回の承認が非常に安全であると考えられます。)\n\n
@@ -535,8 +560,10 @@ portfolio.pending.step2_buyer.altcoin=外部{0}ウォレットから転送して
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=銀行に行き、BTCの売り手へ{0}を支払ってください。\n\n
portfolio.pending.step2_buyer.cash.extra=重要な要件:\n支払いが完了したら、領収書に「返金無し(NO REFUNDS)」と記載してください。\nそれからそれを2部に分け、写真を撮り、そしてBTCの売り手のEメールアドレスへそれを送ってください。
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=MoneyGramを使用してBTC売り手へ{0}をお支払いください。\n\n
portfolio.pending.step2_buyer.moneyGram.extra=重要な要件: \n支払いが完了したら、認証番号と領収書の写真を電子メールでBTCの売り手へ送信して下さい。\n領収書には、売り手の氏名、国、都道府県、および金額を明確に表示する必要があります。売り手のメールアドレス: {0}
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=Western Unionを使用してBTCの売り手へ{0}をお支払いください。\n\n
portfolio.pending.step2_buyer.westernUnion.extra=重要な要件: \n支払いが完了したら、MTCN(追跡番号)と領収書の写真を電子メールでBTCの売り手へ送信して下さい。\n領収書には、売り手の氏名、市区町村、国、金額が明確に示されている必要があります。売り手のメールアドレス: {0}
@@ -544,14 +571,15 @@ portfolio.pending.step2_buyer.westernUnion.extra=重要な要件: \n支払いが
portfolio.pending.step2_buyer.postal={0}を「米国の郵便為替」でBTCの売り手に送付してください。\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.bank=オンラインバンキングのWebページにアクセスして、BTCの売り手へ{0}をお支払いください。\n\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=提供された連絡先でBTCの売り手に連絡し、{0}を支払うためのミーティングを準備してください。\n\n
portfolio.pending.step2_buyer.startPaymentUsing={0}を使用して支払いを開始
portfolio.pending.step2_buyer.amountToTransfer=振替金額
portfolio.pending.step2_buyer.sellersAddress=売り手の{0}アドレス
portfolio.pending.step2_buyer.buyerAccount=使用されるあなたの支払いアカウント
portfolio.pending.step2_buyer.paymentStarted=支払いが開始されました
-portfolio.pending.step2_buyer.warn={0}の支払いはまだ完了していません!\n取引は{1}までに完了する必要があります。そうでなければ、このトレードは調停人によって調査されます。
-portfolio.pending.step2_buyer.openForDispute=支払いを完了していません!\nトレードの最大期間が経過しました。\n\n係争を解決するために調停人に連絡してください。
+portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
+portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.Please contact the mediator for assistance.
portfolio.pending.step2_buyer.paperReceipt.headline=領収書をBTCの売り手へ送付しましたか?
portfolio.pending.step2_buyer.paperReceipt.msg=覚えておいてください:\n領収書に「返金無し(NO REFUNDS)」と記載してください。\nそれからそれを2部に分け、写真を撮り、そしてBTCの売り手のEメールアドレスへそれを送ってください。
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=認証番号と領収書を送信
@@ -569,7 +597,11 @@ portfolio.pending.step2_seller.waitPayment.headline=支払いをお待ちくだ
portfolio.pending.step2_seller.f2fInfo.headline=買い手の連絡先
portfolio.pending.step2_seller.waitPayment.msg=デポジットトランザクションには、少なくとも1つのブロックチェーン承認があります。\nBTCの買い手が{0}の支払いを開始するまで待つ必要があります。
portfolio.pending.step2_seller.warn=BTCの買い手はまだ{0}の支払いを行っていません。\n支払いが開始されるまで待つ必要があります。\n取引が{1}で完了していない場合は、調停人が調査します。
-portfolio.pending.step2_seller.openForDispute=BTCの買い手は支払いを開始していません!\nトレードの許可された最大期間が経過しました。\nあなたはもっと長く待って取引相手にもっと時間を与えるか、係争を起こすために調停人に連絡することができます。
+portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance.
+
+tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}''
+tradeChat.openChat=Open chat window
+tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=未定義
@@ -578,7 +610,7 @@ message.state.SENT=メッセージ送信済
# suppress inspection "UnusedProperty"
message.state.ARRIVED=相手からのメールが来ました
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=受信箱にメッセージが入っています
+message.state.STORED_IN_MAILBOX=Message of payment sent but not yet received by peer
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=相手がメッセージ受信を確認
# suppress inspection "UnusedProperty"
@@ -589,22 +621,23 @@ portfolio.pending.step3_buyer.wait.info={0}の支払いを受け取るためのB
portfolio.pending.step3_buyer.wait.msgStateInfo.label=支払いはメッセージステータスを開始
portfolio.pending.step3_buyer.warn.part1a={0} ブロックチェーン上で
portfolio.pending.step3_buyer.warn.part1b=支払いプロバイダ(銀行など)で
-portfolio.pending.step3_buyer.warn.part2=BTCの売り手はまだあなたの支払いを確認していません!\n支払いの送信が成功したかどうか{0}を確認してください。\nBTCの売り手が{1}までにあなたの支払いの受領を確認しない場合、その取引は調停人によって調査されます。
-portfolio.pending.step3_buyer.openForDispute=BTCの売り手があなたの支払いを確認していません!\nトレードの最大期間が経過しました。\nあなたはもっと長く待って取引相手にもっと時間を与えるか、係争を起こすために調停人に連絡することができます。
+portfolio.pending.step3_buyer.warn.part2=The BTC seller still has not confirmed your payment. Please check {0} if the payment sending was successful.
+portfolio.pending.step3_buyer.openForDispute=The BTC seller has not confirmed your payment! The max. period for the trade has elapsed. You can wait longer and give the trading peer more time or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=あなたのトレード相手は、彼らが{0}の支払いを開始したことを確認しました。\n\n
portfolio.pending.step3_seller.altcoin.explorer=あなたの好きな{0}ブロックチェーンエクスプローラで
portfolio.pending.step3_seller.altcoin.wallet=あなたの{0}ウォレットで
portfolio.pending.step3_seller.altcoin={0}あなたの受け取りアドレスへのトランザクションが{1}かどうかを確認してください\n{2}\nはすでに十分なブロックチェーンの承認があります。\n支払い額は{3}です\n\nポップアップを閉じた後、メイン画面から{4}アドレスをコピーして貼り付けることができます。
portfolio.pending.step3_seller.postal={0} BTCの買い手から「米国の郵便為替」で{1}を受け取ったかどうかを確認してください。\n\nこのトランザクションのトレードID(「支払い理由」のテキスト)は: \ "{2} \"
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=あなたの取引相手は、彼らが{0}の支払いを開始したことを確認しました。\n\nオンラインバンキングのWebページにアクセスして、BTCの買い手から{1}を受け取ったかどうかを確認してください。\n\nこのトランザクションのトレードID(「支払い理由」のテキスト)は: \ "{2} \"\n\n
portfolio.pending.step3_seller.cash=支払いは現金入金で行われるので、BTCの買い手は領収書に「返金無し(NO REFUND)」と記入し、2部に分けて写真を電子メールで送ってください。\n\nチャージバックのリスクを回避するために、Eメールを受信したかどうか、および領収書が有効であることが確実であるかどうかを確認してください。\nよくわからない場合は、{0}
portfolio.pending.step3_seller.moneyGram=買い手は承認番号と領収書の写真を電子メールで送信する必要があります。\n領収書には、氏名、国、州、および金額を明確に記載する必要があります。 認証番号を受け取った場合は、メールを確認してください。\n\nそのポップアップを閉じた後、あなたはMoneyGramからお金を得るためのBTC買い手の名前と住所を見られるでしょう。\n\nあなたが正常にお金を得た後にのみ領収書を承認してください!
portfolio.pending.step3_seller.westernUnion=買い手はMTCN(追跡番号)と領収書の写真をEメールで送信する必要があります。\n領収書には、氏名、市区町村、国、金額が明確に記載されている必要があります。 MTCNを受け取った場合は、メールを確認してください。\n\nそのポップアップを閉じた後、あなたはWestern Unionからお金を得るためのBTC買い手の名前と住所を見られるでしょう。\n\nあなたが正常にお金を得た後にのみ領収書を承認してください!
portfolio.pending.step3_seller.halCash=買い手はHalCashコードをテキストメッセージとして送信する必要があります。それに加えて、HalCash対応ATMからEURを出金するために必要な情報を含むメッセージがHalCashから届きます。\n\nあなたはATMからお金を得た後、ここで支払いの領収書を承認して下さい!
-portfolio.pending.step3_seller.bankCheck=\n\nまた、銀行取引明細書に記載されている送付者の名前が、トレード契約書のものと一致することも確認してください:\n送信者の名前: {0}\n\n名前がここに表示されているものと同じではない場合、{1}
-portfolio.pending.step3_seller.openDispute=承認せず、「alt + o」または「option + o」を入力して係争を開始して下さい。
+portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1}
+portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=支払い受領を承認
portfolio.pending.step3_seller.amountToReceive=受取額
portfolio.pending.step3_seller.yourAddress=あなたの{0} アドレス
@@ -617,17 +650,18 @@ portfolio.pending.step3_seller.buyerStartedPayment.altcoin=あなたのアルト
portfolio.pending.step3_seller.buyerStartedPayment.fiat=あなたのトレードアカウント(例えば銀行口座)をチェックして、あなたが支払いを受領した時に承認して下さい。
portfolio.pending.step3_seller.warn.part1a={0} blockchain上で
portfolio.pending.step3_seller.warn.part1b=支払いプロバイダ(銀行など)で
-portfolio.pending.step3_seller.warn.part2=あなたはまだ支払いの受領を承認していません!\n支払いを受け取ったかどうか{0}を確認してください。\n{1}までに受領を承認しない場合、取引は調停人によって調査されます。
-portfolio.pending.step3_seller.openForDispute=あなたは支払いの受領を承認していません!\nトレードの最大期間が経過しました。\n係争を解決するために調停人に確認するか連絡してください。
+portfolio.pending.step3_seller.warn.part2=You still have not confirmed the receipt of the payment. Please check {0} if you have received the payment.
+portfolio.pending.step3_seller.openForDispute=You have not confirmed the receipt of the payment!\nThe max. period for the trade has elapsed.\nPlease confirm or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=あなたの取引相手から{0}の支払いを受けましたか?\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=このトランザクションのトレードID(「支払理由」のテキスト)は \"{0} \"\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=また、銀行取引明細書に記載されている送付者の名前が、トレード契約書のものと一致していることも確認してください:\n送信者の名前: {0}\n\n名前がここに表示されているものと異なる場合は、承認せずに「alt + o」または「option + o」を入力して係争を開始して下さい。\n\n
-portfolio.pending.step3_seller.onPaymentReceived.note=領収書の確認が済むとすぐに、ロックされた取引金額がBTCの買い手に解放され、セキュリティデポジットが返金されます。
+portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Please note, that as soon you have confirmed the receipt, the locked trade amount will be released to the BTC buyer and the security deposit will be refunded.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=支払いを受け取ったことを確認
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=はい、支払いを受け取りました
+portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANT: By confirming receipt of payment, you are also verifying the account of the counterparty and signing it accordingly. Since the account of the counterparty hasn't been signed yet, you should delay confirmation of the payment as long as possible to reduce the risk of a chargeback.
portfolio.pending.step5_buyer.groupTitle=完了したトレードのまとめ
portfolio.pending.step5_buyer.tradeFee=取引手数料
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=合計マイニング手数料
portfolio.pending.step5_buyer.refunded=返金されたセキュリティデポジット
portfolio.pending.step5_buyer.withdrawBTC=ビットコインを出金する
portfolio.pending.step5_buyer.amount=出金額
+portfolio.pending.step5_buyer.signer=By withdrawing your bitcoins, you verify that the counterparty has acted according to the trade protocol.
portfolio.pending.step5_buyer.withdrawToAddress=出金先アドレス
portfolio.pending.step5_buyer.moveToBisqWallet=資金をBisqウォレットに移動する
portfolio.pending.step5_buyer.withdrawExternal=外部ウォレットに出金する
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=最初のブロックチェーンの確認後
portfolio.pending.tradePeriodWarning=この期間を超えた場合、両方の取引者が係争を開始できます。
portfolio.pending.tradeNotCompleted=時間内に完了してないトレード({0}まで)
portfolio.pending.tradeProcess=トレードプロセス
-portfolio.pending.openAgainDispute.msg=調停人へのメッセージが到着したことに確信が持てない場合(例えば、1日経っても返事がない場合)、再度係争を申し立てることを遠慮しないでください。
+portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community.
portfolio.pending.openAgainDispute.button=もう一度係争を開始
portfolio.pending.openSupportTicket.headline=サポートチケットをオープン
-portfolio.pending.openSupportTicket.msg=あなたが「サポートオープン」または「係争オープン」ボタンが表示されない場合、これは緊急時にのみ使用してください。\n\nサポートチケットを開くと、取引は中断され、調停人が処理します
+portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator.
+
+portfolio.pending.timeLockNotOver=You have to wait until ≈{0} ({1} more blocks) before you can open an arbitration dispute.
+
portfolio.pending.notification=通知
-portfolio.pending.openDispute=係争を開始
-portfolio.pending.arbitrationRequested=オープンされた係争
+
+portfolio.pending.support.headline.getHelp=Need help?
+portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator.
+portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator.
+portfolio.pending.support.button.getHelp=Get support
+portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket?
+portfolio.pending.support.popup.button=サポートチケットをオープン
+portfolio.pending.support.headline.halfPeriodOver=Check payment
+portfolio.pending.support.headline.periodOver=Trade period is over
+
+portfolio.pending.mediationRequested=Mediation requested
+portfolio.pending.refundRequested=Refund requested
portfolio.pending.openSupport=サポートチケットをオープン
portfolio.pending.supportTicketOpened=サポートチケットがオープンされた
portfolio.pending.requestSupport=サポートをリクエスト
-portfolio.pending.error.requestSupport=問題を調停人に報告してください。\n\n彼は問題を調査するために開発者に情報を転送します。\n問題が分析された後、あなたはすべてのロックされた資金を取り戻すでしょう。
+portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds.
portfolio.pending.communicateWithArbitrator=「サポート」画面で調停人と連絡を取ってください。
+portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator.
portfolio.pending.supportTicketOpenedMyUser=あなたは既にサポートチケットをオープンしています\n{0}
portfolio.pending.disputeOpenedMyUser=あなたは既に係争を開始しています\n{0}
portfolio.pending.disputeOpenedByPeer=あなたのトレード相手は係争を開始しました\n{0}
portfolio.pending.supportTicketOpenedByPeer=あなたのトレード相手はサポートチケットをオープンしました\n{0}
portfolio.pending.noReceiverAddressDefined=受信者のアドレスが定義されていません
-portfolio.pending.removeFailedTrade=調停人がそのトレードを成立させることができなかった場合、あなたはそれを失敗トレード画面へと自分で移動させることができます。\nあなたは保留トレード画面から失敗したトレードを削除しますか?
+portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade?
+
+portfolio.pending.mediationResult.headline=Suggested payout from mediation
+portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout.
+portfolio.pending.mediationResult.info.selfAccepted=You have accepted the mediator's suggestion. Waiting for peer to accept as well.
+portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted the mediator's suggestion. Do you accept as well?
+portfolio.pending.mediationResult.button=View proposed resolution
+portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0}
+portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0}
+portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=完了
-portfolio.closed.ticketClosed=チケットがクローズされた
+portfolio.closed.ticketClosed=Arbitrated
+portfolio.closed.mediationTicketClosed=Mediated
portfolio.closed.canceled=キャンセルされています
portfolio.failed.Failed=失敗
@@ -745,6 +807,9 @@ funds.tx.multiSigDeposit=マルチシグデポジット: {0}
funds.tx.multiSigPayout=マルチシグ支払い: {0}
funds.tx.disputePayout=係争の支払い: {0}
funds.tx.disputeLost=係争事案が消失: {0}
+funds.tx.collateralForRefund=Refund collateral: {0}
+funds.tx.timeLockedPayoutTx=Time locked payout tx: {0}
+funds.tx.refund=Refund from arbitration: {0}
funds.tx.unknown=不明な理由: {0}
funds.tx.noFundsFromDispute=係争からの返金はありません
funds.tx.receivedFunds=受取済み資金
@@ -765,14 +830,15 @@ funds.tx.dustAttackTx.popup=このトランザクションはごくわずかなB
# Support
####################################################################
-support.tab.mediation.support=サポートチケット
-support.tab.ArbitratorsSupportTickets=調停人のサポートチケット
-support.tab.TradersSupportTickets=取引者のサポートチケット
+support.tab.mediation.support=Mediation
+support.tab.arbitration.support=Arbitration
+support.tab.legacyArbitration.support=Legacy Arbitration
+support.tab.ArbitratorsSupportTickets={0}'s tickets
support.filter=フィルターリスト
support.filter.prompt=トレードID、日付、onionアドレスまたはアカウントデータを入力してください
support.noTickets=オープンなチケットはありません
support.sendingMessage=メッセージを送信中
-support.receiverNotOnline=受信者はオンラインではありません。 メッセージは彼のメールボックスに保存されます。
+support.receiverNotOnline=Receiver is not online. Message is saved to their mailbox.
support.sendMessageError=メッセージ送信失敗。エラー: {0}
support.wrongVersion=その係争の申し出はBisqの古いバージョンで作成されました。\nあなたのアプリケーションのバージョンではその係争を閉じることはできません。\n\n次のより古いバージョンを使用してください:プロトコルバージョン{0}
support.openFile=添付ファイルを開く(最大ファイルサイズ: {0} kb)
@@ -782,7 +848,7 @@ support.attachment=添付ファイル
support.tooManyAttachments=1つのメッセージに3つを超える添付ファイルは送信できません
support.save=ファイルをディスクに保存
support.messages=メッセージ
-support.input.prompt=調停人へのメッセージをここに入れてください
+support.input.prompt=Enter message...
support.send=送信
support.addAttachments=添付ファイルを追加
support.closeTicket=チケットを閉じる
@@ -801,14 +867,18 @@ support.buyerOfferer=BTC 買い手/メイカー
support.sellerOfferer=BTC 売り手/メイカー
support.buyerTaker=BTC 買い手/テイカー
support.sellerTaker=BTC 売り手/テイカー
-support.backgroundInfo=Bisqは会社ではないので、係争の扱いが異なります。\n\nトレードプロセスに係争が起きた場合(例えば、1人の取引者がトレードプロトコルに従わない場合)、トレード期間が終了した後、アプリケーションは調停人に連絡するために「係争を開始」ボタンを表示します。\n\nアプリケーションに問題がある場合、ソフトウェアはそれを検出しようと試み、可能ならば、開発者に問題を転送してくれる調停人へ連絡するための「サポートチケットをオープン」ボタンを表示します。\n\n問題があって「サポートチケットをオープン」ボタンが表示されていない場合は、「ポートフォリオ/オープントレード」の下で問題の原因となっているトレードを選択して「alt + o」または「option + o」を押すと、サポートチケットを手動で開くことができます。この方法は、ソフトウェアが正常に機能していないことが確実な場合にのみ使用してください。問題や質問がある場合は、bisq.network のWebページのFAQを参照するか、Bisqフォーラムのサポートセクションに投稿してください。
-support.initialInfo=下のテキストフィールドに問題の説明を入力してください。係争解決の時間を短縮するために、可能な限り多くの情報を追加してください。\n\n提供する必要がある情報のチェックリストを次に示します:\n\t●BTC買い手の場合:法定通貨またはアルトコインの送金を行いましたか?その場合、アプリケーションの「支払い開始」ボタンをクリックしましたか?\n\t●BTC売り手の場合:法定通貨またはアルトコインの支払いを受け取りましたか?その場合、アプリケーションの「支払いを受け取った」ボタンをクリックしましたか?\n\t●どのバージョンのBisqを使用していますか?\n\t●どのオペレーティングシステムを使用していますか?\n\t●失敗したトランザクションで問題が発生した場合は、新しいデータディレクトリへの切り替えを検討してください。\n\t データディレクトリが破損し、不可解なバグが発生している場合があります。\n\t 参照:https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\n係争プロセスの基本的なルールをよく理解してください:\n\t●2日以内に調停人の要求に応答する必要があります。\n\t●係争の最大期間は14日間です。\n\t●調停人と協力し、彼らがあなたの主張をするために、要求された情報を提供する必要があります\n\t●あなたは申請を最初に開始したときに、ユーザー契約の係争文書に記載されている規則を受け入れています。\n\n係争プロセスの詳細については、https://bisq.network/docs/exchange/arbitration-system をご覧ください。
+support.backgroundInfo=Bisq is not a company, so it handles disputes differently.\n\nTraders can communicate within the application via a secure chat on the open trades screen to attempt solving a dispute on their own. If that is not sufficient, a mediator can step in to help. The mediator will evaluate the situation and give a recommendation for the payout of the trade funds. If both traders accept this suggestion, the payout transaction is completed and the trade is closed. If one or both traders do not agree to the mediator's recommended payout, they can request arbitration.The arbitrator has the third key of the deposit transaction and will make the payout based on their findings.
+support.initialInfo=Please enter a description of your problem in the text field below. Add as much information as possible to speed up dispute resolution time.\n\nHere is a check list for information you should provide:\n\t● If you are the BTC buyer: Did you make the Fiat or Altcoin transfer? If so, did you click the 'payment started' button in the application?\n\t● If you are the BTC seller: Did you receive the Fiat or Altcoin payment? If so, did you click the 'payment received' button in the application?\n\t● Which version of Bisq are you using?\n\t● Which operating system are you using?\n\t● If you encountered an issue with failed transactions please consider switching to a new data directory.\n\t Sometimes the data directory gets corrupted and leads to strange bugs. \n\t See: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPlease make yourself familiar with the basic rules for the dispute process:\n\t● You need to respond to the {0}''s requests within 2 days.\n\t● Mediators respond in between 2 days. Arbitrators respond in between 5 business days.\n\t● The maximum period for a dispute is 14 days.\n\t● You need to cooperate with the {1} and provide the information they request to make your case.\n\t● You accepted the rules outlined in the dispute document in the user agreement when you first started the application.\n\nYou can read more about the dispute process at: {2}
support.systemMsg=システムメッセージ: {0}
support.youOpenedTicket=サポートのリクエスト開始しました。\n\n{0}\n\nBisqバージョン: {1}
support.youOpenedDispute=係争のリクエスト開始しました。\n\n{0}\n\nBisqバージョン: {1}
-support.peerOpenedTicket=あなたのトレード相手は技術的な問題によるサポートを要求しました。\n\n{0}
-support.peerOpenedDispute=あなたのトレード相手は係争をリクエストしました。\n\n{0}
+support.youOpenedDisputeForMediation=You requested mediation.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedTicket=Your trading peer has requested support due to technical problems.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDispute=Your trading peer has requested a dispute.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDisputeForMediation=Your trading peer has requested mediation.\n\n{0}\n\nBisq version: {1}
+support.mediatorsDisputeSummary=System message:\nMediator''s dispute summary:\n{0}
+support.mediatorsAddress=Mediator''s node address: {0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=アルトコインを追加する
setting.preferences.displayOptions=表示設定
setting.preferences.showOwnOffers=オファーブックに自分のオファーを表示
setting.preferences.useAnimations=アニメーションを使用
+setting.preferences.useDarkMode=Use dark mode (beta)
setting.preferences.sortWithNumOffers=市場リストをオファー/トレードの数で並び替える
setting.preferences.resetAllFlags=「次回から表示しない」フラグを全てリセット
setting.preferences.reset=リセット
@@ -852,7 +923,7 @@ settings.preferences.selectCurrencyNetwork=ネットワーク選択
setting.preferences.daoOptions=DAO設定
setting.preferences.dao.resync.label=ジェネシスTXからDAO状態を再構築
setting.preferences.dao.resync.button=再同期
-setting.preferences.dao.resync.popup=アプリケーションの再起動後、P2Pネットワークガバナンスデータはシードノードから再ロードされ、BSQのコンセンサス状態はジェネシストランザクションから再構築されます。
+setting.preferences.dao.resync.popup=After an application restart the Bisq 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=BisqをDAOのフルノードで実行
setting.preferences.dao.rpcUser=RPCユーザ名
setting.preferences.dao.rpcPw=RPCパスワード
@@ -862,7 +933,7 @@ setting.preferences.dao.fullNodeInfo.ok=ドキュメントページを開く
setting.preferences.dao.fullNodeInfo.cancel=いいえ、ライトノードモードを使い続けます
settings.net.btcHeader=ビットコインのネットワーク
-settings.net.p2pHeader=P2Pネットワーク
+settings.net.p2pHeader=Bisq network
settings.net.onionAddressLabel=私のonionアドレス
settings.net.btcNodesLabel=任意のビットコインノードを使う
settings.net.bitcoinPeersLabel=接続されたピア
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=受信済
settings.net.peerTypeColumn=ピアタイプ
settings.net.openTorSettingsButton=Torの設定を開く
+settings.net.versionColumn=Version
+settings.net.subVersionColumn=Subversion
+settings.net.heightColumn=Height
+
settings.net.needRestart=その変更を適用するには、アプリケーションを再起動する必要があります。\n今すぐ行いますか?
settings.net.notKnownYet=まだわかりません...
settings.net.sentReceived=送信済: {0}, 受信済: {1}
@@ -928,9 +1003,11 @@ setting.about.subsystems.val=ネットワークバージョン: {0}; P2Pメッ
####################################################################
account.tab.arbitratorRegistration=調停人登録
+account.tab.mediatorRegistration=Mediator registration
+account.tab.refundAgentRegistration=Refund agent registration
account.tab.account=アカウント
account.info.headline=あなたのBisqアカウントへようこそ!
-account.info.msg=ここでは、各国通貨とアルトコインのトレードアカウントを追加したり、調停人を選択したり、あなたのウォレットやアカウントデータのバックアップを作成することができます。\n\nあなたが初めてBisqを始めたときに、新しいビットコインウォレットが作られました。\n\nビットコインウォレットのシードワードを書き留めて(上部のタブを参照)、入金の前にパスワードを追加することを検討することを強くお勧めします。 ビットコインの入出金は「資金」セクションで管理されます。\n\nプライバシーとセキュリティに関するメモ: Bisqは非中央集権型の交換であるため、すべてのデータはコンピュータに保存されています。 サーバーがないので、私たちはあなたの個人情報、あなたの資金、あるいはあなたのIPアドレスにさえもアクセスできません。 銀行口座番号、アルトコイン&ビットコインのアドレスなどのデータは、あなたが開始したトレードを遂行するためにあなたのトレード相手とだけ共有されます(係争の場合には調停人があなたのトレード相手と同じデータを見るでしょう)。
+account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer).
account.menu.paymentAccount=各国通貨口座
account.menu.altCoinsAccountView=アルトコインアカウント
@@ -939,42 +1016,39 @@ account.menu.seedWords=ウォレットシード
account.menu.backup=バックアップ
account.menu.notifications=通知
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=パブリックキー
-account.arbitratorRegistration.register=調停人の登録
-account.arbitratorRegistration.revoke=登録の取り消し
-account.arbitratorRegistration.info.msg=調停人としてあなたを使用しているトレードが存在する可能性があるため、取り消し後の15日間は利用可能な状態にしておく必要があります。許可される最長取引期間は8日間で、係争処理には最長で7日間かかる場合があります。
+account.arbitratorRegistration.register=Register
+account.arbitratorRegistration.registration={0} registration
+account.arbitratorRegistration.revoke=取り消し
+account.arbitratorRegistration.info.msg=Please note that you need to stay available for 15 days after revoking as there might be trades which are using you as {0}. The max. allowed trade period is 8 days and the dispute process might take up to 7 days.
account.arbitratorRegistration.warn.min1Language=少なくとも1つの言語を設定する必要があります。\nデフォルトの言語を追加しました。
-account.arbitratorRegistration.removedSuccess=P2Pネットワークから調停人を正常に削除しました。
-account.arbitratorRegistration.removedFailed=調停人を削除できませんでした。{0}
-account.arbitratorRegistration.registerSuccess=調停人をP2Pネットワークに正常に登録しました。
-account.arbitratorRegistration.registerFailed=調停人を登録できませんでした。{0}
-
-account.arbitratorSelection.minOneArbitratorRequired=少なくとも1つの言語を設定する必要があります。\nデフォルトの言語を追加しました。
-account.arbitratorSelection.whichLanguages=あなたはどの言語を話しますか?
-account.arbitratorSelection.whichDoYouAccept=どの調停人を受け入れますか
-account.arbitratorSelection.autoSelect=一致する言語をの全ての調停人を自動選択する
-account.arbitratorSelection.regDate=登録日
-account.arbitratorSelection.languages=言語
-account.arbitratorSelection.cannotSelectHimself=調停人はトレードに自身を選べません
-account.arbitratorSelection.noMatchingLang=一致する言語がありません
-account.arbitratorSelection.noLang=少なくとも1つの共通言語を話す調停人のみを選択できます。
-account.arbitratorSelection.minOne=少なくとも1人の調停人を選択する必要があります。
+account.arbitratorRegistration.removedSuccess=You have successfully removed your registration from the Bisq network.
+account.arbitratorRegistration.removedFailed=Could not remove registration.{0}
+account.arbitratorRegistration.registerSuccess=You have successfully registered to the Bisq network.
+account.arbitratorRegistration.registerFailed=Could not complete registration.{0}
account.altcoin.yourAltcoinAccounts=あなたのアルトコインアカウント
-account.altcoin.popup.wallet.msg={1} のWebページに記載されているように、{0}ウォレットの使用に関する要件に必ず従ってください。\n(a)あなたが自分で鍵を管理していない、または(b)互換性のあるウォレットソフトウェアを使用していないような、中央集権化された取引所でウォレットを使用することは危険です。トレード資金の損失につながる可能性があります!\n調停人は{2}スペシャリストではなく、そのような場合には手助けできません。
+account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases.
account.altcoin.popup.wallet.confirm=どのウォレットを使うべきか理解しており、承認する
-account.altcoin.popup.arq.msg=BisqでARQをトレードするには、次の要件を理解し、満たす必要があります。\n\nARQを送信するには、store-tx-infoフラグを有効(新しいバージョンではデフォルト)にした公式のArQmA GUIウォレットまたはArQmA CLIウォレットのいずれかを使用する必要があります。係争が発生した場合に必要になるため、txキーにアクセスできることを確認してください。\narqma-wallet-cli(コマンドget_tx_keyを使用)\narqma-wallet-gui(履歴タブに移動し、支払い証明のために(P)ボタンをクリックします)\n\n通常のブロックエクスプローラーでは、転送は検証できません。\n\n係争の場合、調停人に次のデータを提供する必要があります。\n-txプライベートキー\n-トランザクションハッシュ\n-受信者のパブリックアドレス\n\n上記のデータを提供しない場合、または互換性のないウォレットを使用した場合は、係争のケースが失われます。 ARQ送信者は、係争の場合にARQ転送の検証を調停人に提供する責任があります。\n\n支払いIDは不要で、通常のパブリックアドレスのみです。\nこのプロセスがわからない場合は、ArQmA Discordチャンネル( https://discord.gg/s9BQpJT )またはArQmAフォーラム( https://labs.arqma.com )にアクセスして、詳細を確認してください。
-account.altcoin.popup.xmr.msg=BisqでXMRをトレードするには、次の要件を理解し、満たす必要があります。\n\nXMRを送信するには、store-tx-infoフラグを有効(新しいバージョンではデフォルト)にした公式のMonero GUIウォレットまたはMonero CLIウォレットを使用する必要があります。係争が発生した場合に必要になるため、txキーにアクセスできることを確認してください。\nmonero-wallet-cli(コマンドget_tx_keyを使用)\nmonero-wallet-gui(履歴タブに移動し、支払い証明のために(P)ボタンをクリックします)\n\nXMR checktxツール( https://xmr.llcoins.net/checktx.html )に加えて、ウォレットで検証を行うこともできます。\nmonero-wallet-cli:コマンド(check_tx_key)を使用します。\nmonero-wallet-gui:詳細設定 > 検証/確認 ページ。\n通常のブロックエクスプローラーでは、転送は検証できません。\n\n係争の場合、調停人に次のデータを提供する必要があります。\n-txプライベートキー\n-トランザクションハッシュ\n-受信者のパブリックアドレス\n\n上記のデータを提供しない場合、または互換性のないウォレットを使用した場合は、係争のケースが失われます。 XMR送信者は、係争の場合にXMR転送の検証を調停人に提供する責任があります。\n\n支払いIDは不要で、通常のパブリックアドレスのみです。\nこのプロセスについて不明な点がある場合は( https://www.getmonero.org/resources/user-guides/prove-payment.html )またはMoneroフォーラム( https://forum.getmonero.org )にアクセスして詳細を確認してください。
-account.altcoin.popup.blur.msg=BisqでBLURをトレードするには、次の要件を理解し、満たす必要があります。\n\nBLURを送信するには、Blur Network CLIまたはGUI ウォレットを使用する必要があります。\n\nCLIウォレットを使用している場合、転送の送信後にトランザクションハッシュ(tx ID)が表示されます。この情報を保存する必要があります。転送を送信した直後に、コマンド「get_tx_key」を使用してトランザクションプライベートキーを取得する必要があります。この手順を実行しないと、後でキーを取得できない場合があります。\n\nBlur Network GUIウォレットを使用している場合、トランザクションのプライベートキーとトランザクションIDは「履歴」タブで簡単に見つけることができます。送信後すぐに、目的のトランザクションを見つけてください。このトランザクションを含むボックスの右下隅にある「?」記号をクリックしてください。この情報を保存する必要があります。\n\n調停が必要な場合は、1) トランザクションID、2) トランザクションプライベートキー、3) 受信者のアドレス を調停人に提示する必要があります。調停人は、Blur Transaction Viewer( https://blur.cash/#tx-viewer )を使用してBLUR転送を検証します。\n\n必要な情報を調停人に提供しないと、係争のケースが失われます。係争のすべての場合において、BLUR送信者は、調停人に対する取引を確認する責任の100%を負担します。\n\nこれらの要件を理解していない場合は、Bisqで取引しないでください。まず、Blur Network Discord( https://discord.gg/dMWaqVW )で助けを求めてください。
-account.altcoin.popup.cash2.msg=BisqでCASH2をトレードするには、次の要件を理解し、満たす必要があります。\n\nCASH2を送信するには、Cash2 Walletバージョン3以降を使用する必要があります。\n\nトランザクションが送信された後、トランザクションIDが表示されます。この情報を保存する必要があります。トランザクションを送信した直後に、simplewalletのコマンド「getTxKey」を使用して、トランザクションのプライベートキーを取得する必要があります。\n\n調停が必要な場合は、1) トランザクションID、2) トランザクションプライベートキー、および 3) 受信者のCash2アドレス を調停人に提示する必要があります。その後、調停人は、Cash2 Block Explorer( https://blocks.cash2.org )を使用してCASH2転送を検証します。\n\n必要な情報を調停人に提供しないと、係争のケースが失われます。係争のすべての場合において、CASH2の送信者が、仲裁人への取引を確認する責任を100%負います。\n\nこれらの要件を理解していない場合は、Bisqで取引しないでください。まず、Cash2 Discord( https://discord.gg/FGfXAYN )で助けを求めてください。
-account.altcoin.popup.qwertycoin.msg=BisqでQwertycoinをトレードするには、次の要件を理解し、満たす必要があります。\n\nQWCを送信するには、公式のQWCウォレットバージョン5.1.3以降を使用する必要があります。\n\nトランザクションが送信された後、トランザクションIDが表示されます。この情報を保存する必要があります。トランザクションを送信した直後に、simplewalletのコマンド「get_Tx_Key」を使用してトランザクションのプライベートキーを取得する必要があります。\n\n調停が必要な場合は、1) トランザクションID、2) トランザクションプライベートキー、3)受信者のQWCアドレス を調停人に提示する必要があります。その後、調停人はQWC Block Explorer( https://explorer.qwertycoin.org )を使用してQWC転送を検証します。\n\n必要な情報を調停人に提供しないと、係争のケースが失われます。係争のすべての場合において、QWCの送信者が、調停人のトレードの検証における100%の責任を負います。\n\nこれらの要件を理解していない場合は、Bisqで取引しないでください。まず、QWC Discord( https://discord.gg/rUkfnpC )で助けを求めてください。
-account.altcoin.popup.drgl.msg=BisqでDragonglassをトレードするには、次の要件を理解し、満たす必要があります。\n\nDragonglassが提供するプライバシーのため、トランザクションはパブリックブロックチェーンでは検証できません。必要に応じて、TXN-Private-Keyを使用して支払いを証明できます。\nTXN-Private-Keyは、DRGLウォレット内からのみアクセスできるトランザクションごとに自動的に生成されるワンタイムキーです。\nDRGLウォレットGUI(トランザクション詳細ダイアログ内)またはDragonglass CLIシンプルウォレット(コマンド「get_tx_key」を使用)のいずれか。\n\nDRGLバージョン「Oathkeeper」以降には両方が「必要」です。\n\n係争が発生した場合、調停人に次のデータを提供する必要があります。\n-TXN-Private-Key\n-トランザクションハッシュ\n-受信者のパブリックアドレス\n\n上記のデータを( http://drgl.info/#check_txn )の入力として使用して、支払いの検証を行うことができます。\n\n上記のデータを提供しない場合、または互換性のないウォレットを使用した場合は、係争のケースが失われます。 Dragonglassの送信者は、係争の場合にDRGL転送の調停人に検証を提供する責任があります。 PaymentIDの使用は必要ありません。\n\nこのプロセスについて不明な点がある場合は、Dragonglass on Discord( http://discord.drgl.info )にアクセスしてください。
-account.altcoin.popup.ZEC.msg=Zcashを使用する場合、調停人はzアドレスを持つトランザクションを検証できないため、zアドレス(プライベート)ではなく、透過アドレス(tで始まる)のみを使用できます。
-account.altcoin.popup.XZC.msg=Zcoinを使用する場合、調停人はブロックエクスプローラーで追跡不可能なアドレスを持つトランザクションを検証できないため、追跡不可能なアドレスではなく、透過(追跡可能な)アドレスのみを使用できます。
+account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information.
+account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information.
+account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending XMR, you need to use either the official Monero GUI wallet or Monero CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nmonero-wallet-cli (use the command get_tx_key)\nmonero-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nIn addition to XMR checktx tool (https://xmr.llcoins.net/checktx.html) verification can also be accomplished in-wallet.\nmonero-wallet-cli : using command (check_tx_key).\nmonero-wallet-gui : on the Advanced > Prove/Check page.\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The XMR sender is responsible for providing verification of the XMR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit (https://www.getmonero.org/resources/user-guides/prove-payment.html) or the Monero forum (https://forum.getmonero.org) to find more information.
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs).
+account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW).
+account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/).
+account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN).
+account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC).
+account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help.
+account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses.
+account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer.
account.altcoin.popup.grin.msg=GRINでは、トランザクションを作成するために送信者と受信者の間の対話型プロセスが必要です。 GRINプロジェクトのWebページの指示に従って、GRINを確実に送受信してください(受信者はオンラインであるか、特定の時間枠内で少なくともオンラインである必要があります)。\n\nBisqは、Grinbox(Wallet713)ウォレットURL形式のみをサポートします。\n\nGRIN送信者は、GRINが正常に送信されたことを証明する必要があります。ウォレットがその証拠を提供できない場合、起こり得る係争はGRIN受信者に有利に解決されるでしょう。トランザクションプルーフをサポートする最新のGrinboxソフトウェアを使用し、GRINの送受信プロセスとプルーフの作成方法を理解してください。\n\nGrinboxプルーフツールの詳細については、https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only を参照してください。
account.altcoin.popup.beam.msg=BEAMではトランザクションを作成するために、送信者と受信者の間で対話型プロセスが必要です。\n\n必ずBEAMプロジェクトのWebページの指示に従って、BEAMを確実に送受信してください(受信者はオンラインであるか、特定の時間枠で少なくともオンラインである必要があります)。\n\nBEAM送信者は、BEAMが正常に送信されたことを証明する必要があります。そのような証拠を作成できるウォレットソフトウェアを使用してください。ウォレットが証拠を提供できない場合、起こり得る論争はBEAM受信者に有利に解決されるでしょう。
-account.altcoin.popup.pars.msg=ParsiCoinをBisqでトレードするには、次の要件を理解し、満たす必要があります。\n\nPARSを送信するには、公式のParsiCoin Walletバージョン3.0.0以降を使用する必要があります。\n\nGUIウォレット(ParsiPay)のTransactionsセクションでトランザクションハッシュとトランザクションキーを確認できます。Transactionを右クリックして、show detailsをクリックします。\n\n調停が必要な場合は、1) トランザクションハッシュ、2) トランザクションキー、および3) 受信者のPARSアドレス を調停人に提示する必要があります。その後、調停人は、ParsiCoin Block Explorer( http://explorer.parsicoin.net/#check_payment )を使用してPARS転送を検証します。\n\n必要な情報を調停人に提供しないと、係争のケースが失われます。係争のすべての場合において、ParsiCoinの送信者が、係争人のトランザクションの検証における100%の責任を負います。\n\nこれらの要件を理解していない場合は、Bisqで取引しないでください。まず、ParsiCoin Discord( https://discord.gg/c7qmFNh )で助けを求めてください。
+account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh).
+
+account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash.
account.fiat.yourFiatAccounts=あなたの各国通貨口座
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=BSQの担保された役割単位係数
dao.param.ISSUANCE_LIMIT=BSQのサイクルごとの発行制限
dao.param.currentValue=現在の値: {0}
+dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1})
dao.param.blocks={0} ブロック
dao.results.cycle.duration.label={0}の期間
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} ブロック
dao.results.cycle.value.postFix.isDefaultValue=(既定値)
dao.results.cycle.value.postFix.hasChanged=(投票により変更された)
-dao.results.invalidVotes=その投票サイクルで無効な投票がありました。投票がP2Pネットワークでうまく配布されなかった場合、それが起こる可能性があります。\n{0}
+dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=未定義
@@ -1503,7 +1578,7 @@ dao.proposal.create.publish=提案の発行
dao.proposal.create.publishing=提案の発行が進行中です...
dao.proposal=提案
dao.proposal.display.type=提案タイプ
-dao.proposal.display.name=名前/ニックネーム
+dao.proposal.display.name=Exact GitHub username
dao.proposal.display.link=詳細情報へのリンク
dao.proposal.display.link.prompt=提案へのリンク
dao.proposal.display.requestedBsq=BSQのリクエスト額
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=現在の投票:「{0}」。 次の
dao.proposal.display.myVote.accepted=承認
dao.proposal.display.myVote.rejected=拒否
dao.proposal.display.myVote.ignored=無視
-dao.proposal.myVote.summary=投票済: {0}; 投票の重さ: {1} (獲得済み: {2} + ステーク: {3});
+dao.proposal.display.myVote.unCounted=Vote was not included in result
+dao.proposal.myVote.summary=Voted: {0}; Vote weight: {1} (earned: {2} + stake: {3}) {4}
dao.proposal.myVote.invalid=投票が無効でした
dao.proposal.voteResult.success=承認
@@ -1680,6 +1756,7 @@ dao.monitor.daoState.utxoConflicts=UTXOの競合
dao.monitor.daoState.utxoConflicts.blockHeight=ブロックの高さ: {0}
dao.monitor.daoState.utxoConflicts.sumUtxo=全UTXOの合計: {0} BSQ
dao.monitor.daoState.utxoConflicts.sumBsq=全BSQの合計: {0} BSQ
+dao.monitor.daoState.checkpoint.popup=DAO state is not in sync with the network. After restart the DAO state will resync.
dao.monitor.proposal.headline=提案の状態
dao.monitor.proposal.table.headline=提案状態のハッシュのチェーン
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=BSQ トランザクション
dao.factsAndFigures.dashboard.marketPrice=市場データ
dao.factsAndFigures.dashboard.price=最新の BSQ/BTCのトレード価格(Bisqによる)
+dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price
+dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price
dao.factsAndFigures.dashboard.marketCap=時価総額(トレード価格に基づく)
dao.factsAndFigures.dashboard.availableAmount=合計利用可能BSQ
@@ -1769,10 +1848,6 @@ displayUpdateDownloadWindow.download.openDir=ダウンロードフォルダを
disputeSummaryWindow.title=概要
disputeSummaryWindow.openDate=チケットオープン日
disputeSummaryWindow.role=取引者の役割
-disputeSummaryWindow.evidence=証拠
-disputeSummaryWindow.evidence.tamperProof=改ざん防止の証拠
-disputeSummaryWindow.evidence.id=ID検証
-disputeSummaryWindow.evidence.video=ビデオ/スクリーンキャスト
disputeSummaryWindow.payout=トレード金額の支払い
disputeSummaryWindow.payout.getsTradeAmount=BTC {0}はトレード金額の支払いを受け取ります
disputeSummaryWindow.payout.getsAll=BTC {0} は全て受け取ります
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=銀行
disputeSummaryWindow.summaryNotes=概要ノート
disputeSummaryWindow.addSummaryNotes=概要ノートを追加
disputeSummaryWindow.close.button=チケットを閉じる
-disputeSummaryWindow.close.msg=チケットは {0} にクローズしました\n\n概要:\n{1} は改ざん防止の証拠を提供しました: {2}\n{3} はID検証を行いました: {4}\n{5} はスクリーンキャストまたはビデオを行いました: {6}\nBTC買い手の支払い額: {7}\nBTC売り手の支払い額: {8}\n\n要約メモ:\n{9}
+disputeSummaryWindow.close.msg=Ticket closed on {0}\n\nSummary:\nPayout amount for BTC buyer: {1}\nPayout amount for BTC seller: {2}\n\nSummary notes:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\nNext steps:\nOpen ongoing trade and accept or reject the suggested mediation
disputeSummaryWindow.close.closePeer=取引相手のチケットも閉じる必要があります!
+disputeSummaryWindow.close.txDetails.headline=Publish refund transaction
+disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction?
emptyWalletWindow.headline={0} 緊急ウォレットツール
emptyWalletWindow.info=UIから資金にアクセスできない緊急時にのみ使用してください。\n\nこのツールを使用すると、開いているオファーはすべて自動的に閉じられることに注意してください。\n\nこのツールを使用する前に、データディレクトリをバックアップしてください。これは「アカウント/バックアップ」で行えます。\n\n問題の原因を調査できるように、問題を報告し、GitHubまたはBisqフォーラムにバグレポートを提出してください。
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=ウォレット空にすると削除される
emptyWalletWindow.openOffers.yes=はい、そうです
emptyWalletWindow.sent.success=あなたのウォレットの残高は正常に送金されました。
-enterPrivKeyWindow.headline=招待された調停人のみが登録できます
+enterPrivKeyWindow.headline=Enter private key for registration
filterWindow.headline=フィルターリストを編集
filterWindow.offers=フィルター済オファー(コンマ区切り)
@@ -1815,6 +1895,8 @@ filterWindow.accounts=フィルター済トレードアカウントデータ:\n
filterWindow.bannedCurrencies=フィルター済通貨コード(コンマ区切り)
filterWindow.bannedPaymentMethods=フィルター済支払方法ID(コンマ区切り)
filterWindow.arbitrators=フィルター済調停人(コンマ区切り onionアドレス)
+filterWindow.mediators=Filtered mediators (comma sep. onion addresses)
+filterWindow.refundAgents=Filtered refund agents (comma sep. onion addresses)
filterWindow.seedNode=フィルター済シードノード(コンマ区切り onionアドレス)
filterWindow.priceRelayNode=フィルター済価格中継ノード(コンマ区切り onionアドレス)
filterWindow.btcNode=フィルター済ビットコインノード(コンマ区切り アドレス+ポート)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(メイカーの銀行ID/BIC/SWIFT)
offerDetailsWindow.offerersBankName=(メイカーの銀行名)
offerDetailsWindow.bankId=銀行ID(例:BICまたはSWIFT)
offerDetailsWindow.countryBank=メイカーの銀行の国名
-offerDetailsWindow.acceptedArbitrators=利用可能な調停人
offerDetailsWindow.commitment=約束
offerDetailsWindow.agree=同意します
offerDetailsWindow.tac=取引条件
@@ -1883,6 +1964,7 @@ tradeDetailsWindow.tradeDate=取引日
tradeDetailsWindow.txFee=マイニング手数料
tradeDetailsWindow.tradingPeersOnion=トレード相手のonionアドレス
tradeDetailsWindow.tradeState=トレード状態
+tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
walletPasswordWindow.headline=アンロックするためにパスワードを入力してください
@@ -1945,10 +2027,11 @@ popup.warning.incompatibleDB=互換性のないデータベースファイルが
popup.warning.startupFailed.twoInstances=Bisqは既に起動中です。Bisqを2つ起動することはできません。
popup.warning.cryptoTestFailed=自己コンパイルされたバイナリを使用しており、以下のビルド手順に従っていないようです https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys。\n\nそうではなく、公式のBisqバイナリを使用している場合は、GitHubページにバグレポートを提出してください。\nエラー={0}
popup.warning.tradePeriod.halfReached=ID {0}とのトレードは許可された最大トレード期間の半分に達しましたが、まだ完了していません\n\n取引期間は{1}で終了します\n\n詳細については、「ポートフォリオ/オープントレード」でトレード状態を確認してください。
-popup.warning.tradePeriod.ended=ID {0}とのトレードは許可された最大トレード期間に達しましたが、まだ完了していません。\n\nトレード期間は{1}で終了しました\n\n調停人に連絡するには、「ポートフォリオ/オープントレード」であなたのトレードを確認してください。
+popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
popup.warning.noTradingAccountSetup.headline=トレードアカウントが設定されていません
popup.warning.noTradingAccountSetup.msg=オファーを作成する前に、国内通貨またはアルトコインのアカウントを設定する必要があります。\nアカウントを設定しますか?
popup.warning.noArbitratorsAvailable=利用可能な調停人がいません。
+popup.warning.noMediatorsAvailable=There are no mediators available.
popup.warning.notFullyConnected=ネットワークへ完全に接続するまで待つ必要があります。\n起動までに約2分かかります。
popup.warning.notSufficientConnectionsToBtcNetwork=少なくとも{0}のビットコインネットワークへの接続が確立されるまでお待ちください。
popup.warning.downloadNotComplete=欠落しているビットコインブロックのダウンロードが完了するまで待つ必要があります。
@@ -1958,13 +2041,13 @@ popup.warning.examplePercentageValue=パーセントの数字を入力してく
popup.warning.noPriceFeedAvailable=その通貨で利用できる価格フィードはありません。パーセントベースの価格は使用できません。 固定価格を選択してください。
popup.warning.sendMsgFailed=トレード相手へのメッセージの送信に失敗しました。\nもう一度試してください。失敗し続ける場合はバグを報告してください。
popup.warning.insufficientBtcFundsForBsqTx=あなたはそのトランザクションのマイニング手数料を支払うのに十分なBTC残高を持っていません。 BTCウォレットに資金を入金してください。 \n不足残高: {0}
-popup.warning.bsqChangeBelowDustException=このトランザクションは、ダスト制限(5.46 BSQ)を下回るBSQ両替アウトプットを作成し、ビットコインネットワークによって拒否されます。\n\n両替アウトプットを回避するために、より高い金額を送信する必要があります(たとえば、送金額にダスト額を追加することによって)、またはダストアウトプットを生成しないようにウォレットにBSQ残高を追加する必要があります。\n\nダストアウトプットは{0}。
-popup.warning.btcChangeBelowDustException=このトランザクションは、ダスト制限(546 Satoshi)を下回るBSQ両替アウトプットを作成し、ビットコインネットワークによって拒否されます。\n\nダストアウトプットを生成しないように、あなたの送金額にダスト額を追加する必要があります。\n\nダストアウトプットは{0}。
+popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the Bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the Bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
popup.warning.insufficientBsqFundsForBtcFeePayment=BSQのトレード手数料を支払うのに十分なBSQ残高がありません。 BTCで手数料を支払うか、BSQウォレットに入金する必要があります。 BisqでBSQを購入できます。\n\n不足しているBSQ残高:{0}
popup.warning.noBsqFundsForBtcFeePayment=BSQウォレットにBSQのトレード手数料を支払うのに十分な残高がありません。
popup.warning.messageTooLong=メッセージが許容サイズ上限を超えています。いくつかに分けて送信するか、 https://pastebin.com のようなサービスにアップロードしてください。
-popup.warning.lockedUpFunds=失敗したトレードから残高をロックしました。\nロックされた残高: {0} \nデポジットtxアドレス: {1} \nトレードID: {2}。\n\n保留中のトレード画面でこのトレードを選択し、「alt + o」または「option + o」をクリックしてサポートチケットを開いてください。
+popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"."
popup.warning.nodeBanned={0}ノードの1つが禁止されました。禁止されたノードに接続されないように、アプリケーションを再起動してください。
popup.warning.priceRelay=価格中継
@@ -1993,19 +2076,36 @@ popup.shutDownInProgress.msg=アプリケーションのシャットダウンに
popup.attention.forTradeWithId=ID {0}とのトレードには注意が必要です
-popup.roundedFiatValues.headline=プライバシー新機能: 法定通貨の価格を四捨五入
-popup.roundedFiatValues.msg=あなたのトレードのプライバシーを高めるために{0}の金額は四捨五入されました。\n\nクライアントのバージョンに応じて、あなたは小数点以下の値または四捨五入された値のいずれかを受け渡します。\n\nどちらの値も、今後はトレードプロトコルに準拠しています。\n\nまた、四捨五入された法定通貨の金額にできるだけ近い値になるようにBTCの値が自動的に変更されることにも注意してください。
-
popup.info.multiplePaymentAccounts.headline=複数の支払いアカウントが使用可能です
popup.info.multiplePaymentAccounts.msg=このオファーに使用できる支払いアカウントが複数あります。あなたが正しいものを選んだことを確認してください。
-popup.dao.launch.headline=実現される完全なビジョン
-popup.dao.launch.governance.title=ガバナンス
-popup.dao.launch.governance=Bisqの取引ネットワークはすでに非中央集権化されています。\nBisq DAOにより、Bisqのリーダーシップも非中央集権化され、Bisqは検閲に対して非常に抵抗力のあるものになりました。
-popup.dao.launch.trading.title=トレード
-popup.dao.launch.trading=BSQ(カラードビットコイン)をトレードしてBisqガバナンスに参加しましょう。 あなたはBisqの他のアセットと同じようにBSQを売買することができます。
-popup.dao.launch.cheaperFees.title=より安い手数料
-popup.dao.launch.cheaperFees=BSQを使用して取引手数料を90%割引にしましょう。 お金を節約し、同時にプロジェクトを支援しましょう!\n\n
+popup.news.launch.headline=Two Major Updates
+popup.news.launch.accountSigning.headline=ACCOUNT SIGNING
+popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer.
+popup.news.launch.ntp.headline=NEW TRADE PROTOCOL
+popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant.
+
+popup.accountSigning.selectAccounts.headline=Select payment accounts
+popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign.
+popup.accountSigning.selectAccounts.signAll=Sign all payment methods
+popup.accountSigning.selectAccounts.datePicker=Select point of time until which accounts will be signed
+
+popup.accountSigning.confirmSelectedAccounts.headline=Confirm selected payment accounts
+popup.accountSigning.confirmSelectedAccounts.description=Based on your input, {0} payment accounts will be selected.
+popup.accountSigning.confirmSelectedAccounts.button=Confirm payment accounts
+popup.accountSigning.signAccounts.headline=Confirm signing of payment accounts
+popup.accountSigning.signAccounts.description=Based on your selection, {0} payment accounts will be signed.
+popup.accountSigning.signAccounts.button=Sign payment accounts
+popup.accountSigning.signAccounts.ECKey=Enter private arbitrator key
+popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey
+
+popup.accountSigning.success.headline=Congratulations
+popup.accountSigning.success.description=All {0} payment accounts were successfully signed!
+popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0}
+popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1}
+popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0}
+popup.accountSigning.peerSigner=One of your accounts is mature enough to sign other payment accounts and the initial limit for one of your accounts has been lifted.\n\n{0}
####################################################################
# Notifications
@@ -2071,6 +2171,7 @@ list.currency.editList=通貨リストを編集する
table.placeholder.noItems=現在利用可能な{0}がありません
table.placeholder.noData=現在利用可能なデータがありません
+table.placeholder.processingData=Processing data...
peerInfoIcon.tooltip.tradePeer=トレード相手
@@ -2093,7 +2194,8 @@ peerInfo.title=ピア情報
peerInfo.nrOfTrades=完了した取引数
peerInfo.notTradedYet=あなたは今までそのユーザーと取引していません。
peerInfo.setTag=そのピアにタグを設定する
-peerInfo.age=支払いアカウントの年齢
+peerInfo.age.noRisk=支払いアカウントの年齢
+peerInfo.age.chargeBackRisk=Time since signing
peerInfo.unknownAge=年齢不明
addressTextField.openWallet=既定のビットコインウォレットを開く
@@ -2154,7 +2256,7 @@ BTC_REGTEST=ビットコイン(Regtest)
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=ビットコインDAOテストネット(非推奨)
# suppress inspection "UnusedProperty"
-BTC_DAO_BETANET=ビットコインDAOベータネット(ビットコイン メインネット)
+BTC_DAO_BETANET=Bisq DAO Betanet (Bitcoin Mainnet)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=ビットコインDAO Regtest
@@ -2253,6 +2355,7 @@ payment.accepted.banks=利用可能な銀行 (ID)
payment.mobile=携帯電話番号
payment.postal.address=郵便住所
payment.national.account.id.AR=CBU番号
+shared.accountSigningState=Account signing status
#new
payment.altcoin.address.dyn={0}アドレス
@@ -2261,7 +2364,7 @@ payment.accountNr=アカウント番号
payment.emailOrMobile=メールまたは携帯電話番号
payment.useCustomAccountName=任意のアカウント名を使う
payment.maxPeriod=許可された最大トレード期間
-payment.maxPeriodAndLimit=最大トレード期間: {0} / 最大トレード制限: {1} / アカウントの年齢: {2}
+payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3}
payment.maxPeriodAndLimitCrypto=最大トレード期間: {0} / 最大トレード制限: {1}
payment.currencyWithSymbol=通貨: {0}
payment.nameOfAcceptedBank=利用可能な銀行の名前
@@ -2283,13 +2386,14 @@ payment.clearXchange.info=Zelle (ClearXchange) の使用に関する要件を満
payment.moneyGram.info=MoneyGramを使用する場合、BTCの買い手は認証番号と領収書の写真をEメールでBTCの売り手に送信する必要があります。領収書には、売り手の氏名、市区町村、国、金額を明確に記載する必要があります。買い手には、取引プロセスにて売り手のEメールが表示されます。
payment.westernUnion.info=Western Unionを使用する場合、BTCの買い手はMTCN(追跡番号)と領収書の写真をEメールでBTCの売り手に送信する必要があります。領収書には、売り手の氏名、市区町村、国、金額を明確に記載する必要があります。買い手には、取引プロセスにて売り手のEメールが表示されます。
payment.halCash.info=HalCashを使用する場合、BTCの買い手は携帯電話からのテキストメッセージを介してBTCの売り手にHalCashコードを送信する必要があります。\n\n銀行がHalCashで送金できる最大額を超えないようにしてください。 1回の出金あたりの最小金額は10EURで、最大金額は600EURです。繰り返し出金する場合は、1日に受取人1人あたり3000EUR、1ヶ月に受取人1人あたり6000EURです。あなたの銀行でも、ここに記載されているのと同じ制限を使用しているか、これらの制限を銀行と照合して確認してください。\n\n出金額は10の倍数EURでなければ、ATMから出金できません。 オファーの作成画面およびオファー受け入れ画面のUIは、EUR金額が正しくなるようにBTC金額を調整します。価格の変化とともにEURの金額は変化するため、市場ベースの価格を使用することはできません。\n\n係争が発生した場合、BTCの買い手はEURを送ったという証明を提出する必要があります。
-payment.limits.info=すべての銀行振込にはある程度のチャージバックのリスクがあることに気を付けて下さい。\n\nこのリスクを軽減するために、Bisqは下記の2つの要因に基づいて取引ごとの制限を設定します。\n\n1.使用する支払い方法でのチャージバックリスクの推定レベル\n2.お支払い方法のアカウントの年齢\n\nあなたが今作成しているアカウントは新しいもので、年齢は0です。 あなたのアカウントが2ヶ月の期間にわたって年齢が上がるにつれて、あなたの取引ごとの制限はそれと共に成長します:\n\n●1ヶ月目の間、1取引あたりの上限は{0}になります\n●2ヵ月目の間、あなたの取引ごとの上限は{1}になります\n●2ヶ月目以降は、1取引あたりの上限は{2}になります\n\n取引できる合計回数には制限はありません。
+payment.limits.info=すべての銀行振込にはある程度のチャージバックのリスクがあることに気を付けて下さい。\n\nこのリスクを軽減するために、Bisqは下記の2つの要因に基づいて取引ごとの制限を設定します。\n\n1.使用する支払い方法でのチャージバックリスクの推定レベル\n2.お支払い方法のアカウントの年齢\n\nあなたが今作成しているアカウントは新しいもので、年齢は0です。 あなたのアカウントが2ヶ月の期間にわたって年齢が上がるにつれて、あなたの取引ごとの制限はそれと共に成長します:\n\n●1ヶ月目の間、1取引あたりの上限は{0}になります\n●2ヵ月目の間、1取引あたりの上限は{1}になります\n●2ヶ月目以降は、1取引あたりの上限は{2}になります\n\n取引できる合計回数には制限はありません。
+payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade buy limits based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account you just created carries some chargeback risk and is not yet signed by an arbitrator or trusted peer, so it is limited to buying {0} per trade. After it is signed, buy limits will increase as follows:\n\n● Before signing, and up to 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase merely as account age increases. More information is at https://docs.bisq.network/payment-methods#account-signing.\n\nThere are no limits on the number of trades you can make.
payment.cashDeposit.info=あなたの銀行が他の人の口座に現金入金を送ることを許可していることを確認してください。たとえば、Bank of America と Wells Fargo では、こうした預金は許可されなくなりました。
payment.revolut.info=Revolutアカウントに使用した電話番号がRevolutに登録されていることを確認してください。そうでなければ、BTCの買い手はあなたに資金を送ることができません。
-payment.usPostalMoneyOrder.info=為替は、Bisqで利用できるよりプライベートな法定通貨の購入方法の1つです。\n\nただし、それらの使用により関連するリスクが増加する可能性があることに注意してください。送金された為替が盗まれた場合、Bisqは一切の責任を負いません。そのような場合、調停人は、追跡情報と領収書を作成できる場合、為替の送金者にBTCを裁定します。他の誰かによって換金されるリスクを最小限に抑えるために、送金者は送金先にBTC売り手の名前を書くことをお勧めします。
+payment.usPostalMoneyOrder.info=Money orders are one of the more private fiat purchase methods available on Bisq.\n\nHowever, please be aware of potentially increased risks associated with their use. Bisq will not bear any responsibility in case a sent money order is stolen, and the mediator or arbitrator will in such cases award the BTC to the sender of the money order, provided they can produce tracking information and receipts. It may be advisable for the sender to write the BTC seller's name on the money order, in order to minimize the risk that the money order is cashed by someone else.
payment.f2f.contact=連絡情報
payment.f2f.contact.prompt=取引相手からどのように連絡を受け取りたいですか?(メールアドレス、電話番号…)
@@ -2299,9 +2403,9 @@ payment.f2f.optionalExtra=オプションの追加情報
payment.f2f.extra=追加情報
payment.f2f.extra.prompt=メイカーは「取引条件」を定めたり、公開連絡先情報を追加したりできます。 これはオファーと一緒に表示されます。
-payment.f2f.info=「対面」トレードには違うルールがあり、オンライントレードとは異なるリスクを伴います。\n\n主な違いは以下の通りです。\n●取引者は、提供される連絡先の詳細を使用して、出会う場所と時間に関する情報を交換する必要があります。\n●取引者は自分のノートパソコンを持ってきて、集合場所で「送金」と「入金」の確認をする必要があります。\n●メイカーに特別な「取引条件」がある場合は、アカウントの「追加情報」テキストフィールドにその旨を記載する必要があります。\n●オファーを受けると、テイカーはメイカーの「トレード条件」に同意したものとします。\n●係争が発生した場合、集合場所で何が起きたのかについての改ざん防止証拠を入手することは通常困難であるため、調停人はあまり役に立ちません。このような場合、BTCの資金は無期限に、または取引者が合意に達するまでロックされる可能性があります。\n\n「対面」トレードでの違いを完全に理解しているか確認するためには、次のURLにある手順と推奨事項をお読みください。'https://docs.bisq.network/trading-rules.html#f2f-trading'
+payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
payment.f2f.info.openURL=Webページを開く
-payment.f2f.offerbook.tooltip.countryAndCity=国と市区町村: {0} / {1}
+payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
payment.f2f.offerbook.tooltip.extra=追加情報: {0}
payment.japan.bank=銀行
@@ -2321,7 +2425,7 @@ CASH_DEPOSIT=現金入金
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=対面(直接)
-JAPAN_BANK=日本全銀振込
+JAPAN_BANK=Japan Bank Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=国立銀行
@@ -2502,7 +2606,12 @@ validation.pattern=入力は次の形式である必要があります: {0}
validation.noHexString=入力がHEXフォーマットではありません。
validation.advancedCash.invalidFormat=有効なメールアドレスか次のウォレットID形式である必要があります: X000000000000
validation.invalidUrl=有効なURLではありません
-validation.mustBeDifferent=現在の値と異なる値を入力してください
+validation.mustBeDifferent=Your input must be different from the current value
validation.cannotBeChanged=パラメーターは変更できません
validation.numberFormatException=例外の数値フォーマット {0}
validation.mustNotBeNegative=負の値は入力できません
+validation.phone.missingCountryCode=Need two letter country code to validate phone number
+validation.phone.invalidCharacters=Phone number {0} contains invalid characters
+validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number
+validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number
+validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}.
diff --git a/core/src/main/resources/i18n/displayStrings_pt.properties b/core/src/main/resources/i18n/displayStrings_pt.properties
index 11c503aaeb..52039e2536 100644
--- a/core/src/main/resources/i18n/displayStrings_pt.properties
+++ b/core/src/main/resources/i18n/displayStrings_pt.properties
@@ -53,15 +53,19 @@ shared.oneOffer=oferta
shared.multipleOffers=ofertas
shared.Offer=Oferta
shared.openOffers=abrir ofertas
-shared.trade=negociação
-shared.trades=negociações
-shared.openTrades=abrir negociações
+shared.trade=negócio
+shared.trades=negócios
+shared.openTrades=negócios abertos
shared.dateTime=Data/Hora
shared.price=Preço
shared.priceWithCur=Preço em {0}
shared.priceInCurForCur=Preço em {0} para 1 {1}
shared.fixedPriceInCurForCur=Preço fixo em {0} para 1 {1}
shared.amount=Quantia
+shared.txFee=Taxa da transação
+shared.makerFee=Taxa de ofertante
+shared.buyerSecurityDeposit=Depósito do comprador
+shared.sellerSecurityDeposit=Depósito do vendedor
shared.amountWithCur=Quantia em {0}
shared.volumeWithCur=Volume em {0}
shared.currency=Moeda
@@ -78,12 +82,12 @@ shared.revert=Reverter Tx
shared.select=Selecionar
shared.usage=Uso
shared.state=Estado
-shared.tradeId=ID de Negociação
+shared.tradeId=ID do Negócio
shared.offerId=ID de Oferta
shared.bankName=Nome do banco
shared.acceptedBanks=Bancos aceites
shared.amountMinMax=Quantia (mín - máx)
-shared.amountHelp=Se a oferta tem uma quantia mínima ou máxima definida, poderá negociar qualquer valor dentro deste intervalo.
+shared.amountHelp=Se a oferta tem uma quantia mínima ou máxima definida, poderá negociar qualquer quantia dentro deste intervalo.
shared.remove=Remover
shared.goTo=Ir para {0}
shared.BTCMinMax=BTC (mín - máx)
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=Por favor envia a confirmação de novo
shared.exportCSV=Exportar para csv
shared.exportJSON=Exportar para JSON
shared.noDateAvailable=Sem dada disponível
-shared.arbitratorsFee=Taxa do árbitro
shared.noDetailsAvailable=Sem detalhes disponíveis
shared.notUsedYet=Ainda não usado
shared.date=Data
@@ -127,7 +130,7 @@ shared.applyAndShutDown=Aplicar e desligar
shared.selectPaymentMethod=Selecionar método de pagamento
shared.accountNameAlreadyUsed=Este nome de conta já está a ser utilizado numa conta guardada.\nPor favor use um outro nome.
shared.askConfirmDeleteAccount=Você realmente quer apagar a conta selecionada?
-shared.cannotDeleteAccount=Você não pode apagar a conta porque ela está a ser usada numa oferta aberta ou num negócio.
+shared.cannotDeleteAccount=Você não pode apagar a conta pois ela está sendo usada em uma oferta aberta ou negócio.
shared.noAccountsSetupYet=Ainda não há contas configuradas
shared.manageAccounts=Gerir contas
shared.addNewAccount=Adicionar uma nova conta
@@ -149,11 +152,11 @@ shared.save=Guardar
shared.onionAddress=Endereço onion
shared.supportTicket=bilhete de apoio
shared.dispute=disputa
+shared.mediationCase=caso de mediação
shared.seller=vendedor
shared.buyer=comprador
shared.allEuroCountries=Todos os países do Euro
shared.acceptedTakerCountries=Países aceites para aceitador
-shared.arbitrator=Árbitro selecionado
shared.tradePrice=Preço de negócio
shared.tradeAmount=Quantia de negócio
shared.tradeVolume=Volume de negócio
@@ -181,7 +184,7 @@ shared.addLanguage=Adicionar idioma
shared.total=Total
shared.totalsNeeded=Fundos necessários
shared.tradeWalletAddress=Endereço da carteira do negócio
-shared.tradeWalletBalance=Carteira de saldo do negócio
+shared.tradeWalletBalance=Saldo da carteira de negócio
shared.makerTxFee=Ofertante: {0}
shared.takerTxFee=Aceitador: {0}
shared.securityDepositBox.description=Depósito de segurança para BTC {0}
@@ -203,6 +206,15 @@ shared.proposal=Proposta
shared.votes=Votos
shared.learnMore=Saber mais
shared.dismiss=Ignorar
+shared.selectedArbitrator=Árbitro selecionado
+shared.selectedMediator=Mediador selecionado
+shared.selectedRefundAgent=Árbitro selecionado
+shared.mediator=Mediador
+shared.arbitrator=Árbitro
+shared.refundAgent=Árbitro
+shared.refundAgentForSupportStaff=Agente de Reembolso
+shared.delayedPayoutTxId=ID da transação do colateral de reembolso
+
####################################################################
# UI views
@@ -244,7 +256,7 @@ mainView.footer.btcInfo.synchronizingWith=Sincronizando com
mainView.footer.btcInfo.synchronizedWith=Sincronizado com
mainView.footer.btcInfo.connectingTo=Conectando à
mainView.footer.btcInfo.connectionFailed=falha na conexão
-mainView.footer.p2pInfo=Pares na rede P2P: {0}
+mainView.footer.p2pInfo=Pares na rede do Bisq: {0}
mainView.footer.daoFullNode=Nó completo da OAD
mainView.bootstrapState.connectionToTorNetwork=(1/4) Conectando à rede Tor....
@@ -254,10 +266,10 @@ mainView.bootstrapState.initialDataReceived=(4/4) Dados iniciais recebidos
mainView.bootstrapWarning.noSeedNodesAvailable=Nenhum nó semente disponível
mainView.bootstrapWarning.noNodesAvailable=Sem nós semente e pares disponíveis
-mainView.bootstrapWarning.bootstrappingToP2PFailed=O bootstrap para a rede P2P falhou
+mainView.bootstrapWarning.bootstrappingToP2PFailed=O bootstrap para a rede do Bisq falhou
mainView.p2pNetworkWarnMsg.noNodesAvailable=Não há nós de semente ou pares persistentes disponíveis para solicitar dados.\nPor favor, verifique a sua conexão de Internet ou tente reiniciar o programa.
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=A conexão com a rede P2P falhou (erro reportado: {0}).\nPor favor, verifique sua conexão com a Internet ou tente reiniciar o programa.
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=A conexão com a rede do Bisq falhou (erro reportado: {0}).\nPor favor, verifique sua conexão com a Internet ou tente reiniciar o programa.
mainView.walletServiceErrorMsg.timeout=A conexão com a rede Bitcoin falhou por causa de tempo esgotado.
mainView.walletServiceErrorMsg.connectionError=A conexão com a rede Bitcoin falhou devido ao erro: {0}
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=Fechar:
market.trades.tooltip.candle.high=Alta:
market.trades.tooltip.candle.low=Baixa:
market.trades.tooltip.candle.average=Média:
+market.trades.tooltip.candle.median=Mediano:
market.trades.tooltip.candle.date=Data:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=Sede do banco aceite (aceitador):\n {0}
offerbook.availableOffers=Ofertas disponíveis
offerbook.filterByCurrency=Filtrar por moeda
offerbook.filterByPaymentMethod=Filtrar por método de pagamento
+offerbook.timeSinceSigning=Tempo desde a assinatura
+offerbook.timeSinceSigning.info=Esta conta foi verificada e {0}
+offerbook.timeSinceSigning.info.arbitrator=assinada pelo árbitro e pode assinar contas de pares
+offerbook.timeSinceSigning.info.peer=assinada por um par, esperando que os limites sejam aumentados
+offerbook.timeSinceSigning.info.peerLimitLifted=assinada por um par e os limites foram aumentados
+offerbook.timeSinceSigning.info.signer=assinada por um par e pode assinar contas de pares (limites aumentados)
+offerbook.timeSinceSigning.daysSinceSigning={0} dias
+offerbook.timeSinceSigning.daysSinceSigning.long={0} desde a assinatura
+
+offerbook.timeSinceSigning.help=Quando você completa com sucesso um negócio com um par que tenha uma conta de pagamento assinada, a sua conta de pagamento é assinada .\n{0} dias depois, o limite inicial de {1} é aumentado e a sua conta pode assinar contas de pagamento de outros pares.
+offerbook.timeSinceSigning.notSigned=Ainda não assinada
+offerbook.timeSinceSigning.notSigned.noNeed=N/D
+shared.notSigned=Esta conta ainda não foi assinada
+shared.notSigned.noNeed=Este tipo de conta não usa assinaturas
offerbook.nrOffers=Nº de ofertas: {0}
offerbook.volume={0} (mín - máx)
@@ -345,14 +372,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=Você não tem uma conta de ne
offerbook.warning.noMatchingAccount.headline=Não há conta de negociação compatível.
offerbook.warning.noMatchingAccount.msg=Para aceitar esta oferta, você precisará configurar uma conta de pagamento usando este método de pagamento.\n\nVocê gostaria de fazer isso agora?
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=Esta oferta não pode ser aceite por causa de restrições de segurança com base nos seguintes critérios:\n- conta de pagamento do ofertante foi criada após 1 de Março de 2019\n- A quantia de negócio mínima é superior à 0,01 BTC\n- O método de pagamento para a oferta é considerado arriscado para estornos bancários\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=Esta oferta não pode ser aceite devido às restrições de negócio da contraparte
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=Esta oferta não pode ser aceite por causa de restrições de segurança com base nos seguintes critérios:\n- A sua conta de pagamento foi criada após 1 de Março de 2019\n- A quantia de negócio mínima é superior à 0,01 BTC\n- O método de pagamento para a oferta é considerado arriscado para estornos bancários\n\n{0}
+offerbook.warning.newVersionAnnouncement=Com esta versão do software, os pares de negociação podem verificar e assinar as contas de pagamento uns dos outros para criar uma rede de contas de pagamento confiáveis.\n\nApós a negociação bem-sucedida com um par com uma conta de pagamento verificada, a sua conta de pagamento será assinada e os limites de negociação serão aumentados após um determinado intervalo de tempo (a duração desse intervalo é baseada no método de verificação).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=Foi necessário implementar esta restrição como uma medida de curto prazo para aumentar a segurança.\n\nA próxima versão do software irá fornecer ferramentas de proteção mais robustas de modo a que ofertas com este perfil de risco possam ser negociadas novamente.
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=A quantia de negócio autorizada é limitada à 0,01 BTC por causa de restrições de segurança com base nos seguintes critérios:\n- A conta do comprador foi criada após 1 de Março de 2019\n- O método de pagamento para esta oferta é considerado arriscado para estornos bancárias\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=A quantia de negócio autorizada é limitada à 0,01 BTC por causa de restrições de segurança com base nos seguintes critérios:\n- A sua conta de pagamento foi criada após 1 de Março de 2019\n- O método de pagamento para esta oferta é considerado arriscado para estornos bancárias\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=A quantia de negócio é limitada à {0} devido à restrições de segurança baseadas nos seguinte critérios:\n- A conta do comprador não foi assinada por um árbitro ou um par\n- O tempo decorrido desde a assinatura da conta do comprador não é de pelo menos 30 dias\n- O método de pagamento para esta oferta é considerado arriscado para estornos bancários\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=A quantia de negócio é limitada à {0} devido à restrições de segurança baseadas nos seguinte critérios:\n- A sua conta não foi assinada por um árbitro ou um par\n- O tempo decorrido desde a assinatura da sua conta não é de pelo menos 30 dias\n- O método de pagamento para esta oferta é considerado arriscado para estornos bancários\n\n{1}
offerbook.warning.wrongTradeProtocol=Essa oferta requer uma versão de protocolo diferente da usada na sua versão do software.\n\nPor favor, verifique se você tem a versão mais recente instalada, caso contrário, o usuário que criou a oferta usou uma versão mais antiga.\n\nOs utilizadores não podem negociar com uma versão de protocolo de negócio incompatível.
offerbook.warning.userIgnored=Você adicionou o endereço onion daquele utilizador à sua lista de endereços ignorados.
@@ -478,7 +503,7 @@ takeOffer.failed.offerTaken=Não é possível aceitar a oferta pois ela já foi
takeOffer.failed.offerRemoved=Não é possível aceitar a oferta pois ela foi removida.
takeOffer.failed.offererNotOnline=Aceitação da oferta falhou pois o ofertante já não está online.
takeOffer.failed.offererOffline=Não pode aceitar a oferta porque o ofertante está offline.
-takeOffer.warning.connectionToPeerLost=Perdeu a conexão ao ofertante.\nEle pode ter ficado offline ou fechado a conexão consigo devido à demasiadas conexões abertas.\n\nSe ainda consegue ver a sua oferta no livro de ofertas pode tentar aceita-la de novo.
+takeOffer.warning.connectionToPeerLost=Perdeu a conexão ao ofertante.\nEle pode ter ficado offline ou fechado a conexão consigo devido à demasiadas conexões abertas.\n\nSe ainda consegue ver a sua oferta no livro de ofertas pode tentar aceitar a oferta de novo.
takeOffer.error.noFundsLost=\n\nAinda não saíram nenhuns fundos da sua carteira.\nPor favor, tente reiniciar o seu programa e verifique sua conexão de rede para ver se você pode resolver o problema.
takeOffer.error.feePaid=\n\nPor favor, tente reiniciar o seu programa e verificar a sua conexão de rede para ver se pode resolver o problema.
@@ -516,8 +541,8 @@ portfolio.pending.step3_seller.confirmPaymentReceived=Confirmar pagamento recebi
portfolio.pending.step5.completed=Concluído
portfolio.pending.step1.info=A transação de depósito foi publicada.\n{0} precisa aguardar pelo menos uma confirmação da blockchain antes de iniciar o pagamento.
-portfolio.pending.step1.warn=A transação de depósito ainda não foi confirmada.\nIsso pode acontecer em casos raros, quando a taxa de financiamento de um negociador proveniente de uma carteira externa foi muito baixa.
-portfolio.pending.step1.openForDispute=A transação de depósito ainda não foi confirmada.\nIsso pode acontecer em casos raros, quando a taxa de financiamento de um negociador proveniente de uma carteira externa foi muito baixa.\nO período máx. para o negócio acabou.\n\nPor favor, entre em contacto com o árbitro para abrir uma disputa.
+portfolio.pending.step1.warn=A transação de depósito ainda não foi confirmada. Isso pode acontecer em casos raros, quando a taxa de financiamento de um negociador proveniente de uma carteira externa foi muito baixa.
+portfolio.pending.step1.openForDispute=A transação de depósito ainda não foi confirmada. Você pode esperar mais tempo ou entrar em contato com o mediador para obter assistência.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=Seu negócio atingiu pelo menos uma confirmação da blockchain.\n(Você pode esperar por mais confirmações se quiser - 6 confirmações são consideradas muito seguras.)\n\n
@@ -535,8 +560,10 @@ portfolio.pending.step2_buyer.altcoin=Por favor transfira da sua carteira extern
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=Por favor vá à um banco e pague{0} ao vendedor de BTC.\n\n
portfolio.pending.step2_buyer.cash.extra=REQUERIMENTO IMPORTANTE:\nDepois de ter feito o pagamento escreva no recibo de papel: SEM REEMBOLSOS.\nEm seguida, rasgue-o em 2 partes, tire uma foto e envie-a para o endereço de e-mail do vendedor de BTC.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=Por favor pague {0} ao vendedor de BTC usando MoneyGram.\n\n
portfolio.pending.step2_buyer.moneyGram.extra=REQUERIMENTO IMPORTANTE:\nDepois de ter feito o pagamento envie o Número de autorização e uma foto do recibo por email para o vendedor de BTC\nO recibo deve mostrar claramente o nome completo do vendedor, o país, o estado e a quantia. O email do vendedor é: {0}.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=Por favor pague {0} ao vendedor de BTC usando Western Union.\n\n
portfolio.pending.step2_buyer.westernUnion.extra=REQUISITO IMPORTANTE:\nDepois de ter feito o pagamento, envie o MTCN (número de rastreamento) e uma foto do recibo por e-mail para o vendedor de BTC.\nO recibo deve mostrar claramente o nome completo do vendedor, a cidade, o país e a quantia. O e-mail do vendedor é: {0}.
@@ -544,14 +571,15 @@ portfolio.pending.step2_buyer.westernUnion.extra=REQUISITO IMPORTANTE:\nDepois d
portfolio.pending.step2_buyer.postal=Por favor envie {0} por \"US Postal Money Order\" para o vendedor de BTC.\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.bank=Por favor vá à sua página web de serviços bancários online e pague {0} ao vendedor de BTC.\n\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=Por favor contacte o vendedor de BTC pelo contacto fornecido e marque um encontro para pagar {0}.\n\n
portfolio.pending.step2_buyer.startPaymentUsing=Iniciar pagamento usando {0}
portfolio.pending.step2_buyer.amountToTransfer=Quantia a transferir
portfolio.pending.step2_buyer.sellersAddress=Endereço {0} do vendedor
portfolio.pending.step2_buyer.buyerAccount=A sua conta de pagamento a ser usada
portfolio.pending.step2_buyer.paymentStarted=Pagamento iniciado
-portfolio.pending.step2_buyer.warn=Você ainda não fez o seu pagamento de {0}!\nEsteja ciente de que o negócio deve ser concluído até {1}, caso contrário o negócio será investigado pelo árbitro.
-portfolio.pending.step2_buyer.openForDispute=Você não concluiu o seu pagamento!\nO período máx. para o negócio acabou.\n\nPor favor, entre em contacto com o árbitro para abrir uma disputa.
+portfolio.pending.step2_buyer.warn=Você ainda não fez o seu pagamento de {0}!\nSaiba que o negócio tem de ser concluído até {1}.
+portfolio.pending.step2_buyer.openForDispute=Você não completou o seu pagamento!\nO período máx. para o negócio acabou. Por favor entre em contacto com o mediador para assistência.
portfolio.pending.step2_buyer.paperReceipt.headline=Você enviou o recibo de papel para o vendedor de BTC?
portfolio.pending.step2_buyer.paperReceipt.msg=Lembre-se:\nPrecisa escrever no recibo de papel: SEM REEMBOLSOS.\nEm seguida, rasgue-o em 2 partes, tire uma foto e envie-a para o endereço de e-mail do vendedor de BTC.
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=Enviar Número de autorização e recibo
@@ -569,7 +597,11 @@ portfolio.pending.step2_seller.waitPayment.headline=Aguardar o pagamento
portfolio.pending.step2_seller.f2fInfo.headline=Informação do contacto do comprador
portfolio.pending.step2_seller.waitPayment.msg=A transação de depósito tem pelo menos uma confirmação da blockchain.\nVocê precisa esperar até que o comprador de BTC inicie o pagamento {0}.
portfolio.pending.step2_seller.warn=O comprador do BTC ainda não efetuou o pagamento de {0}.\nVocê precisa esperar até que eles tenham iniciado o pagamento.\nSe o negócio não for concluído em {1}, o árbitro irá investigar.
-portfolio.pending.step2_seller.openForDispute=O comprador de BTC não iniciou o seu pagamento!\nO período máx. permitido para o negócio acabou.\nVocê pode esperar e dar mais tempo ao seu par de negociação ou entrar em contacto com o árbitro para abrir uma disputa.
+portfolio.pending.step2_seller.openForDispute=O comprador de BTC não iniciou o seu pagamento!\nO período máx. permitido para o negócio acabou.\nVocê pode esperar e dar mais tempo ao seu par de negociação ou entrar em contacto com o mediador para assistência.
+
+tradeChat.chatWindowTitle=Janela de chat para o negócio com o ID ''{0}''
+tradeChat.openChat=Abrir janela de chat
+tradeChat.rules=Você pode comunicar com o seu par de negociação para resolver problemas com este negócio.\nNão é obrigatório responder no chat.\nSe algum negociante infringir alguma das regras abaixo, abra uma disputa e reporte-o ao mediador ou ao árbitro.\n\nRegras do chat:\n\t● Não envie nenhum link (risco de malware). Você pode enviar o ID da transação e o nome de um explorador de blocos.\n\t● Não envie as suas palavras-semente, chaves privadas, senhas ou outra informação sensitiva!\n\t● Não encoraje negócios fora do Bisq (sem segurança).\n\t● Não engaje em nenhuma forma de scams de engenharia social.\n\t● Se um par não responde e prefere não comunicar pelo chat, respeite a sua decisão.\n\t● Mantenha o âmbito da conversa limitado ao negócio. Este chat não é um substituto para o messenger ou uma caixa para trolls.\n\t● Mantenha a conversa amigável e respeitosa.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=Indefinido
@@ -578,7 +610,7 @@ message.state.SENT=Mensagem enviada
# suppress inspection "UnusedProperty"
message.state.ARRIVED=A mensagem chegou ao par
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=Mensagem guardada na caixa de correio
+message.state.STORED_IN_MAILBOX=Mensagem de pagamento enviada mais ainda não recebida pelo par
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=O par confirmou a recepção da mensagem
# suppress inspection "UnusedProperty"
@@ -589,22 +621,23 @@ portfolio.pending.step3_buyer.wait.info=Aguardando confirmação do vendedor de
portfolio.pending.step3_buyer.wait.msgStateInfo.label=Pagamento iniciado mensagem de estado
portfolio.pending.step3_buyer.warn.part1a=na blockchain {0}
portfolio.pending.step3_buyer.warn.part1b=no seu provedor de pagamentos (ex: banco)
-portfolio.pending.step3_buyer.warn.part2=O vendedor do BTC ainda não confirmou o seu pagamento!\nPor favor, verifique {0} se o envio do pagamento foi bem sucedido.\nSe o vendedor de BTC não confirmar o recebimento do seu pagamento até {1}, o negócio será investigado pelo árbitro.
-portfolio.pending.step3_buyer.openForDispute=O vendedor de BTC não confirmou seu pagamento!\nO período máx. para o negócio acabou.\nVocê pode esperar e dar mais tempo ao seu par de negociação ou entrar em contacto com o árbitro para abrir uma disputa.
+portfolio.pending.step3_buyer.warn.part2=O vendedor de BTC ainda não confirmou o seu pagamento. Por favor confirme se o envio do pagamento de {0} foi bem-sucedido.
+portfolio.pending.step3_buyer.openForDispute=O vendedor de Bisq não confirmou o seu pagamento! O período máx. para o negócio acabou. Você pode esperar e dar mais tempo ao seu par de negociação or pedir assistência de um mediador.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=O seu parceiro de negociação confirmou que começou o pagamento de {0}.\n\n
portfolio.pending.step3_seller.altcoin.explorer=no seu explorador de blockchain de {0} favorito
portfolio.pending.step3_seller.altcoin.wallet=na sua carteira de {0}
portfolio.pending.step3_seller.altcoin={0} Por favor verifique {1} se a transação para o seu endereço recipiente\n{2}\njá possui confirmações suficientes da blockchain.\nA quantia de pagamento deve ser {3}\n\nVocê pode copiar e colar o seu endereço {4} do ecrã principal depois de fechar o pop-up.
portfolio.pending.step3_seller.postal={0} Por favor, verifique se você recebeu {1} com \ "US Postal Money Order \" do comprador de BTC.\n\nO ID do negócio (\ "razão para pagamento \" texto) da transação é: \ "{2} \"
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=Seu parceiro de negociação confirmou que iniciou o pagamento de {0}.\n\nPor favor vá para a página web do seu banco online e verifique se você recebeu {1} do comprador de BTC.\n\nO ID do negócio (\"razão para pagamento\" texto) da transação é: \"{2}\"\n
portfolio.pending.step3_seller.cash=Como o pagamento é feito via Depósito em Dinheiro, o comprador do BTC deve escrever "SEM REEMBOLSO" no recibo de papel, rasgá-lo em 2 partes e enviar uma foto por e-mail.\n\nPara evitar o risco de estorno, confirme apenas se você recebeu o e-mail e se tiver certeza de que o recibo de papel é válido.\nSe você não tiver certeza, {0}
portfolio.pending.step3_seller.moneyGram=O comprador deve enviar o Número de Autorização e uma foto do recibo por e-mail.\nO recibo deve mostrar claramente o seu nome completo, país, estado e a quantia. Por favor verifique seu e-mail se recebeu o Número de Autorização.\n\nDepois de fechar esse pop-up, verá o nome e o endereço do comprador do BTC para levantar o dinheiro da MoneyGram.\n\nConfirme apenas o recebimento depois de ter conseguido o dinheiro com sucesso!
portfolio.pending.step3_seller.westernUnion=O comprador deve enviar-lhe o MTCN (número de rastreamento) e uma foto do recibo por e-mail.\nO recibo deve mostrar claramente seu nome completo, cidade, país e a quantia Por favor verifique no seu e-mail se você recebeu o MTCN.\n\nDepois de fechar esse pop-up, você verá o nome e endereço do comprador de BTC para levantar o dinheiro da Western Union.\n\nConfirme apenas o recebimento depois de ter conseguido o dinheiro com sucesso!
portfolio.pending.step3_seller.halCash=O comprador deve-lhe enviar o código HalCash como mensagem de texto. Além disso, você receberá uma mensagem do HalCash com as informações necessárias para retirar o EUR de uma ATM que suporte o HalCash.\n\nDepois de levantar o dinheiro na ATM, confirme aqui o recibo do pagamento!
-portfolio.pending.step3_seller.bankCheck=\n\nVerifique também se o nome do remetente no seu extrato bancário corresponde àquele do contrato de negócio:\nNome do remetente: {0}\n\nSe o nome não for o mesmo que o exibido aqui, {1}
-portfolio.pending.step3_seller.openDispute=por favor, não confirme, mas abra uma disputa premindo \"alt + o\" or \"option + o\".
+portfolio.pending.step3_seller.bankCheck=\n\nVerifique também se o nome do remetente especificado no contrato de negócio corresponde ao nome que aparece no seu extrato bancário:\nNome do remetente, por contrato de negócio: {0}\n\nSe os nomes não forem exatamente iguais, {1}
+portfolio.pending.step3_seller.openDispute=não confirme a recepção do pagamento. Em vez disso, abra uma disputa pressionando \"alt + o\" ou \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=Confirmar recibo de pagamento
portfolio.pending.step3_seller.amountToReceive=Quantia a receber
portfolio.pending.step3_seller.yourAddress=Seu endereço de {0}
@@ -617,17 +650,18 @@ portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Verifique as confirma
portfolio.pending.step3_seller.buyerStartedPayment.fiat=Verifique em sua conta de negociação (por exemplo, sua conta bancária) e confirme que recebeu o pagamento.
portfolio.pending.step3_seller.warn.part1a=na blockchain {0}
portfolio.pending.step3_seller.warn.part1b=em seu provedor de pagamentos (ex: banco)
-portfolio.pending.step3_seller.warn.part2=Você ainda não confirmou o recebimento do pagamento!\nPor favor, verifique {0} se você recebeu o pagamento.\nSe você não confirmar o recebimento até {1}, o negócio será investigado pelo árbitro.
-portfolio.pending.step3_seller.openForDispute=Você não confirmou o recebimento do pagamento!\nO período máx. para o negócio acabou.\nPor favor, confirme ou entre em contacto com o árbitro para abrir uma disputa.
+portfolio.pending.step3_seller.warn.part2=Você ainda não confirmou a receção do pagamento. Por favor verifique {0} se você recebeu o pagamento.
+portfolio.pending.step3_seller.openForDispute=Você não confirmou a receção do pagamento!\nO período máx. para o negócio acabou.\nPor favor confirme ou peça assistência do mediador.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=Você recebeu o pagamento de {0} do seu parceiro de negociação?\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=O ID do negócio (\ "razão para pagamento \"texto) da transação é: \ "{0} \"\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=Verifique também se o nome do remetente no seu extrato bancário corresponde àquele do contrato de negócio:\nNome do remetente: {0}\n\nSe o nome não for o mesmo que o mostrado aqui, por favor, não confirme, mas abra uma disputa digitando \ "alt + o \" ou \ "option + o \".\n\n
-portfolio.pending.step3_seller.onPaymentReceived.note=Favor tenha em mente que assim que confirmar o recibo, a quantia de negociação bloqueada será liberada para o comprador de BTC e o depósito de segurança será devolvido.
+portfolio.pending.step3_seller.onPaymentReceived.name=Verifique também se o nome do remetente especificado no contrato de negócio corresponde ao nome que aparece no seu extrato bancário:\nNome do remetente, por contrato de negócio: {0}\n\nSe os nomes não forem exatamente iguais, não confirme a recepção do pagamento. Em vez disso, abra uma disputa pressionando \"alt + o\" ou \"option + o\".\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Observe que, assim que você confirmar a recepção, o valor da transação bloqueada será liberado para o comprador de BTC e o depósito de segurança será reembolsado.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Confirme que recebeu o pagamento
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Sim, eu recebi o pagamento
+portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANTE: Ao confirmar a recepção do pagamento, você também está verificando a conta da contraparte e assinando-a. Como a conta da contraparte ainda não foi assinada, você deve adiar a confirmação do pagamento o máximo possível para reduzir o risco de estorno.
portfolio.pending.step5_buyer.groupTitle=Resumo do negócio completo
portfolio.pending.step5_buyer.tradeFee=Taxa de negócio
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=Total das taxas de mineração
portfolio.pending.step5_buyer.refunded=Depósito de segurança reembolsado
portfolio.pending.step5_buyer.withdrawBTC=Levantar seus bitcoins
portfolio.pending.step5_buyer.amount=Quantia a levantar
+portfolio.pending.step5_buyer.signer=Ao levantar os seus bitcoins, você verifica se a contraparte agiu de acordo com o protocolo de negócio.
portfolio.pending.step5_buyer.withdrawToAddress=Levantar para o endereço
portfolio.pending.step5_buyer.moveToBisqWallet=Mover fundos para carteira Bisq
portfolio.pending.step5_buyer.withdrawExternal=Levantar para carteira externa
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=Após a primeira confirmação da blockchain,
portfolio.pending.tradePeriodWarning=Se o período é excedido ambos os negociadores podem abrir disputa.
portfolio.pending.tradeNotCompleted=Negócio não completo à tempo (até {0})
portfolio.pending.tradeProcess=Processo de negócio
-portfolio.pending.openAgainDispute.msg=Se você não tem certeza de que o árbitro recebeu a mensagem (por exemplo se não tiver resposta após 1 dia), sinta-se à vontade para abrir a disputa novamente.
+portfolio.pending.openAgainDispute.msg=Se você não tiver certeza de que a mensagem para o mediador ou o àrbitro foi enviada (ex: se você não recebeu uma resposta depois de 1 dia) sinta-se à vontade para abrir uma nova disputa com Cmd/Ctrl+o. Você também pode pedir ajuda adicional no fórum do Bisq em https://bisq.community.
portfolio.pending.openAgainDispute.button=Abrir disputa novamente
portfolio.pending.openSupportTicket.headline=Abrir bilhete de apoio
-portfolio.pending.openSupportTicket.msg=Por favor use isso apenas em caso de emergência, se você não for exibido um botão de \"Abrir apoio\" ou \"Abrir disputa\".\n\nQuando você abre um bilhete de apoio, o negócio será interrompido e tratado pelo árbitro
+portfolio.pending.openSupportTicket.msg=Por favor, use esta função apenas em casos de emergência, se você não vir o botão \"Abrir apoio\" ou \"Abrir disputa\".\n\nQuando você abre um bilhete de apoio, o negócio será interrompido e tratado por um mediador ou árbitro.
+
+portfolio.pending.timeLockNotOver=Você deve esperar ≈{0} (mais {1} blocos) antes que você possa abrir uma disputa de arbitragem.
+
portfolio.pending.notification=Notificação
-portfolio.pending.openDispute=Abrir uma disputa
-portfolio.pending.arbitrationRequested=Disputa aberta
+
+portfolio.pending.support.headline.getHelp=Precisa de ajuda?
+portfolio.pending.support.text.getHelp=Se tiver algum problema você pode tentar contactar o par de negociação no chat do negócio or perguntar à comunidade do Bisq em https://bisq.community. Se o seu problema ainda não for resolvido, você pode pedir mais ajuda à um mediador.
+portfolio.pending.support.text.getHelp.arbitrator=Se tiver algum problema você pode tentar contactar o par de negociação no chat do negócio or perguntar à comunidade do Bisq em https://bisq.community. Se o seu problema ainda não for resolvido, você pode pedir mais ajuda à um árbitro.
+portfolio.pending.support.button.getHelp=Obter apoio
+portfolio.pending.support.popup.info=Se o seu problema com o negócio continua sem resolução, você pode abrir um bilhete de apoio para pedir ajuda de um mediador. Se você não recebeu o pagamento por favor espere até ao final do período de negócio.\n\nTem certeza de que quer abrir um bilhete de apoio?
+portfolio.pending.support.popup.button=Abrir bilhete de apoio
+portfolio.pending.support.headline.halfPeriodOver=Verificar o pagamento
+portfolio.pending.support.headline.periodOver=O período de negócio acabou
+
+portfolio.pending.mediationRequested=Mediação solicitada
+portfolio.pending.refundRequested=Reembolso pedido
portfolio.pending.openSupport=Abrir bilhete de apoio
portfolio.pending.supportTicketOpened=Bilhete de apoio aberto
portfolio.pending.requestSupport=Solicitar apoio
-portfolio.pending.error.requestSupport=Por favor comunique o problema ao seu árbitro.\n\nEle encaminhará as informações para os desenvolvedores para investigar o problema.\nApós o problema ter sido analisado, você receberá de volta todos os fundos bloqueados.
+portfolio.pending.error.requestSupport=Por favor reporte o problema ao seu mediador ou árbitro.\n\nEles passarão a informação aos desenvolvedores para investigarem o problema.\nDepois que o problema for analisado você receberá os seus fundos bloqueados.
portfolio.pending.communicateWithArbitrator=Por favor comunique no ecrã \"Apoio\" com o árbitro.
+portfolio.pending.communicateWithMediator=Por favor comunique com o mediador no ecrã \"Apoio\".
portfolio.pending.supportTicketOpenedMyUser=Você já abriu um bilhete de apoio.\n{0}
portfolio.pending.disputeOpenedMyUser=Você já abriu uma disputa.\n{0}
portfolio.pending.disputeOpenedByPeer=O seu par de negociação abriu uma disputa\n{0}
portfolio.pending.supportTicketOpenedByPeer=O seu par de negociação abriu um bilhete de apoio.\n{0}
portfolio.pending.noReceiverAddressDefined=Nenhum endereço de recipiente definido
-portfolio.pending.removeFailedTrade=Se o árbitro não puder fechar esse negócio, você mesmo poderá movê-lo para o ecrã de negócios falhados.\nDeseja remover essa negócio falhado do ecrã de Negócios pendentes?
+portfolio.pending.removeFailedTrade=Este é um negócio falido? Se sim, você gostaria de fechá-lo manualmente, para que não apareça mais como um negócio aberto?
+
+portfolio.pending.mediationResult.headline=Pagamento sugerido pela mediação
+portfolio.pending.mediationResult.info.noneAccepted=Conclua o negócio aceitando a sugestão do mediador para o pagamento do negócio.
+portfolio.pending.mediationResult.info.selfAccepted=Você aceitou a sugestão do mediador. À espera que o par também a aceite.
+portfolio.pending.mediationResult.info.peerAccepted=O seu par de negócio aceitou a sugestão do mediador. Você também a aceita?
+portfolio.pending.mediationResult.button=Ver a resolução proposta
+portfolio.pending.mediationResult.popup.headline=Resultado da mediação para o negócio com o ID: {0}
+portfolio.pending.mediationResult.popup.headline.peerAccepted=O seu par de negócio aceitou a sugestão do mediador para o negócio {0}
+portfolio.pending.mediationResult.popup.info=O mediador sugeriu o seguinte pagamento:\nVocê recebeu: {0}\nO seu par de negociação recebe: {1}\n\nVocê pode aceitar ou rejeitar este pagamento sugerido.\n\nAo aceitar, você assina a transação do pagamento sugerido. Se o seu par de negociação também aceitar e assinar, o pagamento será completado e o negócio será fechado.\n\nSe ambos rejeitarem a sugestão, você terá que esperar até {2} (bloco {3}) para abrir uma segunda ronda de disputa com um árbitro que investigará o caso novamente e fará um pagamento baseado nas suas descobertas .\n\nO árbitro pode cobrar uma pequena taxa (máximo: o depósito de segurança do negociador) como compensação para o seu trabalho. Ter ambos os negociadores concordando com a sugestão do mediador é o caminho preferido - solicitar arbitragem é para circunstâncias excepcionais, tais como se um negociador estiver seguro de que o mediador não fez uma sugestão de pagamento justa (ou se o seu par estiver inacessível).\n\nPara mais detalhes sobre o novo modelo de arbitragem:\nhttps://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=Rejeitar e solicitar arbitragem
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=Concluído
-portfolio.closed.ticketClosed=Bilhete fechado
+portfolio.closed.ticketClosed=Arbitrado
+portfolio.closed.mediationTicketClosed=Mediado
portfolio.closed.canceled=Cancelado
portfolio.failed.Failed=Falhado
@@ -745,6 +807,9 @@ funds.tx.multiSigDeposit=Depósito multi-assinatura: {0}
funds.tx.multiSigPayout=Pagamento multi-assinatura: {0}
funds.tx.disputePayout=Pagamento de disputa: {0}
funds.tx.disputeLost=Caso de disputa perdido: {0}
+funds.tx.collateralForRefund=Refund collateral: {0}
+funds.tx.timeLockedPayoutTx=Tx de pagamento com trava temporal: {0}
+funds.tx.refund=Reembolso da arbitragem: {0}
funds.tx.unknown=Razão desconhecida: {0}
funds.tx.noFundsFromDispute=Nenhum reembolso de disputa
funds.tx.receivedFunds=Fundos recebidos
@@ -765,14 +830,15 @@ funds.tx.dustAttackTx.popup=Esta transação está enviando uma quantia muito pe
# Support
####################################################################
-support.tab.mediation.support=Bilhetes de apoio
-support.tab.ArbitratorsSupportTickets=Bilhetes de apoio do árbitro
-support.tab.TradersSupportTickets=Bilhetes de apoio do negociador
+support.tab.mediation.support=Mediação
+support.tab.arbitration.support=Arbitragem
+support.tab.legacyArbitration.support=Arbitragem Antiga
+support.tab.ArbitratorsSupportTickets=Bilhetes de {0}
support.filter=Lista de filtros
support.filter.prompt=Insira o ID do negócio, data, endereço onion ou dados da conta
support.noTickets=Não há bilhetes abertos
support.sendingMessage=Enviando mensagem...
-support.receiverNotOnline=Recipiente não está conectado. A mensagem foi guardada na sua caixa postal.
+support.receiverNotOnline=O recipiente não está online. A mensagem foi guardada na caixa de correio.
support.sendMessageError=Falha de envio de mensagem. Erro: {0}
support.wrongVersion=A oferta nessa disputa foi criada com uma versão mais antiga do Bisq.\nVocê não pode fechar essa disputa com sua versão do programa.\n\nPor favor, use uma versão mais antiga com a versão do protocolo {0}
support.openFile=Abrir ficheiro para anexar (tamanho máx.: {0} kb)
@@ -782,7 +848,7 @@ support.attachment=Anexo
support.tooManyAttachments=Você não pode enviar mais do que 3 anexos em uma mensagem.
support.save=Guardar ficheiro no disco
support.messages=Mensagens
-support.input.prompt=Por favor escreva aqui sua mensagem para o árbitro
+support.input.prompt=Inserir a mensagem...
support.send=Enviar
support.addAttachments=Adicionar anexos
support.closeTicket=Fechar bilhete
@@ -801,14 +867,18 @@ support.buyerOfferer=Comprador de BTC/Ofertante
support.sellerOfferer=Vendedor de BTC/Ofertante
support.buyerTaker=Comprador de BTC/Aceitador
support.sellerTaker=Vendedor de BTC/Aceitador
-support.backgroundInfo=Bisq não é uma empresa, então lida com disputas de forma diferente.\n\nSe houver disputas no processo de negócio (por exemplo, um negociador não segue o protocolo de negócio), o programa mostrará um botão \"Abrir disputa"\ após o fim do período de negócio para entrar em contacto com o árbitro.\n\nSe houver um problema com o programa, o software tentará detectá-lo e, se possível, mostrará um botão \"Abrir bilhete de apoio\" para entrar em contacto com o árbitro que encaminhará o problema para os desenvolvedores.\n\nSe você está tendo um problema e não viu o botão \"Abrir bilhete de apoio \", você pode abrir um bilhete de apoio manualmente, selecionando o negócio causando problemas em \"Portefólio /Negócios abertos\" e pressionando \"alt + o\"ou \"opção + o\". Por favor, use este método somente se tiver certeza de que o software não está funcionando como esperado. Se você tiver problemas ou perguntas, consulte o FAQ na página web bisq.network ou publique no fórum Bisq na secção Support.
-support.initialInfo=Por favor, digite uma descrição do seu problema no campo de texto abaixo. Adicione o máximo de informação possível para acelerar o tempo de resolução de disputa.\n\nAqui está uma lista de informações que você deve fornecer:\n● Se você é o comprador da BTC: Você fez a transferência da moeda fiduciária ou da Altcoin? Se sim, você clicou no botão 'pagamento iniciado' no programa?\n● Se você é o vendedor da BTC: Você recebeu o pagamento da moeda fiduciária ou Altcoin? Se sim, você clicou no botão 'pagamento recebido' no programa?\n● Qual é a versão do Bisq que está usando?\n● Qual é o sistema operacional aue está usando?\n● Se encontrou um problema com transações falhadas, considere trocar para um novo directório de dados.\n Às vezes, o directório de dados fica corrompido e leva a erros estranhos.\n Consulte: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPor favor, esteja familiarizado com as regras básicas para o processo de disputa:\n● Você precisa responder às solicitações do árbitro dentro de 2 dias.\n● O período máximo para uma disputa é de 14 dias.\n● Você precisa cooperar com o árbitro e fornecer as informações solicitadas para apresentar seu caso.\n● Você aceitou as regras descritas no documento de disputa no contrato do utilizador quando iniciou o programa pela primeira vez.\n\nVocê pode ler mais sobre o processo de disputa em: https://bisq.network/docs/exchange/arbitration-system
+support.backgroundInfo=Bisq não é uma empresa, por isso lida com disputas de maneira diferente.\n\nOs negociadores podem se comunicar dentro do programa através de um chat seguro no ecrã de negócios abertos para tentar resolver uma disputa por conta própria. Se isso não for suficiente, um mediador pode ajudar. O mediador avaliará a situação e fará uma recomendação para o pagamento dos fundos do negócio. Se ambos os negociadores aceitarem essa sugestão, a transação de pagamento será concluída e o negócio será encerrado. Se um ou ambos os negociadores não concordarem com o pagamento recomendado pelo mediador, eles podem solicitar a arbitragem. O árbitro tem a terceira chave da transação de depósito e fará o pagamento com base em suas conclusões.
+support.initialInfo=Digite uma descrição do seu problema no campo de texto abaixo. Adicione o máximo de informações possível para acelerar o tempo de resolução da disputa.\n\nAqui está uma lista do que você deve fornecer:\n● Se você é o comprador de BTC: Você fez a transferência da Fiat ou Altcoin? Se sim, você clicou no botão 'pagamento iniciado' no programa?\n● Se você é o vendedor de BTC: Você recebeu o pagamento da Fiat ou Altcoin? Se sim, você clicou no botão 'pagamento recebido' no programa?\n\t● Qual versão do Bisq você está usando?\n\t● Qual sistema operacional você está usando?\n\t ● Se você encontrou um problema com transações com falha, considere mudar para um novo diretório de dados.\n\t Às vezes, o diretório de dados é corrompido e leva a erros estranhos.\n\t Consulte: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nFamiliarize-se com as regras básicas do processo de disputa:\n\t● Você precisa responder às solicitações do {0} dentro de 2 dias.\n\t● Os mediadores respondem entre 2 dias. Os árbitros respondem dentro de 5 dias úteis.\n\t ● O período máximo para uma disputa é de 14 dias.\n\t ● Você precisa cooperar com o {1} e fornecer as informações solicitadas para justificar o seu caso.\n\t● Você aceitou as regras descritas no documento de disputa no contrato do usuário quando iniciou o programa.\n\nVocê pode ler mais sobre o processo de disputa em: {2}
support.systemMsg=Mensagem do sistema: {0}
support.youOpenedTicket=Você abriu um pedido para apoio.\n\n{0}\n\nBisq versão: {1}
support.youOpenedDispute=Você abriu um pedido para uma disputa.\n\n{0}\n\nBisq versão: {1}
-support.peerOpenedTicket=O seu par de negociação fez um pedido de apoio devido à problemas técnicos.\n\n{0}
-support.peerOpenedDispute=O seu par de negociação fez um pedido de disputa.\n\n{0}
+support.youOpenedDisputeForMediation=Você solicitou mediação.\n\n{0}\n\nVersão Bisq: {1}
+support.peerOpenedTicket=O seu par de negociação solicitou suporte devido a problemas técnicos.\n\n{0}\n\nVersão Bisq: {1}
+support.peerOpenedDispute=O seu par de negociação solicitou uma disputa.\n\n{0}\n\nVersão Bisq: {1}
+support.peerOpenedDisputeForMediation=O seu par de negociação solicitou uma mediação.\n\n{0}\n\nVersão Bisq: {1}
+support.mediatorsDisputeSummary=Messagem do sistema:\nResumo do mediador sobre a disputa:\n{0}
+support.mediatorsAddress=Endereço do nó do mediador: {0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=Adicionar altcoin
setting.preferences.displayOptions=Mostrar opções
setting.preferences.showOwnOffers=Mostrar as minhas próprias ofertas no livro de ofertas
setting.preferences.useAnimations=Usar animações
+setting.preferences.useDarkMode=Usar o mod escuro (beta)
setting.preferences.sortWithNumOffers=Ordenar listas de mercado por nº de ofertas/negociações:
setting.preferences.resetAllFlags=Reiniciar todos os marcadores \"Não mostrar novamente\"
setting.preferences.reset=Limpar
@@ -852,7 +923,7 @@ 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=Re-sincronizar
-setting.preferences.dao.resync.popup=Depois de um reinício do programa, os dados de governação da rede P2P serão recarregados a partir dos nós semente e o estado consenso do BSQ será reconstruído a partir da transação genesis.
+setting.preferences.dao.resync.popup=Após a reinicialização do programa, os dados de governança da rede Bisq serão recarregados dos nós de semente e 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=Senha de RPC
@@ -862,7 +933,7 @@ setting.preferences.dao.fullNodeInfo.ok=Abrir página de documentos
setting.preferences.dao.fullNodeInfo.cancel=Não, eu fico com o modo nó lite
settings.net.btcHeader=Rede Bitcoin
-settings.net.p2pHeader=Rede P2P
+settings.net.p2pHeader=Rede do Bisq
settings.net.onionAddressLabel=O meu endereço onion
settings.net.btcNodesLabel=Usar nós de Bitcoin Core personalizados
settings.net.bitcoinPeersLabel=Pares conectados
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=Recebido
settings.net.peerTypeColumn=Tipo de par
settings.net.openTorSettingsButton=Abrir definições de Tor
+settings.net.versionColumn=Versão
+settings.net.subVersionColumn=Sub-versão
+settings.net.heightColumn=Altura
+
settings.net.needRestart=Você precisa reiniciar o programa para aplicar essa alteração.\nVocê quer fazer isso agora??
settings.net.notKnownYet=Ainda desconhecido...
settings.net.sentReceived=Enviado: {0}, recebido: {1}
@@ -928,9 +1003,11 @@ setting.about.subsystems.val=Versão da rede: {0}; Versão de mensagem P2P: {1};
####################################################################
account.tab.arbitratorRegistration=Registo de árbitro
+account.tab.mediatorRegistration=Registo do Mediador
+account.tab.refundAgentRegistration=Registro de agente de reembolso
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 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.info.msg=Aqui você pode adicionar contas de negociação para moedas nacionais e altcoins e criar um backup da sua carteira e dos dados da conta.\n\nUma nova carteira de Bitcoin foi criada na primeira vez que você iniciou o Bisq.\n\nÉ altamente recomendável que você anote as sua palavras-semente da carteira do Bitcoin (consulte a guia na parte superior) e considere adicionar uma senha antes do financiamento. Depósitos e retiradas de Bitcoin são gerenciados na secção \"Fundos\".\n\nNota sobre privacidade e segurança: como o Bisq é uma exchange descentralizada, todos os seus dados são mantidos no seu computador. Como não há servidores, não temos acesso às suas informações pessoais, fundos ou mesmo seu endereço IP. Dados como números de contas bancárias, endereços de altcoin e Bitcoin etc. são compartilhados apenas com seu par de negociação para realizar negociações iniciadas (no caso de uma disputa, o mediador ou o árbitro verá os mesmos dados que o seu parceiro de negociação).
account.menu.paymentAccount=Contas de moedas nacionais
account.menu.altCoinsAccountView=Contas de altcoins
@@ -939,42 +1016,39 @@ account.menu.seedWords=Semente da carteira
account.menu.backup=Backup
account.menu.notifications=Notificações
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=Chave pública
-account.arbitratorRegistration.register=Registrar árbitro
-account.arbitratorRegistration.revoke=Revogar registo
-account.arbitratorRegistration.info.msg=Por favor, note que você precisa ficar disponível por 15 dias após a revogação, pois pode haver negócios que estão usando você como árbitro. O período máx. de negócio permitido é de 8 dias e o processo de disputa pode levar até 7 dias.
+account.arbitratorRegistration.register=Registrar
+account.arbitratorRegistration.registration=Registro de {0}
+account.arbitratorRegistration.revoke=Revogar
+account.arbitratorRegistration.info.msg=Saiba que precisa estar disponível até 15 dias depois depois da revogação porque podem existir negócios que o estejam a usar como {0}. O período máx. de negócio permitido é de 8 dias e a disputa pode levar até 7 dias.
account.arbitratorRegistration.warn.min1Language=Precisa definir pelo menos 1 idioma.\nAdicionamos o idioma padrão para você.
-account.arbitratorRegistration.removedSuccess=Você removeu o seu árbitro com sucesso da rede P2P.
-account.arbitratorRegistration.removedFailed=Não foi possível remover árbitro.{0}
-account.arbitratorRegistration.registerSuccess=Você registrou seu árbitro com sucesso na rede P2P.
-account.arbitratorRegistration.registerFailed=Não foi possível registrar árbitro.{0}
-
-account.arbitratorSelection.minOneArbitratorRequired=Precisa definir pelo menos 1 idioma.\nAdicionamos o idioma padrão para você.
-account.arbitratorSelection.whichLanguages=Que idiomas você fala?
-account.arbitratorSelection.whichDoYouAccept=Quais árbitros você aceita
-account.arbitratorSelection.autoSelect=Selecionar automaticamente todos árbitros com língua compatível
-account.arbitratorSelection.regDate=Data de registro
-account.arbitratorSelection.languages=Idiomas
-account.arbitratorSelection.cannotSelectHimself=Um árbitro não pode selecionar a si mesmo para negociar.
-account.arbitratorSelection.noMatchingLang=Nenhuma linguagem compatível.
-account.arbitratorSelection.noLang=Você só pode selecionar árbitros que falam ao menos 1 língua em comum.
-account.arbitratorSelection.minOne=Você precisa selecionar ao menos um árbitro.
+account.arbitratorRegistration.removedSuccess=Você removeu com sucesso seu registro da rede do Bisq.
+account.arbitratorRegistration.removedFailed=Não foi possível remover o registro.{0}
+account.arbitratorRegistration.registerSuccess=Você se registrou com sucesso na rede do Bisq.
+account.arbitratorRegistration.registerFailed=Não foi possível completar o registro.{0}
account.altcoin.yourAltcoinAccounts=As suas contas de altcoins
-account.altcoin.popup.wallet.msg=Certifique-se de seguir os requerimentos para o uso de carteiras {0} conforme descrito na página web de {1}.\nUsar carteiras de exchanges centralizadas onde (a) você não controla suas chaves ou (b) que não usam software de carteira compatível é arriscado: pode levar à perda dos fundos negociados!\nO árbitro não é um especialista de {2} e não pode ajudar em tais casos.
+account.altcoin.popup.wallet.msg=Certifique-se de seguir os requisitos para o uso das carteiras de {0}, conforme descrito na página da web de {1}.\nO uso de carteiras de exchanges centralizadas nas quais (a) você não controla suas chaves ou (b) que não utiliza software de carteira compatível é arriscado: pode levar à perda dos fundos negociados!\nO mediador ou árbitro não é um especialista em {2} e não pode ajudar nesses casos.
account.altcoin.popup.wallet.confirm=Eu entendo e confirmo que eu sei qual carteira que preciso usar.
-account.altcoin.popup.arq.msg=Negociar o ARQ no Bisq requer que você entenda e atenda aos seguintes requerimentos:\n\nPara enviar o ARQ, você precisa usar a wallet oficial do ArQmA GUI ou a carteira do ArQmA CLI com o marcador store-tx-info ativado (padrão em novas versões). Por favor, certifique-se que você pode acessar a chave da tx porque isso seria necessário em caso de uma disputa.\narqma-wallet-cli (use o comando get_tx_key)\narqma-wallet-gui (vá para a aba do histórico e clique no botão (P) para comprovar o pagamento)\n\nEm exploradores de blocos normais, a transferência não é verificável.\n\nVocê precisa fornecer ao árbitro os seguintes dados em caso de disputa:\n- A chave privada da tx\n- O hash da transação\n- o endereço público do destinatário\n\nA falha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda do caso de disputa. O remetente do ARQ é responsável por fornecer a verificação da transferência do ARQ ao árbitro em caso de disputa.\n\nNão é necessário um código de pagamento, apenas o endereço público normal.\nSe você não tiver certeza sobre esse processo, visite o canal de discord do ArQmA (https://discord.gg/s9BQpJT) ou o fórum do ArQmA (https://labs.arqma.com) para obter mais informações.
-account.altcoin.popup.xmr.msg=Negociar XMR no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o XMR, você precisa usar a carteira oficial Monero GUI ou a carteira Monero CLI com o marcador store-tx-info ativado (padrão em novas versões). Por favor, certifique-se que você pode acessar a chave da tx porque isso seria necessário em caso de uma disputa.\nmonero-wallet-cli (use o comando get_tx_key)\nmonero-wallet-gui (vá para a aba do histórico e clique no botão (P) para comprovar o pagamento)\n\nAlém da ferramenta checktx XMR (https://xmr.llcoins.net/checktx.html), a verificação também pode ser realizada na carteira.\nmonero-wallet-cli: usando o comando (check_tx_key).\nmonero-wallet-gui: na página Advanced> Prove / Check.\nEm exploradores de blocos normais, a transferência não é verificável.\n\nVocê precisa fornecer ao árbitro os seguintes dados em caso de disputa:\n- A chave privada da tx\n- O hash da transação\n- o endereço público do destinatário\n\nFalha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda do caso de disputa. O remetente da XMR é responsável por fornecer a verificação da transferência da XMR para o árbitro no caso de uma disputa.\n\nNão é necessário um código de pagamento, apenas o endereço público normal.\nSe você não tem certeza sobre o processo visite (https://www.getmonero.org/resources/user-guides/prove-payment.html) ou o fórum Monero (https://forum.getmonero.org) para encontrar mais informação.
-account.altcoin.popup.blur.msg=Negociar o BLUR no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o BLUR você deve usar a carteira CLI da Blur Network ou a carteira GUI.\n\nSe você estiver usando a carteira CLI, um hash de transação (tx ID) será exibido após uma transferência ser enviada. Você deve guardar esta informação. Imediatamente após o envio da transferência, você deve usar o comando 'get_tx_key' para recuperar a chave privada da transação. Se você não conseguir executar essa etapa, talvez não consiga recuperar a chave mais tarde.\n\nSe você estiver usando a carteira GUI do Blur Network, a chave privada da transação e a ID da transação podem ser encontradas convenientemente na aba "Histórico". Imediatamente após o envio, localize a transação de interesse. Clique no símbolo "?" no canto inferior direito da caixa que contém a transação. Você deve guardar esta informação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um árbitro: 1.) a ID da transação, 2.) a chave privada da transação e 3.) o endereço do destinatário. O árbitro verificará a transferência do BLUR usando o Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nO não fornecimento das informações necessárias ao árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente de BLUR tem 100% de responsabilidade na verificação de transações para um árbitro.\n\nSe você não entender esses requerimentos não negocie no Bisq. Primeiro, procure ajuda no Discord da Rede de Blur (https://discord.gg/dMWaqVW).
-account.altcoin.popup.cash2.msg=Negociar o CASH2 no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar CASH2, você deve usar a versão Cash2 Wallet versão 3 ou superior.\n\nDepois que uma transação é enviada, a ID da transação será exibida. Você deve guardar esta informação. Imediatamente após o envio da transação, você deve usar o comando 'getTxKey' no simplewallet para recuperar a chave secreta da transação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um árbitro: 1) a ID da transação, 2) a chave secreta da transação e 3) o endereço Cash2 do destinatário. O árbitro irá então verificar a transferência do CASH2 usando o Explorador de Blocos do Cash2 (https://blocks.cash2.org).\n\nO não fornecimento das informações necessárias ao árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente do CASH2 tem 100% de responsabilidade na verificação de transações para um árbitro.\n\nSe você não entender esses requerimentos, não negocie no Bisq. Primeiro procure ajuda no Discord do Cash2 (https://discord.gg/FGfXAYN).
-account.altcoin.popup.qwertycoin.msg=Negociar Qwertycoin no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o QWC, você deve usar a versão oficial do QWC Wallet 5.1.3 ou superior.\n\nDepois que uma transação é enviada, o ID da transação será exibida. Você deve guardar esta informação. Imediatamente após o envio da transação, você deve usar o comando 'get_Tx_Key' na simplewallet para recuperar a chave secreta da transação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um árbitro: 1) o ID da transação, 2) a chave secreta da transação e 3) o endereço QWC do destinatário. O árbitro então verificará a transferência do QWC usando o Explorador de Blocos QWC (https://explorer.qwertycoin.org).\n\nO não fornecimento das informações necessárias ao árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente QWC tem 100% da responsabilidade na verificação de transações para um árbitro.\n\nSe você não entender esses requerimentos, não negocie no Bisq. Primeiro, procure ajuda no QWC Discord (https://discord.gg/rUkfnpC).
-account.altcoin.popup.drgl.msg=Negociar Dragonglass no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPor causa da privacidade que a Dragonglass fornece, uma transação não é verificável na blockchain pública. Se necessário, você pode comprovar seu pagamento através do uso de sua chave privada TXN.\nA chave privade TXN é uma chave única gerada automaticamente para cada transação que só pode ser acessada dentro da sua carteira DRGL.\nTanto pela GUI do DRGL-wallet (dentro da janela de detalhes da transação) ou pelo simplewallet da CLI do Dragonglass (usando o comando "get_tx_key").\n\nA versão do DRGL 'Oathkeeper' e superior são NECESSÁRIAS para ambos.\n\nEm caso de disputa, você deve fornecer ao árbitro os seguintes dados:\n- A chave privada TXN\n- O hash da transação\n- o endereço público do destinatário\n\nA verificação do pagamento pode ser feita usando os dados acima como inputs em (http://drgl.info/#check_txn).\n\nA falha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda disputa. O remetente da Dragonglass é responsável por fornecer a verificação da transferência do DRGL para o árbitro em caso de disputa. O uso de PaymentID não é obrigatório.\n\nSe você não tiver certeza sobre qualquer parte deste processo, visite Dragonglass on Discord (http://discord.drgl.info) para obter ajuda.
-account.altcoin.popup.ZEC.msg=Ao usar o Zcash você só pode usar os endereços transparentes (começando com t) e não os endereços z (privados), porque o árbitro não seria capaz de verificar a transação com endereços z.
-account.altcoin.popup.XZC.msg=Ao usar a Zcoin, você só pode usar os endereços transparentes (rastreáveis) e não os endereços não rastreáveis, porque o árbitro não seria capaz de verificar a transação com endereços não rastreáveis num explorador de blocos.
+account.altcoin.popup.upx.msg=Negociar UPX no Bisq exige que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o UPX, você precisa usar a carteira GUI oficial do uPlexa ou a carteira CLI do uPlexa com o sinalizador store-tx-info ativado (padrão em novas versões). Certifique-se de que você pode acessar a chave da tx, pois isso seria necessário em caso de disputa.\nuplexa-wallet-cli (use o comando get_tx_key)\nuplexa-wallet-gui (vá para a aba do histoórico e clique no botão (P) para prova de pagamento)\n\nEm exploradores de blocos normais, a transferência não é verificável.\n\nVocê precisa fornecer ao árbitro os seguintes dados em caso de disputa:\n- A chave privada da tx\n- O hash da transação\n- Endereço público do destinatário\n\nA falha no fornecimento dos dados acima, ou se você usou uma carteira incompatível, resultará na perda do caso da disputa. O remetente de UPX é responsável por fornecer a verificação da transferência de UPX ao árbitro em caso de disputa.\n\nNão é necessário um ID de pagamento, apenas o endereço público normal.\nSe você não tiver certeza sobre esse processo, visite o canal de discord do uPlexa (https://discord.gg/vhdNSrV) ou o chat do Telegram do uPlexa (https://t.me/uplexaOfficial) para encontrar mais informações.
+account.altcoin.popup.arq.msg=Negociar o ARQ no Bisq requer que você entenda e atenda aos seguintes requerimentos:\n\nPara enviar o ARQ, você precisa usar a wallet oficial do ArQmA GUI ou a carteira do ArQmA CLI com o marcador store-tx-info ativado (padrão em novas versões). Por favor, certifique-se que você pode acessar a chave da tx porque isso seria necessário em caso de uma disputa.\narqma-wallet-cli (use o comando get_tx_key)\narqma-wallet-gui (vá para a aba do histórico e clique no botão (P) para comprovar o pagamento)\n\nEm exploradores de blocos normais, a transferência não é verificável.\n\nVocê precisa fornecer ao mediador ou árbitro os seguintes dados em caso de disputa:\n- A chave privada da tx\n- O hash da transação\n- o endereço público do destinatário\n\nA falha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda do caso de disputa. O remetente do ARQ é responsável por fornecer a verificação da transferência do ARQ ao mediador ou árbitro em caso de disputa.\n\nNão é necessário um código de pagamento, apenas o endereço público normal.\nSe você não tiver certeza sobre esse processo, visite o canal de discord do ArQmA (https://discord.gg/s9BQpJT) ou o fórum do ArQmA (https://labs.arqma.com) para obter mais informações.
+account.altcoin.popup.xmr.msg=Negociar XMR no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o XMR, você precisa usar a carteira oficial Monero GUI ou a carteira Monero CLI com o marcador store-tx-info ativado (padrão em novas versões). Por favor, certifique-se que você pode acessar a chave da tx porque isso seria necessário em caso de uma disputa.\nmonero-wallet-cli (use o comando get_tx_key)\nmonero-wallet-gui (vá para a aba do histórico e clique no botão (P) para comprovar o pagamento)\n\nAlém da ferramenta checktx XMR (https://xmr.llcoins.net/checktx.html), a verificação também pode ser realizada na carteira.\nmonero-wallet-cli: usando o comando (check_tx_key).\nmonero-wallet-gui: na página Advanced> Prove / Check.\nEm exploradores de blocos normais, a transferência não é verificável.\n\nVocê precisa fornecer ao mediador ou árbitro os seguintes dados em caso de disputa:\n- A chave privada da tx\n- O hash da transação\n- o endereço público do destinatário\n\nFalha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda do caso de disputa. O remetente da XMR é responsável por fornecer a verificação da transferência da XMR para o mediador ou o árbitro no caso de uma disputa.\n\nNão é necessário um código de pagamento, apenas o endereço público normal.\nSe você não tem certeza sobre o processo visite (https://www.getmonero.org/resources/user-guides/prove-payment.html) ou o fórum Monero (https://forum.getmonero.org) para encontrar mais informação.
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=Negociar MSR no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar MSR, você precisa usar a carteira GUI oficial do Masari ou a carteira CLI do Masari com o marcador store-tx-info ativado (ativado por padrão) ou a carteira web do Masari (https://wallet.getmasari.org). Por favor, certifique-se que você pode acessar a chave da tx porque isso seria necessário em caso de uma disputa.\nmasari-wallet-cli (use o comando get_tx_key)\nmasari-wallet-gui (vá para a aba do histórico e clique no botão (P) para comprovar o pagamento)\n\nMasari Web Wallet (vá para Account -> histórico de transação e veja os detalhes da sua transação enviada)\n\nA verificação pode ser realizada na carteira.\nmasari-wallet-cli: usando o comando (check_tx_key).\nmasari-wallet-gui: na aba Advanced > Prove/Check.\nA verificação pode ser realizada no eplorador de blocos\nExplorador de blocos aberto (https://explorer.getmasari.org), use a barra de procurar para encontrar o hash da transação.\nUma que vez que a transação for encontrada, desça até ao baixo da àrea 'Prove Sending' e preencha os detalhes necessários.\nVocê precisa fornecer ao mediador ou ao árbitro os seguintes dados em caso de disputa:\n- A chave privada da tx\n- O hash da transação\n- o endereço público do destinatário\n\nFalha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda do caso de disputa. O remetente da XMR é responsável por fornecer a verificação da transferência da MSR para o mediador ou o árbitro no caso de uma disputa.\n\nNão é necessário um código de pagamento, apenas o endereço público normal.\nSe você não tem certeza sobre o processo, peça ajuda no Discord official do Masari (https://discord.gg/sMCwMqs).
+account.altcoin.popup.blur.msg=Negociar o BLUR no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o BLUR você deve usar a carteira CLI da Blur Network ou a carteira GUI.\n\nSe você estiver usando a carteira CLI, um hash da transação (tx ID) será exibido após uma transferência ser enviada. Você deve guardar esta informação. Imediatamente após o envio da transferência, você deve usar o comando 'get_tx_key' para recuperar a chave privada da transação. Se você não conseguir executar essa etapa, talvez não consiga recuperar a chave mais tarde.\n\nSe você estiver usando a carteira GUI do Blur Network, a chave privada da transação e a ID da transação podem ser encontradas convenientemente na aba "Histórico". Imediatamente após o envio, localize a transação de interesse. Clique no símbolo "?" no canto inferior direito da caixa que contém a transação. Você deve guardar esta informação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um mediador ou árbitro: 1.) a ID da transação, 2.) a chave privada da transação e 3.) o endereço do destinatário. O mediador ou árbitro verificará a transferência do BLUR usando o Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nO não fornecimento das informações necessárias ao mediador ou árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente de BLUR tem 100% de responsabilidade na verificação de transações para um mediador ou árbitro.\n\nSe você não entender esses requerimentos não negocie no Bisq. Primeiro, procure ajuda no Discord da Rede de Blur (https://discord.gg/dMWaqVW).
+account.altcoin.popup.solo.msg=Negociar Solo no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o Solo, você deve usar a carteira CLI do Solo.\n\nSe você está a usar a carteira CLI, um hash da transação (tx ID) aparecerá depois de a transação ser feita. Você deve guardar esta informação. Imediatamente após o envio da transação, você deve usar o comando 'get_tx_key' para recuperar a chave secreta da transação. Se você não conseguir executar este passo, talvez não seja possível recuperar a chave mais tarde.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um mediador ou árbitro: 1.) o ID da transação, 2.) a chave privada da transação e 3.) o endereço do recipiente. O mediador ou árbitro então verificará a transferência do Solo usando o Explorador de Blocos Solo (https://explorer.minesolo.com/).\n\nO não fornecimento das informações necessárias ao mediador ou árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente de Solo tem 100% da responsabilidade na verificação de transações para um mediador ou árbitro.\n\nSe você não entender esses requerimentos, não negocie no Bisq. Primeiro, procure ajuda no Discord da Rede do Solo (https://discord.minesolo.com/).
+account.altcoin.popup.cash2.msg=Negociar o CASH2 no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar CASH2, você deve usar a versão Cash2 Wallet versão 3 ou superior.\n\nDepois que uma transação é enviada, a ID da transação será exibida. Você deve guardar esta informação. Imediatamente após o envio da transação, você deve usar o comando 'getTxKey' no simplewallet para recuperar a chave secreta da transação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um mediador ou árbitro: 1) a ID da transação, 2) a chave secreta da transação e 3) o endereço Cash2 do destinatário. O mediador ou árbitro irá então verificar a transferência do CASH2 usando o Explorador de Blocos do Cash2 (https://blocks.cash2.org).\n\nO não fornecimento das informações necessárias ao mediador ou árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente do CASH2 tem 100% de responsabilidade na verificação de transações para um mediador ou árbitro.\n\nSe você não entender esses requerimentos, não negocie no Bisq. Primeiro procure ajuda no Discord do Cash2 (https://discord.gg/FGfXAYN).
+account.altcoin.popup.qwertycoin.msg=Negociar Qwertycoin no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o QWC, você deve usar a versão oficial do QWC Wallet 5.1.3 ou superior.\n\nDepois que uma transação é enviada, o ID da transação será exibida. Você deve guardar esta informação. Imediatamente após o envio da transação, você deve usar o comando 'get_Tx_Key' na simplewallet para recuperar a chave secreta da transação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um mediador ou árbitro: 1) o ID da transação, 2) a chave secreta da transação e 3) o endereço QWC do destinatário. O mediador ou árbitro então verificará a transferência do QWC usando o Explorador de Blocos QWC (https://explorer.qwertycoin.org).\n\nO não fornecimento das informações necessárias ao mediador ou árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente QWC tem 100% da responsabilidade na verificação de transações para um mediador ou árbitro.\n\nSe você não entender esses requerimentos, não negocie no Bisq. Primeiro, procure ajuda no QWC Discord (https://discord.gg/rUkfnpC).
+account.altcoin.popup.drgl.msg=Negociar Dragonglass no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPor causa da privacidade que a Dragonglass fornece, uma transação não é verificável na blockchain pública. Se necessário, você pode comprovar seu pagamento através do uso de sua chave privada TXN.\nA chave privade TXN é uma chave única gerada automaticamente para cada transação que só pode ser acessada dentro da sua carteira DRGL.\nTanto pela GUI do DRGL-wallet (dentro da janela de detalhes da transação) ou pelo simplewallet da CLI do Dragonglass (usando o comando "get_tx_key").\n\nA versão do DRGL 'Oathkeeper' e superior são NECESSÁRIAS para ambos.\n\nEm caso de disputa, você deve fornecer ao mediador ou árbitro os seguintes dados:\n- A chave privada TXN\n- O hash da transação\n- o endereço público do destinatário\n\nA verificação do pagamento pode ser feita usando os dados acima como inputs em (http://drgl.info/#check_txn).\n\nA falha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda disputa. O remetente da Dragonglass é responsável por fornecer a verificação da transferência do DRGL para o mediador ou árbitro em caso de disputa. O uso de PaymentID não é obrigatório.\n\nSe você não tiver certeza sobre qualquer parte deste processo, visite Dragonglass on Discord (http://discord.drgl.info) para obter ajuda.
+account.altcoin.popup.ZEC.msg=Ao usar o Zcash você só pode usar os endereços transparentes (começando com t), e não os endereços z (privados), porque o mediador ou árbitro não seria capaz de verificar a transação com endereços z.
+account.altcoin.popup.XZC.msg=Ao usar a Zcoin, você só pode usar os endereços transparentes (rastreáveis) e não os endereços não rastreáveis, porque o mediador ou árbitro não seria capaz de verificar a transação com endereços não rastreáveis num explorador de blocos.
account.altcoin.popup.grin.msg=GRIN requer um processo interativo entre o remetente e o recipiente para criar a transação. Certifique-se de seguir as instruções da página web do projeto GRIN para enviar e receber de forma confiável o GRIN (o recipiente precisa estar online ou pelo menos estar online durante um determinado período de tempo).\n\nO Bisq suporta apenas o formato de URL da carteira Grinbox (Wallet713).\n\nO remetente GRIN é obrigado a fornecer prova de que eles enviaram GRIN com sucesso. Se a carteira não puder fornecer essa prova, uma disputa potencial será resolvida em favor do recipiente de GRIN. Por favor, certifique-se de usar o software Grinbox mais recente que suporta a prova da transação e que você entende o processo de transferência e receção do GRIN, bem como criar a prova.\n\nConsulte https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only para obter mais informações sobre a ferramenta de prova Grinbox.
account.altcoin.popup.beam.msg=O BEAM requer um processo interativo entre o remetente e o recipiente para criar a transação.\n\nCertifique-se de seguir as instruções da página Web do projeto BEAM para enviar e receber BEAM de forma confiável (o recipiente precisa estar online ou pelo menos estar online durante um determinado período de tempo).\n\nO remetente BEAM é obrigado a fornecer prova de que eles enviaram o BEAM com sucesso. Certifique-se de usar software de carteira que pode produzir tal prova. Se a carteira não puder fornecer a prova, uma disputa potencial será resolvida em favor do recipiente de BEAM.
-account.altcoin.popup.pars.msg="A negociação de ParsiCoin no Bisq exige que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar PARS você deve usar a versão oficial da Carteira ParsiCoin 3.0.0 ou superior.\n\nVocê pode verificar o Hash da Transação e a Chave da Transação na secção das Transações na sua carteira GUI (ParsiPay) Você precisa clicar com o lado direito na transação e, em seguida, clicar em mostrar detalhes.\n\nEm caso de arbitragem, você deve apresentar o seguinte para um árbitro: 1) o Hash da Transação, 2) a Chave da Transação, e 3) endereço PARS do recipiente. O árbitro irá então verificar a transferência PARS usando o Explorador de Blocos da ParsiCoin (http://explorer.parsicoin.net/#check_payment).\n\nFalha em fornecer as informações necessárias ao árbitro resultará na perda do caso de disputa. Em todos os casos de disputa, o remetente da ParsiCoin carrega 100% da carga de responsabilidade em verificar as transações à um árbitro.\n\nSe você não entender esses requerimentos, não negocie no Bisq. Primeiro procure ajuda no Discord da ParsiCoin (https://discord.gg/c7qmFNh).\n"
+account.altcoin.popup.pars.msg=A negociação de ParsiCoin no Bisq exige que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar PARS você deve usar a versão oficial da Carteira ParsiCoin 3.0.0 ou superior.\n\nVocê pode verificar o Hash da Transação e a Chave da Transação na secção das Transações na sua carteira GUI (ParsiPay) Você precisa clicar com o lado direito na transação e, em seguida, clicar em mostrar detalhes.\n\nEm caso de arbitragem, você deve apresentar o seguinte para um mediador ou árbitro: 1) o Hash da Transação, 2) a Chave da Transação, e 3) endereço PARS do recipiente. O mediador ou árbitro irá então verificar a transferência PARS usando o Explorador de Blocos da ParsiCoin (http://explorer.parsicoin.net/#check_payment).\n\nFalha em fornecer as informações necessárias ao mediador ou árbitro resultará na perda do caso de disputa. Em todos os casos de disputa, o remetente da ParsiCoin carrega 100% da carga de responsabilidade em verificar as transações à um mediador ou árbitro.\n\nSe você não entender esses requerimentos, não negocie no Bisq. Primeiro procure ajuda no Discord da ParsiCoin (https://discord.gg/c7qmFNh).
+
+account.altcoin.popup.blk-burnt.msg=Para negociar blackcoins queimados, você precisa saber o seguinte:\n\nBlackcoins queimados não podem ser gastos. Para os negociar no Bisq, os output scripts precisam estar na forma: OP_RETURN OP_PUSHDATA, seguido pelos data bytes que, após serem codificados em hex, constituem endereços. Por exemplo, blackcoins queimados com um endereço 666f6f (“foo” em UTF-8) terá o seguinte script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nPara criar blackcoins queimados, deve-se usar o comando RPC “burn” disponível em algumas carteiras.\n\nPara casos possíveis, confira https://ibo.laboratorium.ee .\n\nComo os blackcoins queimados não podem ser gastos, eles não podem voltar a ser vendidos. “Vender” blackcoins queimados significa queimar blackcoins comuns (com os dados associados iguais ao endereço de destino).\n\nEm caso de disputa, o vendedor de BLK precisa providenciar o hash da transação.
account.fiat.yourFiatAccounts=A sua conta de moeda nacional
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=Fator de unidade de cargo vinculado em BSQ
dao.param.ISSUANCE_LIMIT=Limite de emissão por ciclo em BSQ
dao.param.currentValue=Valor atual: {0}
+dao.param.currentAndPastValue=Valor atual: {0} (Valor quando a proposta foi feita: {1})
dao.param.blocks={0} blocos
dao.results.cycle.duration.label=Duração de {0}
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} bloco(s)
dao.results.cycle.value.postFix.isDefaultValue=(valor padrão)
dao.results.cycle.value.postFix.hasChanged=(foi alterado em votação)
-dao.results.invalidVotes=Nós tivemos votos inválidos nesse ciclo de votação. Isso pode acontecer se um voto não foi bem distribuído na rede P2P.\n{0}
+dao.results.invalidVotes=Tivemos votos inválidos naquele ciclo de votação. Isso pide acontecer se o voto não foi bem distribuído pela rede do Bisq.\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=Indefinido
@@ -1503,7 +1578,7 @@ 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/alcunha
+dao.proposal.display.name=Exacto nome de usuário no Github
dao.proposal.display.link=Link para informação detalhada
dao.proposal.display.link.prompt=Link para a proposta
dao.proposal.display.requestedBsq=Quantia requerida em BSQ
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=Voto atual: ''{0}''. Mudar o voto par
dao.proposal.display.myVote.accepted=Aceite
dao.proposal.display.myVote.rejected=Rejeitado
dao.proposal.display.myVote.ignored=Ignorado
-dao.proposal.myVote.summary=Votou: {0}; Peso do voto: {1} (ganhou: {2} + participação: {3});
+dao.proposal.display.myVote.unCounted=O voto não foi incluído no resultado
+dao.proposal.myVote.summary=Votou: {0}; Peso do voto: {1} (ganho: {2} + participação: {3}) {4}
dao.proposal.myVote.invalid=O voto foi inválido
dao.proposal.voteResult.success=Aceite
@@ -1680,6 +1756,7 @@ dao.monitor.daoState.utxoConflicts=Conflitos de UTXO
dao.monitor.daoState.utxoConflicts.blockHeight=Altura do bloco: {0}
dao.monitor.daoState.utxoConflicts.sumUtxo=Soma de todo UTXO: {0} BSQ
dao.monitor.daoState.utxoConflicts.sumBsq=Soma de todo BSQ: {0} BSQ
+dao.monitor.daoState.checkpoint.popup=O estado da OAD não está sincronizado com a rede. Após o reinicio a OAD vai ressincronizar.
dao.monitor.proposal.headline=Estado de propostas
dao.monitor.proposal.table.headline=Corrente hashes do estado da propostaa
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=Transações BSQ
dao.factsAndFigures.dashboard.marketPrice=Dados do mercado
dao.factsAndFigures.dashboard.price=Último preço de negócio de BSQ/BTC (no Bisq)
+dao.factsAndFigures.dashboard.avgPrice90=Média de 90 dias do preço de negócio de BSQ/BTC
+dao.factsAndFigures.dashboard.avgPrice30=Média de 30 dias do preço de negócio de BSQ/BTC
dao.factsAndFigures.dashboard.marketCap=Capitalização do mercado (com base no preço de negócio)
dao.factsAndFigures.dashboard.availableAmount=Total BSQ disponível
@@ -1769,10 +1848,6 @@ displayUpdateDownloadWindow.download.openDir=Abrir diretório de download
disputeSummaryWindow.title=Resumo
disputeSummaryWindow.openDate=Data de abertura do bilhete
disputeSummaryWindow.role=Função do negociador
-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 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
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=Banco
disputeSummaryWindow.summaryNotes=Notas de resumo
disputeSummaryWindow.addSummaryNotes=Adicionar notas de resumo
disputeSummaryWindow.close.button=Fechar bilhete
-disputeSummaryWindow.close.msg=Bilhete fechado em {0}\n\nResumo:\n{1} entregou evidência à prova de falsificação: {2}\n{3} fez a verificação de ID: {4}\n{5} fez uma captura de ecrã ou um vídeo: {6}\nQuantia de pagamento para o comprador do BTC: {7}\nQuantia de pagamento para o vendedor do BTC: {8}\n\nNotas de resumo:\n{9}
+disputeSummaryWindow.close.msg=Bilhete fechado em {0}\n\nResumo:\nQuantia do pagamento para comprador de BTC: {1}\nQuantia do pagamento para vendedor de BTC: {2}\n\nNotas de resumo:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\nPróximos passos:\nAbrir o negócio em andamento e aceitar ou rejeitar a mediação sugerida
disputeSummaryWindow.close.closePeer=Você também precisa fechar o bilhete dos pares de negociação!
+disputeSummaryWindow.close.txDetails.headline=Publicar transação de reembolso
+disputeSummaryWindow.close.txDetails.buyer=O comprador recebe {0} no endereço: {1}\n
+disputeSummaryWindow.close.txDetails.seller=O vendedor recebe {0} no endereço: {1}\n
+disputeSummaryWindow.close.txDetails=Gastando: {0}\n{1}{2}Taxa da transação: {3} ({4} satoshis/byte)\nTamanho da transação: {5} Kb\n\nTem a certeza de que quer publicar esta transação?
emptyWalletWindow.headline={0} ferramenta de emergência da carteira
emptyWalletWindow.info=Por favor, use isso apenas em caso de emergência, se você não puder aceder o seu fundo a partir da interface do utilizador.\n\nPor favor, note que todas as ofertas abertas serão fechadas automaticamente ao usar esta ferramenta.\n\nAntes de usar essa ferramenta, faça backup do seu diretório de dados. Você pode fazer isso em \"Conta/Backup\".\n\nPor favor comunique-nos o seu problema e envie um relatório de erros no Github ou no fórum Bisq para que possamos investigar o que causou o problema.
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=Você tem ofertas abertas que serão removidas
emptyWalletWindow.openOffers.yes=Sim, tenho certeza
emptyWalletWindow.sent.success=O saldo da sua carteira foi transferido com sucesso.
-enterPrivKeyWindow.headline=Registo aberto apenas para árbitros convidados
+enterPrivKeyWindow.headline=Inserir chave privada para registro
filterWindow.headline=Editar lista de filtragem
filterWindow.offers=Ofertas filtradas (sep. por vírgula):
@@ -1815,6 +1895,8 @@ filterWindow.accounts=Dados da conta de negociação filtrados:\nFormato: lista
filterWindow.bannedCurrencies=Códigos de moedas filtrados (sep. por vírgula)
filterWindow.bannedPaymentMethods=IDs de método de pagamento filtrados (sep. por vírgula)
filterWindow.arbitrators=Árbitros filtrados (endereços onion sep. por vírgula)
+filterWindow.mediators=Mediadores filtrados (endereços onion separados por vírgula)
+filterWindow.refundAgents=Agentes de reembolso filtrados (endereços onion sep. por virgula)
filterWindow.seedNode=Nós de semente filtrados (endereços onion sep. por vírgula)
filterWindow.priceRelayNode=Nós de transmissão de preço filtrados (endereços onion sep. por vírgula)
filterWindow.btcNode=Nós de Bitcoin filtrados (endereços + portas sep. por vírgula)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(ID bancário/BIC/SWIFT do ofertante)
offerDetailsWindow.offerersBankName=(nome do banco do ofertante)
offerDetailsWindow.bankId=ID do banco (ex. BIC ou SWIFT)
offerDetailsWindow.countryBank=País do banco do ofertante
-offerDetailsWindow.acceptedArbitrators=Árbitros aceites
offerDetailsWindow.commitment=Compromisso
offerDetailsWindow.agree=Eu concordo
offerDetailsWindow.tac=Termos e condições
@@ -1883,6 +1964,7 @@ tradeDetailsWindow.tradeDate=Data de negócio
tradeDetailsWindow.txFee=Taxa de mineração
tradeDetailsWindow.tradingPeersOnion=Endereço onion dos parceiros de negociação
tradeDetailsWindow.tradeState=Estado de negócio
+tradeDetailsWindow.agentAddresses=Árbitro/Mediador
walletPasswordWindow.headline=Digite senha para abrir:
@@ -1945,10 +2027,11 @@ popup.warning.incompatibleDB=Detectamos ficheiros de base de dados incompatívei
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.
-popup.warning.tradePeriod.ended=O seu negócio com o ID {0} atingiu o limite do máx. período de negociação permitido e não está concluído.\n\nO período de negócio terminou em {1}\n\nPor favor, verifique o seu negócio em \"Portefólio/Negócios abertos\" para entrar em contacto com o árbitro.
+popup.warning.tradePeriod.ended=O seu negócio com o ID {0} atingiu o limite do máx. período de negociação permitido e não está concluído.\n\nO período de negócio terminou em {1}\n\nPor favor, verifique o seu negócio em \"Portefólio/Negócios abertos\" para entrar em contacto com o mediador.
popup.warning.noTradingAccountSetup.headline=Você ainda não configurou uma conta de negociação
popup.warning.noTradingAccountSetup.msg=Você precisa configurar uma conta de moeda nacional ou altcoin antes de criar uma oferta.\nVocê quer configurar uma conta?
popup.warning.noArbitratorsAvailable=Não há árbitros disponíveis.
+popup.warning.noMediatorsAvailable=Não há mediadores disponíveis.
popup.warning.notFullyConnected=Você precisa esperar até estar totalmente conectado à rede.\nIsso pode levar cerca de 2 minutos na inicialização.
popup.warning.notSufficientConnectionsToBtcNetwork=Você precisa esperar até que você tenha pelo menos {0} conexões com a rede Bitcoin.
popup.warning.downloadNotComplete=Você precisa esperar até que o download dos blocos de Bitcoin ausentes esteja completo.
@@ -1958,13 +2041,13 @@ popup.warning.examplePercentageValue=Por favor digitar um número percentual com
popup.warning.noPriceFeedAvailable=Não há feed de preço disponível para essa moeda. Você não pode usar um preço baseado em percentagem.\nPor favor, selecione o preço fixo.
popup.warning.sendMsgFailed=Enviar mensagem para seu par de negociação falhou.\nPor favor, tente novamente e se continuar a falhar relate um erro.
popup.warning.insufficientBtcFundsForBsqTx=Você não tem fundos BTC suficientes para pagar a taxa de mineração para essa transação.\nPor favor financie sua carteira BTC.\nFundos em falta: {0}
-popup.warning.bsqChangeBelowDustException=Esta transação cria um output de trocos de BSQ que está abaixo do limite de poeira (5,46 BSQ) e seria rejeitada pela rede de bitcoin.\n\nVocê precisa enviar uma quantia mais elevada para evitar o output de trocos (por exemplo, adicionando a quantia de poeira ao seu montante a ser enviado) ou adicionar mais fundos de BSQ à sua carteira de modo a evitar a gerar um output de poeira.\n\nO output de poeira é {0}.
-popup.warning.btcChangeBelowDustException=Esta transação cria um output de trocos que está abaixo do limite de poeira (546 satoshis) e seria rejeitada pela rede bitcoin.\n\nVocê precisa adicionar a quantia de poeira ao seu montante à ser enviado para evitar gerar um output de poeira.\n\nO output de poeira é {0}.
+popup.warning.bsqChangeBelowDustException=Esta transação cria um output de trocos de BSQ que está abaixo do limite de poeira (5,46 BSQ) e seria rejeitada pela rede do bitcoin.\n\nVocê precisa enviar uma quantia mais elevada para evitar o output de trocos (por exemplo, adicionando a quantia de poeira ao seu montante a ser enviado) ou adicionar mais fundos de BSQ à sua carteira de modo a evitar a gerar um output de poeira.\n\nO output de poeira é {0}.
+popup.warning.btcChangeBelowDustException=Esta transação cria um output de trocos que está abaixo do limite de poeira (546 satoshis) e seria rejeitada pela rede do bitcoin.\n\nVocê precisa adicionar a quantia de poeira ao seu montante à ser enviado para evitar gerar um output de poeira.\n\nO output de poeira é {0}.
popup.warning.insufficientBsqFundsForBtcFeePayment=Você não tem fundos de BSQ suficientes para pagar a taxa de negócio em BSQ. Você pode pagar a taxa em BTC ou você precisa financiar sua carteira BSQ. Você pode comprar BSQ no Bisq.\n\nFundos BSQ em falta: {0}
popup.warning.noBsqFundsForBtcFeePayment=Sua carteira BSQ não possui fundos suficientes para pagar a taxa de negócio em BSQ.
popup.warning.messageTooLong=Sua mensagem excede o tamanho máx. permitido. Por favor enviá-la em várias partes ou carregá-la utilizando um serviço como https://pastebin.com.
-popup.warning.lockedUpFunds=Você bloqueou fundos de um negócio falhado.\nSaldo bloqueado: {0}\nEndereço de tx de depósito: {1}\nID do negócio: {2}.\n\nPor favor, abra um bilhete de apoio selecionando o negócio no ecrã de negócios pendentes e clicando em \"alt + o\" ou \"option + o\"."
+popup.warning.lockedUpFunds=Você trancou fundos de um negócio falhado..\nSaldo trancado: {0} \nEndereço da tx de Depósito: {1}\nID de negócio: {2}.\n\nPor favor abra um bilhete de apoio selecionando o negócio no ecrã de negócios abertos e pressione \"alt + o\" ou \"option + o\"."
popup.warning.nodeBanned=Um dos nós de {0} foi banido. Por favor reinicie seu programa para ter certeza de não estar conectado ao nó banido.
popup.warning.priceRelay=transmissão de preço
@@ -1993,19 +2076,36 @@ popup.shutDownInProgress.msg=Desligar o programa pode demorar alguns segundos.\n
popup.attention.forTradeWithId=Atenção necessária para o negócio com ID {0}
-popup.roundedFiatValues.headline=Novo recurso de privacidade: Valores de moedas fiduciárias arredondados
-popup.roundedFiatValues.msg=Para aumentar a privacidade do seu negócio a quantia de {0} foi arredondada.\n\nDependendo da versão do cliente, você pagará ou receberá valores com casas decimais ou arredondados.\n\nAmbos os valores estão de acordo a partir de agora com o protocolo de negócio.\n\nTambém esteja ciente de que os valores de BTC são alterados automaticamente para coincidir com o valor arredondado da moeda fiduciária mais próximo possível.
-
popup.info.multiplePaymentAccounts.headline=Múltiplas contas de pagamento disponíveis
popup.info.multiplePaymentAccounts.msg=Você tem várias contas de pagamento disponíveis para esta oferta. Por favor, verifique se você escolheu a correta.
-popup.dao.launch.headline=A visão completa, concretizada
-popup.dao.launch.governance.title=Governação
-popup.dao.launch.governance=A rede de negociação do Bisq já era descentralizada.\nCom a OAD do Bisq, a liderança do Bisq agora também é descentralizada, tornando o Bisq excepcionalmente resistente à censura.
-popup.dao.launch.trading.title=Negócio
-popup.dao.launch.trading=Negocie BSQ (bitcoin colorido) para participar na governação do Bisq. Você pode comprar e vender BSQ como qualquer outro ativo no Bisq.
-popup.dao.launch.cheaperFees.title=Taxas mais baratas
-popup.dao.launch.cheaperFees=Obtenha um desconto de 90% nas taxas de negociação quando você usa BSQ. Economize e apoie o projeto ao mesmo tempo!\n\n
+popup.news.launch.headline=Duas Grandes Atualizações
+popup.news.launch.accountSigning.headline=ASSINATURA DA CONTA
+popup.news.launch.accountSigning.description=Aumente os limites de negociação fiat de 0,01 BTC comprando BTC de um par assinado.
+popup.news.launch.ntp.headline=NOVO PROTOCOLO DE NEGÓCIO
+popup.news.launch.ntp.description=O novo sistema de resolução de disputas em 2-níveis torna o Bisq mais seguro, escalável e resistente à censura.
+
+popup.accountSigning.selectAccounts.headline=Selecionar contas de pagamento
+popup.accountSigning.selectAccounts.description=Com base no método de pagamento e no momento, todas as contas de pagamento conectadas a uma disputa em que ocorreu um pagamento ao comprador serão selecionadas para você assinar.
+popup.accountSigning.selectAccounts.signAll=Assinar todos os métodos de pagamento
+popup.accountSigning.selectAccounts.datePicker=Selecione o ponto no tempo até o qual as contas serão assinadas
+
+popup.accountSigning.confirmSelectedAccounts.headline=Confirmar contas de pagamento selecionadas
+popup.accountSigning.confirmSelectedAccounts.description=Com base no seu input, {0} contas de pagamento serão selecionadas.
+popup.accountSigning.confirmSelectedAccounts.button=Confirmar contas de pagamento
+popup.accountSigning.signAccounts.headline=Confirmar a assinatura de contas de pagamento
+popup.accountSigning.signAccounts.description=Com base na sua seleção, {0} contas de pagamento serão assinadas.
+popup.accountSigning.signAccounts.button=Assinar contas de pagamento
+popup.accountSigning.signAccounts.ECKey=Inserir a chave privada do árbitro
+popup.accountSigning.signAccounts.ECKey.error=Má ECKey do árbitro
+
+popup.accountSigning.success.headline=Parabéns
+popup.accountSigning.success.description=Todas as contas de pagamento de {0} foram assinadas com sucesso!
+popup.accountSigning.generalInformation=Você encontrará o estado de assinatura de todas as suas contas na seção de contas.\n\nPara mais informações, visite https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=Uma das suas contas de pagamento foi verificada e assinada por um árbitro. Fazendo negócios com esta conta assinará automaticamente a conta do seu par de negociação após um negócio bem-sucedido.\n\n{0}
+popup.accountSigning.signedByPeer=Uma das suas contas de pagamento foi verificada e assinada por um par de negociação. Seu limite inicial de negociação será aumentado e você poderá assinar outras contas dentro de {0} dias a partir de agora.\n\n{1}
+popup.accountSigning.peerLimitLifted=O limite inicial de uma das suas contas foi aumentado.\n\n{0}
+popup.accountSigning.peerSigner=Uma das suas contas tem maturidade suficiente para assinar outras contas de pagamento e o limite inicial de uma delas foi aumentado.\n\n{0}
####################################################################
# Notifications
@@ -2071,6 +2171,7 @@ list.currency.editList=Editar lista de moedas
table.placeholder.noItems=Atualmente não há {0} disponíveis
table.placeholder.noData=Não há dados disponíveis no momento
+table.placeholder.processingData=Processando os dados...
peerInfoIcon.tooltip.tradePeer=Do par de negociação
@@ -2093,7 +2194,8 @@ peerInfo.title=Informação do par
peerInfo.nrOfTrades=Número de negócios completos
peerInfo.notTradedYet=Você não negociou com esse utilizador até agora.
peerInfo.setTag=Definir o rótulo para esse par
-peerInfo.age=Idade da conta de pagamento
+peerInfo.age.noRisk=Idade da conta de pagamento
+peerInfo.age.chargeBackRisk=Tempo desde a assinatura
peerInfo.unknownAge=Idade desconhecida
addressTextField.openWallet=Abrir sua carteira Bitcoin padrão
@@ -2154,7 +2256,7 @@ BTC_REGTEST=Regtest Bitcoin
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=Testnet da OAD do Bitcoin (discontinuada)
# suppress inspection "UnusedProperty"
-BTC_DAO_BETANET=Betanet da OAD do Bitcoin (Mainnet do Bitcoin)
+BTC_DAO_BETANET=Betanet da OAD do Bisq (Mainnet do Bitcoin)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=Regtest da OAD do Bitcoin
@@ -2253,6 +2355,7 @@ payment.accepted.banks=Bancos aceites (ID)
payment.mobile=Nº de telemóvel
payment.postal.address=Morada postal
payment.national.account.id.AR=Numero CBU
+shared.accountSigningState=Estado da assinatura da conta
#new
payment.altcoin.address.dyn=Endereço de {0}
@@ -2261,7 +2364,7 @@ payment.accountNr=Número da conta
payment.emailOrMobile=Email ou nº de telemóvel
payment.useCustomAccountName=Usar nome de conta personalizado:
payment.maxPeriod=Período máx. de negócio
-payment.maxPeriodAndLimit=Duração máx. de negócio: {0} / Máx. limite de negócio: {1} / Idade da conta: {2}
+payment.maxPeriodAndLimit=Duração máx. de negócio: {0} / Compra máx.: {1} / Venda máx.: {2} / Idade da conta: {3}
payment.maxPeriodAndLimitCrypto=Período máx. de negócio {0} / Limite máx. de negócio: {1}
payment.currencyWithSymbol=Moeda: {0}
payment.nameOfAcceptedBank=Nome do banco aceite
@@ -2284,12 +2387,13 @@ payment.moneyGram.info=Ao usar o MoneyGram, o comprador de BTC deve enviar o Nú
payment.westernUnion.info=Ao usar o Western Union, o comprador do BTC deve enviar o MTCN (número de rastreamento) e uma foto do recibo por e-mail ao vendedor de BTC. O recibo deve mostrar claramente o nome completo do vendedor, a cidade, o país e a quantia. O comprador visualizará o e-mail do vendedor no processo de negócio.
payment.halCash.info=Ao usar o HalCash, o comprador de BTC precisa enviar ao vendedor de BTC o código HalCash através de uma mensagem de texto do seu telemóvel.\n\nPor favor, certifique-se de não exceder a quantia máxima que seu banco lhe permite enviar com o HalCash. A quantia mín. de levantamento é de 10 euros e a quantia máx. é de 600 EUR. Para levantamentos repetidos é de 3000 euros por recipiente por dia e 6000 euros por recipiente por mês. Por favor confirme esses limites com seu banco para ter certeza de que eles usam os mesmos limites mencionados aqui.\n\nA quantia de levantamento deve ser um múltiplo de 10 euros, pois você não pode levantar outras quantias de uma ATM. A interface do utilizador no ecrã para criar oferta e aceitar ofertas ajustará a quantia de BTC para que a quantia de EUR esteja correta. Você não pode usar o preço com base no mercado, pois o valor do EUR estaria mudando com a variação dos preços.\n\nEm caso de disputa, o comprador de BTC precisa fornecer a prova de que enviou o EUR.
payment.limits.info=Por favor, esteja ciente de que todas as transferências bancárias carregam uma certa quantidade de risco de estorno.\n\nPara mitigar esse risco, o Bisq define limites por negócio com base em dois fatores:\n\n1. O nível estimado de risco de estorno para o método de pagamento usado\n2. A idade da sua conta para esse método de pagamento\n\nA conta que você está criando agora é nova e sua idade é zero. À medida que a sua conta aumenta de idade ao longo de um período de dois meses, os seus limites por negócio aumentarão:\n\n● Durante o primeiro mês, seu limite por negócio será {0}\n● Durante o segundo mês, seu limite por negócio será {1}\n● Após o segundo mês, seu limite por negócio será {2}\n\nPor favor, note que não há limites para o número total de vezes que você pode negociar.
+payment.limits.info.withSigning=Para limitar riscos de estorno, o Bisq estabelece limites de compra por negócio com base nos dois seguintes factores:\n\n1. Risco geral de estorno para o método de pagamento\n2. Estado de assinatura da conta\n\nEssa conta de pagamento que você acabou de criar tem algum risco de estorno e ainda não foi assinada por um árbitro ou um par confiável, portanto, está limitada à compra de {0} por negócio. Após a assinatura, os limites de compra aumentarão da seguinte forma:\n\n● Antes de assinar e até 30 dias após a assinatura, o seu limite de compra por negócio será {0}\n● 30 dias após a assinatura, o seu limite de compra por negócio será de {1}\n● 60 dias após a assinatura, o seu limite de compra por negócio será de {2}\n\nOs limites de venda não são afetados pela assinatura da conta e aumentam apenas à medida que a idade da conta aumenta. Mais informações estão em https://docs.bisq.network/payment-methods#account-signing.\n\nNão há limites para o número de negócio que você pode fazer.
payment.cashDeposit.info=Por favor, confirme que seu banco permite-lhe enviar depósitos em dinheiro para contas de outras pessoas. Por exemplo, o Bank of America e o Wells Fargo não permitem mais esses depósitos.
payment.revolut.info=Certifique-se de que o número de telemóvel que você usou para sua conta Revolut está registado na Revolut, caso contrário o comprador de BTC não poderá enviar-lhe os fundos.
-payment.usPostalMoneyOrder.info=As Ordens de pagamento são um dos métodos de compra de moedas fiduciárias mais privados disponíveis no Bisq.\n\nEntretanto, esteja ciente dos riscos potencialmente aumentados associados ao seu uso. O Bisq não assumirá qualquer responsabilidade no caso de uma ordem de pagamento enviada ser roubada, e os árbitros, nesses casos, concederão a BTC ao remetente da ordem de pagamento, desde que possam produzir informações de rastreamento e recibos. Pode ser aconselhável que o remetente escreva o nome do vendedor de BTC na ordem de pagamento, a fim de minimizar o risco de que a ordem de pagamento seja levantado por outra pessoa.
+payment.usPostalMoneyOrder.info=As Ordens de pagamento são um dos métodos de compra de moedas fiduciárias mais privados disponíveis no Bisq.\n\nEntretanto, esteja ciente dos riscos potencialmente aumentados associados ao seu uso. O Bisq não assumirá qualquer responsabilidade no caso de uma ordem de pagamento enviada ser roubada, e o mediador ou o árbitro, nesses casos, concederão o BTC ao remetente da ordem de pagamento, desde que possam produzir informações de rastreamento e recibos. Pode ser aconselhável que o remetente escreva o nome do vendedor de BTC na ordem de pagamento, a fim de minimizar o risco de que a ordem de pagamento seja levantado por outra pessoa.
payment.f2f.contact=Informação de contacto
payment.f2f.contact.prompt=Como deseja ser contactado pelo par de negociação? (endereço de e-mail, número de telefone, ...)
@@ -2299,11 +2403,15 @@ payment.f2f.optionalExtra=Informação adicional opcional
payment.f2f.extra=Informação adicional
payment.f2f.extra.prompt=O ofertante pode definir 'termos e condições' ou adicionar informação de um contacto público. Este será exibido com a oferta.
-payment.f2f.info=Negócios 'Cara à Cara' têm diferentes regras e vêm com riscos diferentes às transações online.\n\nAs principais diferenças são:\n● Os pares de negociação precisam de trocar informação sobre a localização e hora do encontro, usando os contactos providenciados.\n● Os pares de negociação precisam de trazer os seus laptops a fazer a confirmação de 'pagamento enviado' e 'pagamento recebido' no local de encontro.\n● Se um ofertante tem 'termos e condições' especiais, ele precisa de menciona-los no campo de texto 'Informações Adicionais' na sua conta.\n● Ao aceitar uma oferta, o aceitador concorda com os 'termos e condições' declarados pelo ofertante.\n● Em caso de disputa o árbitro não pode ajudar muito porque normalmente é difícil obter evidência inalterável do que aconteceu no encontro. Nesses casos os fundos em BTC podem ficar bloqueados indefinidamente ou até que os pares de negociação cheguem à um acordo.\n\nPara ter a certeza de que percebe a diferença com negociações 'Cara à Cara' por favor leias as instruções e recomendações em: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
+payment.f2f.info=Negócios 'Cara à Cara' têm diferentes regras e vêm com riscos diferentes às transações online.\n\nAs principais diferenças são:\n● Os pares de negociação precisam de trocar informação sobre a localização e hora do encontro, usando os contactos providenciados.\n● Os pares de negociação precisam de trazer os seus laptops a fazer a confirmação de 'pagamento enviado' e 'pagamento recebido' no local de encontro.\n● Se um ofertante tem 'termos e condições' especiais, ele precisa de menciona-los no campo de texto 'Informações Adicionais' na sua conta.\n● Ao aceitar uma oferta, o aceitador concorda com os 'termos e condições' declarados pelo ofertante.\n● Em caso de disputa o mediador ou o árbitro não pode ajudar muito porque normalmente é difícil obter evidência inalterável do que aconteceu no encontro. Nesses casos os fundos em BTC podem ficar bloqueados indefinidamente ou até que os pares de negociação cheguem à um acordo.\n\nPara ter a certeza de que percebe a diferença com negociações 'Cara à Cara' por favor leias as instruções e recomendações em: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
payment.f2f.info.openURL=Abrir página web
payment.f2f.offerbook.tooltip.countryAndCity=País e cidade: {0} / {1}
payment.f2f.offerbook.tooltip.extra=Informação adicional: {0}
+payment.japan.bank=Banco
+payment.japan.branch=Agência
+payment.japan.account=Conta
+payment.japan.recipient=Nome
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -2317,6 +2425,7 @@ CASH_DEPOSIT=Depósito em dinheiro
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=Face à face (em pessoa)
+JAPAN_BANK=Japan Bank Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=Bancos nacionais
@@ -2334,6 +2443,8 @@ MONEY_GRAM_SHORT=MoneyGram
WESTERN_UNION_SHORT=Western Union
# suppress inspection "UnusedProperty"
F2F_SHORT=F2F
+# suppress inspection "UnusedProperty"
+JAPAN_BANK_SHORT=Japan Furikomi
# Do not translate brand names
# suppress inspection "UnusedProperty"
@@ -2499,3 +2610,8 @@ validation.mustBeDifferent=O seu input deve ser diferente do valor atual
validation.cannotBeChanged=O parâmetro não pode ser alterado
validation.numberFormatException=Exceção do formato do número {0}
validation.mustNotBeNegative=O input não deve ser negativo
+validation.phone.missingCountryCode=É preciso o código do país de duas letras para validar o número de telefone
+validation.phone.invalidCharacters=O número de telfone {0} contém carácteres inválidos
+validation.phone.insufficientDigits=Faltam algarismos em {0} para um número de telefone válido
+validation.phone.tooManyDigits=Demasiados algarismos em {0} para ser um número de telefone válido
+validation.phone.invalidDialingCode=O código de discagem do país no número {0} é inválido para o país {1}. O correcto código de discagem é {2}.
diff --git a/core/src/main/resources/i18n/displayStrings_pt_BR.properties b/core/src/main/resources/i18n/displayStrings_pt_BR.properties
index d5a6a64e42..d86a91e858 100644
--- a/core/src/main/resources/i18n/displayStrings_pt_BR.properties
+++ b/core/src/main/resources/i18n/displayStrings_pt_BR.properties
@@ -62,6 +62,10 @@ shared.priceWithCur=Preço em {0}
shared.priceInCurForCur=Preço em {0} para 1 {1}
shared.fixedPriceInCurForCur=Preço em {0} fixo para 1 {1}
shared.amount=Quantidade
+shared.txFee=Taxa de negociação
+shared.makerFee=Maker Fee
+shared.buyerSecurityDeposit=Buyer Deposit
+shared.sellerSecurityDeposit=Seller Deposit
shared.amountWithCur=Quantidade em {0}
shared.volumeWithCur=Volume em {0}
shared.currency=Moeda
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=Por favor, envie a confirmação novamente
shared.exportCSV=Exportar para csv
shared.exportJSON=Exportar para JSON
shared.noDateAvailable=Sem data disponível
-shared.arbitratorsFee=Taxa do árbitro
shared.noDetailsAvailable=Sem detalhes disponíveis
shared.notUsedYet=Ainda não usado
shared.date=Data
@@ -149,11 +152,11 @@ shared.save=Salvar
shared.onionAddress=Endereço Onion
shared.supportTicket=ticket de suporte
shared.dispute=disputa
+shared.mediationCase=mediation case
shared.seller=vendedor
shared.buyer=comprador
shared.allEuroCountries=Todos os países do Euro
shared.acceptedTakerCountries=Países tomadores aceitos
-shared.arbitrator=Árbitro escolhido
shared.tradePrice=Preço de negociação
shared.tradeAmount=Quantidade negociada
shared.tradeVolume=Volume de negociação
@@ -203,6 +206,15 @@ shared.proposal=Proposta
shared.votes=Votos
shared.learnMore=Saiba mais
shared.dismiss=Dispensar
+shared.selectedArbitrator=Árbitro escolhido
+shared.selectedMediator=Selected mediator
+shared.selectedRefundAgent=Árbitro escolhido
+shared.mediator=Mediador
+shared.arbitrator=Árbitro
+shared.refundAgent=Árbitro
+shared.refundAgentForSupportStaff=Refund agent
+shared.delayedPayoutTxId=Refund collateral transaction ID
+
####################################################################
# UI views
@@ -244,7 +256,7 @@ mainView.footer.btcInfo.synchronizingWith=Sincronizando com
mainView.footer.btcInfo.synchronizedWith=Sincronizado com
mainView.footer.btcInfo.connectingTo=Conectando-se a
mainView.footer.btcInfo.connectionFailed=falha na conexão
-mainView.footer.p2pInfo=Pares na rede P2P: {0}
+mainView.footer.p2pInfo=Bisq network peers: {0}
mainView.footer.daoFullNode=Full node da DAO
mainView.bootstrapState.connectionToTorNetwork=(1/4) Conectando-se à rede Tor...
@@ -254,10 +266,10 @@ mainView.bootstrapState.initialDataReceived=(4/4) Dados iniciais recebidos
mainView.bootstrapWarning.noSeedNodesAvailable=Nenhum nó semente disponível
mainView.bootstrapWarning.noNodesAvailable=Sem nós semente e pares disponíveis
-mainView.bootstrapWarning.bootstrappingToP2PFailed=O bootstrap para a rede P2P falhou
+mainView.bootstrapWarning.bootstrappingToP2PFailed=Bootstrapping to Bisq network failed
mainView.p2pNetworkWarnMsg.noNodesAvailable=Não há nós semente ou pares persistentes para requisição de dados.\nPor gentileza verifique sua conexão com a internet ou tente reiniciar o programa.
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Falha ao conectar com a rede P2P (erro reportado: {0}).\nPor gentileza verifique sua conexão ou tente reiniciar o programa.
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Connecting to the Bisq network failed (reported error: {0}).\nPlease check your internet connection or try to restart the application.
mainView.walletServiceErrorMsg.timeout=Não foi possível conectar-se à rede Bitcoin, pois o tempo limite expirou.
mainView.walletServiceErrorMsg.connectionError=Não foi possível conectar-se à rede Bitcoin, devido ao seguinte erro: {0}
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=Fechar:
market.trades.tooltip.candle.high=Alta:
market.trades.tooltip.candle.low=Baixa:
market.trades.tooltip.candle.average=Média:
+market.trades.tooltip.candle.median=Median:
market.trades.tooltip.candle.date=Data:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=Países aceitos como sede bancária (tomador
offerbook.availableOffers=Ofertas disponíveis
offerbook.filterByCurrency=Filtrar por moeda
offerbook.filterByPaymentMethod=Filtrar por método de pagamento
+offerbook.timeSinceSigning=Time since signing
+offerbook.timeSinceSigning.info=This account was verified and {0}
+offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
+offerbook.timeSinceSigning.info.peer=signed by a peer, waiting for limits to be lifted
+offerbook.timeSinceSigning.info.peerLimitLifted=signed by a peer and limits were lifted
+offerbook.timeSinceSigning.info.signer=signed by peer and can sign peer accounts (limits lifted)
+offerbook.timeSinceSigning.daysSinceSigning={0} dias
+offerbook.timeSinceSigning.daysSinceSigning.long={0} since signing
+
+offerbook.timeSinceSigning.help=When you successfully complete a trade with a peer who has a signed payment account, your payment account is signed.\n{0} days later, the initial limit of {1} is lifted and your account can sign other peers'' payment accounts.
+offerbook.timeSinceSigning.notSigned=Not signed yet
+offerbook.timeSinceSigning.notSigned.noNeed=N/D
+shared.notSigned=This account hasn't been signed yet
+shared.notSigned.noNeed=This account type doesn't use signing
offerbook.nrOffers=N.º de ofertas: {0}
offerbook.volume={0} (mín. - máx.)
@@ -345,14 +372,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=Você não possui conta de neg
offerbook.warning.noMatchingAccount.headline=Não há conta de negociação compatível.
offerbook.warning.noMatchingAccount.msg=Para aceitar essa oferta, é necessário configurar uma conta de pagamento usando esse método de pagamento.\n\nGostaria de fazer isso agora?
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=Essa oferta não pode ser aceita por causa de restrições de segurança baseadas nos seguintes critérios:\n- A conta de pagamento do Ofertante foi criada após 15 de março de 2019\n- A quantia mínima para trades é 0.01 BTC\n- O meio de pagamento para a oferta é considerado arriscado por conta de estornos bancários\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=Essa oferta não pode ser aceita por causa de restrições de segurança baseadas nos seguintes critérios:\n- Sua conta de pagamento foi criada após 15 de março de 2019\n- A quantia mínima para trades é 0.01 BTC\n- O meio de pagamento para a oferta é considerado arriscado por conta de estornos bancários\n\n{0}
+offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=Nós precisávamos implementar essa restrição como uma medida de curto-prazo para melhoria na segurança.\n\nO próximo release do programa contará com um ferramentas de proteção mais robustas, de modo que ofertas geradas com perfis de risco possam ser negociadas novamente.
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=A quantia permitida para trades foi limitada para 0.01 BTC por causa de restrições de segurança baseadas nos seguintes critérios:\n- A conta do comprador foi criada após 15 de março de 2019\n- O meio de pagamento para a oferta é considerado arriscado por conta de estornos bancários\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=A quantia permitida para trades foi limitada para 0.01 BTC por causa de restrições de segurança baseadas nos seguintes critérios:\n- A conta do comprador foi criada após 15 de março de 2019\n- O meio de pagamento para a oferta é considerado arriscado por conta de estornos bancários\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
offerbook.warning.wrongTradeProtocol=Essa oferta requer uma versão do protocolo diferente da usada em sua versão do software.\n\nVerifique se você possui a versão mais nova instalada, caso contrário o usuário que criou a oferta usou uma versão ultrapassada.\n\nUsuários não podem negociar com uma versão incompatível do protocolo.
offerbook.warning.userIgnored=Você adicionou o endereço onion à sua lista de endereços ignorados.
@@ -478,7 +503,7 @@ takeOffer.failed.offerTaken=Não foi possível aceitar a oferta, pois ela já fo
takeOffer.failed.offerRemoved=Não é possível aceitar a oferta pois ela foi removida.
takeOffer.failed.offererNotOnline=Erro ao aceitar a oferta: o ofertante não está mais online.
takeOffer.failed.offererOffline=Erro ao aceitar a oferta: o ofertante está offline.
-takeOffer.warning.connectionToPeerLost=Você perdeu a conexão com o ofertante.\nEle pode ter desconectado ou ter fechado a conexão com o seu computador devido a um excesso de conexões abertas.\n\nCaso você ainda esteja vendo a oferta dele na lista de ofertas, você pode tentar aceitá-la novamente.
+takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again.
takeOffer.error.noFundsLost=\n\nA sua carteira ainda não realizou o pagamento.\nPor favor, reinicie o programa e verifique a sua conexão com a internet.
takeOffer.error.feePaid=\n\nTente reiniciar o programa e verifique sua conexão de rede para ver se o problema foi resolvido.
@@ -516,8 +541,8 @@ portfolio.pending.step3_seller.confirmPaymentReceived=Confirmar recebimento do p
portfolio.pending.step5.completed=Concluído
portfolio.pending.step1.info=A transação de depósito foi publicada\n{0} precisa esperar ao menos uma confirmação da blockchain antes de iniciar o pagamento.
-portfolio.pending.step1.warn=A transação do depósito ainda não foi confirmada.\nIsto pode ocorrer em casos raros em que a taxa de transmissão à partir de uma carteira externa de um dos negociadores foi muito baixa.
-portfolio.pending.step1.openForDispute=A transação do depósito ainda não foi confirmada.\nIsto pode ocorrer em raros casos quando um dos negociadores envia uma taxa de de financiamento muito baixa através de uma carteira externa.\nO período máximo para a negociação já se esgotou.\n\nPor favor, aguarde mais um pouco ou entre em contato com o árbitro para abrir uma disputa.
+portfolio.pending.step1.warn=The deposit transaction is still not confirmed. This sometimes happens in rare cases when the funding fee of one trader from an external wallet was too low.
+portfolio.pending.step1.openForDispute=The deposit transaction is still not confirmed. You can wait longer or contact the mediator for assistance.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=Sua negociação já tem ao menos uma confirmação na blockchain.\n(Você pode aguardar mais confirmações se quiser - 6 confirmações são consideradas como muito seguro.)\n\n
@@ -535,8 +560,10 @@ portfolio.pending.step2_buyer.altcoin=Transfira com a sua carteira {0} externa\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=Vá ao banco e pague {0} ao vendedor de BTC.\n\n
portfolio.pending.step2_buyer.cash.extra=IMPORTANTE:\nApós executar o pagamento, escreva no comprovante de depósito: SEM REEMBOLSO\nEntão rasgue-o em 2 partes, tire uma foto e envie-a para o e-mail do vendedor de BTC.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=Pague {0} ao vendedor de BTC usando MoneyGram.\n\n
portfolio.pending.step2_buyer.moneyGram.extra=IMPORTANTE:\nApós ter feito o pagamento, envie o número de autorização e uma foto do comprovante por e-mail para o vendedor de BTC.\nO comprovante deve exibir claramente o nome completo, o país e o estado do vendedor, assim como a quantia. O e-mail do vendedor é: {0}.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=Pague {0} ao vendedor de BTC usando Western Union.\n\n
portfolio.pending.step2_buyer.westernUnion.extra=IMPORTANTE:\nApós ter feito o pagamento, envie o número de rastreamento (MTCN) e uma foto do comprovante por e-mail para o vendedor de BTC.\nO comprovante deve exibir claramente o nome completo, o país e o estado do vendedor, assim como a quantia. O e-mail do vendedor é: {0}.
@@ -544,14 +571,15 @@ portfolio.pending.step2_buyer.westernUnion.extra=IMPORTANTE:\nApós ter feito o
portfolio.pending.step2_buyer.postal=Envie {0} através de \"US Postal Money Order\" para o vendedor de BTC.\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.bank=Por favor, acesse sua conta bancária online e pague {0} ao vendedor de BTC.\n\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=Por favor, entre em contato com o vendedor de BTC através do contato fornecido e combine um encontro para pagá-lo {0}.\n\n
portfolio.pending.step2_buyer.startPaymentUsing=Iniciar pagamento usando {0}
portfolio.pending.step2_buyer.amountToTransfer=Quantia a ser transferida
portfolio.pending.step2_buyer.sellersAddress=Endereço {0} do vendedor
portfolio.pending.step2_buyer.buyerAccount=A sua conta de pagamento a ser usada
portfolio.pending.step2_buyer.paymentStarted=Pagamento iniciado
-portfolio.pending.step2_buyer.warn=Você ainda não realizou o seu pagamento de {0}!\nEssa negociação deve ser completada até {1}, caso contrário ela será investigada pelo árbitro.
-portfolio.pending.step2_buyer.openForDispute=Você ainda não concluiu o pagamento!\nO período máximo para a negociação já passou.\n\nFavor entrar em contato com o árbitro para abrir uma disputa.
+portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
+portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.Please contact the mediator for assistance.
portfolio.pending.step2_buyer.paperReceipt.headline=Você enviou o comprovante de depósito para o vendedor de BTC?
portfolio.pending.step2_buyer.paperReceipt.msg=Lembre-se:\nVocê deve escrever no comprovante de depósito: SEM REEMBOLSO\nA seguir, rasgue-o em duas partes, tire uma foto e envie-a para o e-mail do vendedor de BTC.
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=Enviar o número de autorização e o comprovante de depósito
@@ -569,7 +597,11 @@ portfolio.pending.step2_seller.waitPayment.headline=Aguardar pagamento
portfolio.pending.step2_seller.f2fInfo.headline=Informações de contato do comprador
portfolio.pending.step2_seller.waitPayment.msg=A transação de depósito tem pelo menos uma confirmação blockchain do protocolo.\nVocê precisa aguardar até que o comprador de BTC inicie o pagamento de {0}.
portfolio.pending.step2_seller.warn=O comprador de BTC ainda não fez o pagamento de {0}.\nVocê precisa esperar até que ele inicie o pagamento.\nCaso a negociação não conclua em {1}, o árbitro irá investigar.
-portfolio.pending.step2_seller.openForDispute=O comprador de BTC ainda não iniciou o pagamento!\nO período máximo permitido para a negociação expirou.\nVocê pode aguardar mais um pouco, dando mais tempo para o seu parceiro de negociação, ou você pode entrar em contato com o árbitro para abrir uma disputa.
+portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance.
+
+tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}''
+tradeChat.openChat=Open chat window
+tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=Indefinido
@@ -578,7 +610,7 @@ message.state.SENT=Mensagem enviada
# suppress inspection "UnusedProperty"
message.state.ARRIVED=A mensagem chegou ao destinário
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=Mensagem armazenada na caixa de correio
+message.state.STORED_IN_MAILBOX=Message of payment sent but not yet received by peer
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=O destinário confirmou o recebimento da mensagem
# suppress inspection "UnusedProperty"
@@ -589,22 +621,23 @@ portfolio.pending.step3_buyer.wait.info=Aguardando o vendedor de BTC confirmar o
portfolio.pending.step3_buyer.wait.msgStateInfo.label=Status da mensagem de pagamento iniciado
portfolio.pending.step3_buyer.warn.part1a=na blockchain {0}
portfolio.pending.step3_buyer.warn.part1b=no seu provedor de pagamentos (ex: seu banco)
-portfolio.pending.step3_buyer.warn.part2=O vendedor de BTC ainda não confirmou o pagamento!\nPor favor, verifique em {0} se o pagamento foi enviado com sucesso.\nCaso o vendedor não confirme o recebimento do pagamento até {1}, a negociação será investigada pelo árbitro.
-portfolio.pending.step3_buyer.openForDispute=O vendedor de BTC não confirmou o seu pagamento!\nO período máximo para essa negociação expirou.\nVocê pode aguardar mais um pouco, dando mais tempo para o seu parceiro de negociação, ou você pode entrar em contato com um árbitro para abrir uma disputa.
+portfolio.pending.step3_buyer.warn.part2=The BTC seller still has not confirmed your payment. Please check {0} if the payment sending was successful.
+portfolio.pending.step3_buyer.openForDispute=The BTC seller has not confirmed your payment! The max. period for the trade has elapsed. You can wait longer and give the trading peer more time or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=Seu parceiro de negociação confirmou que iniciou o pagamento de {0}.\n\n
portfolio.pending.step3_seller.altcoin.explorer=no seu explorador da blockchain {0} preferido
portfolio.pending.step3_seller.altcoin.wallet=em sua carteira {0}
portfolio.pending.step3_seller.altcoin={0}Verifique em {1} se a transação para o seu endereço de recebimento\n{2}\njá tem confirmações suficientes na blockchain.\nA quantia do pagamento deve ser {3}\n\nVocê pode copiar e colar seu endereço {4} na janela principal, após fechar esse popup.
portfolio.pending.step3_seller.postal={0}Por gentileza verifique se recebeu {1} como \"US Postal Money Order\" do comprador de BTC.\n\nO ID de negociação (texto \"razão do pagamento\") da transação é: \"{2}\"
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=Seu parceiro de negociação confirmou que iniciou o pagamento de {0}.\n\nAcesse sua conta bancária online e verifique se você recebeu {1} do comprador de BTC.\n\nO ID de negociação (texto \"motivo do pagamento\") da transação é: \"{2}\"
portfolio.pending.step3_seller.cash=Como o pagamento é realizado através de depósito de dinheiro em espécie, o comprador de BTC obrigatoriamente deve escrever \"SEM REEMBOLSO\" no comprovante de depósito, rasgá-lo em duas partes e enviar uma foto do comprovante para você por e-mail.\n\nPara reduzir a chance de um reembolso (restituição do valor depositado para o comprador), confirme apenas se você tiver recebido o e-mail e tiver certeza de que o comprovante de depósito é autêntico.\nSe você não tiver certeza, {0}
portfolio.pending.step3_seller.moneyGram=O comprador deve enviar o Número de Autorização e uma foto do recibo por e-mail.\nO recibo deve mostrar claramente o seu nome completo, país, estado e a quantia. Por favor verifique seu e-mail se recebeu o Número de Autorização.\n\nDepois de fechar esse pop-up, verá o nome e o endereço do comprador do BTC para retirar o dinheiro da MoneyGram.\n\nConfirme apenas o recebimento depois de ter conseguido o dinheiro com sucesso!
portfolio.pending.step3_seller.westernUnion=O comprador deve enviar-lhe o MTCN (número de rastreamento) e uma foto do recibo por e-mail.\nO recibo deve mostrar claramente seu nome completo, cidade, país e a quantia Por favor verifique no seu e-mail se você recebeu o MTCN.\n\nDepois de fechar esse pop-up, você verá o nome e endereço do comprador de BTC para receber o dinheiro da Western Union.\n\nConfirme apenas o recebimento depois de ter conseguido o dinheiro com sucesso!
portfolio.pending.step3_seller.halCash=O comprador deve-lhe enviar o código HalCash como mensagem de texto. Além disso, você receberá uma mensagem do HalCash com as informações necessárias para sacar o EUR de uma ATM que suporte o HalCash.\n\nDepois de retirar o dinheiro na ATM, confirme aqui o recibo do pagamento!
-portfolio.pending.step3_seller.bankCheck=\n\nPor favor, verifique também que o nome do remetente no seu extrato bancário confere com o do contrato de negociação:\nNome do remetente: {0}\n\nSe o nome do extrato bancário não for o mesmo que o exibido acima, {1}
-portfolio.pending.step3_seller.openDispute=por favor, não confirme e abra uma disputa pressionando \"alt + o\" ou \"option + o\".
+portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1}
+portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=Confirmar recebimento do pagamento
portfolio.pending.step3_seller.amountToReceive=Quantia a receber
portfolio.pending.step3_seller.yourAddress=Seu endereço {0}
@@ -617,17 +650,18 @@ portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Verifique as confirma
portfolio.pending.step3_seller.buyerStartedPayment.fiat=Verifique em sua conta de negociação (ex: sua conta bancária) e confirme que recebeu o pagamento.
portfolio.pending.step3_seller.warn.part1a=na blockchain {0}
portfolio.pending.step3_seller.warn.part1b=no seu provedor de pagamentos (ex: banco)
-portfolio.pending.step3_seller.warn.part2=Você ainda não confirmou o recebimento do pagamento!\nPor favor, verifique em {0} se você recebeu o pagamento.\nCaso você não confirme o recebimento até {1}, a negociação será investigada pelo árbitro.
-portfolio.pending.step3_seller.openForDispute=Você ainda não confirmou o recebimento do pagamento!\nO período máximo para a negociação expirou.\nPor favor, confirme o recebimento do pagamento ou entre em contato com o árbitro para abrir uma disputa.
+portfolio.pending.step3_seller.warn.part2=You still have not confirmed the receipt of the payment. Please check {0} if you have received the payment.
+portfolio.pending.step3_seller.openForDispute=You have not confirmed the receipt of the payment!\nThe max. period for the trade has elapsed.\nPlease confirm or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=Você recebeu o pagamento de {0} do seu parceiro de negociação?\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=O ID de negociação (texto \"razão do pagamento\") da transação é: \"{0}\"\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=Verifique também no extrato bancário se o nome do remetente confere com o nome que foi fornecido no contrato da negociação:\nNome do remetente: {0}\n\nSe o nome do extrato não for o mesmo que o nome exibido acima, não confirme e abra uma disputa pressionando \"alt + o\" ou \"option + o\".\n\n
-portfolio.pending.step3_seller.onPaymentReceived.note=Assim que você confirmar o recebimento do pagamento, o valor da transação será liberado para o comprador de BTC e os depósitos de segurança serão devolvidos para você e para o comprador.
+portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Please note, that as soon you have confirmed the receipt, the locked trade amount will be released to the BTC buyer and the security deposit will be refunded.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Confirmar recebimento do pagamento
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Sim, eu recebi o pagamento
+portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANT: By confirming receipt of payment, you are also verifying the account of the counterparty and signing it accordingly. Since the account of the counterparty hasn't been signed yet, you should delay confirmation of the payment as long as possible to reduce the risk of a chargeback.
portfolio.pending.step5_buyer.groupTitle=Resumo da negociação
portfolio.pending.step5_buyer.tradeFee=Taxa de negociação
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=Total em taxas de mineração
portfolio.pending.step5_buyer.refunded=Depósito de segurança devolvido
portfolio.pending.step5_buyer.withdrawBTC=Retirar seus bitcoins
portfolio.pending.step5_buyer.amount=Quantia a ser retirada
+portfolio.pending.step5_buyer.signer=By withdrawing your bitcoins, you verify that the counterparty has acted according to the trade protocol.
portfolio.pending.step5_buyer.withdrawToAddress=Enviar para o endereço
portfolio.pending.step5_buyer.moveToBisqWallet=Mover fundos para carteira Bisq
portfolio.pending.step5_buyer.withdrawExternal=Retirar para carteira externa
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=O período de negociação irá se iniciar ap
portfolio.pending.tradePeriodWarning=Se o período expirar, os dois negociantes poderão abrir uma disputa.
portfolio.pending.tradeNotCompleted=Negociação não completada a tempo (até {0})
portfolio.pending.tradeProcess=Processo de negociação
-portfolio.pending.openAgainDispute.msg=Se você não tem certeza de que o árbitro recebeu a mensagem (ex: se você não receber nenhuma resposta após 1 dia), sinta-se livre em abrir uma disputa novamente.
+portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community.
portfolio.pending.openAgainDispute.button=Abrir disputa novamente
portfolio.pending.openSupportTicket.headline=Abrir ticket de suporte
-portfolio.pending.openSupportTicket.msg=Use apenas em caso de emergência se não aparecer o botão \"Abrir suporte\" ou \"Abrir disputa\".\n\nQuando você abre um ticket de suporte, a negociação é interrompida e passada para o árbitro.
+portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator.
+
+portfolio.pending.timeLockNotOver=You have to wait until ≈{0} ({1} more blocks) before you can open an arbitration dispute.
+
portfolio.pending.notification=Notificação
-portfolio.pending.openDispute=Abrir uma disputa
-portfolio.pending.disputeOpened=Disputa aberta
+
+portfolio.pending.support.headline.getHelp=Need help?
+portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator.
+portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator.
+portfolio.pending.support.button.getHelp=Get support
+portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket?
+portfolio.pending.support.popup.button=Abrir ticket de suporte
+portfolio.pending.support.headline.halfPeriodOver=Check payment
+portfolio.pending.support.headline.periodOver=O período de negociação acabou
+
+portfolio.pending.mediationRequested=Mediation requested
+portfolio.pending.refundRequested=Refund requested
portfolio.pending.openSupport=Abrir ticket de suporte
portfolio.pending.supportTicketOpened=Ticket de suporte aberto
portfolio.pending.requestSupport=Solicitar suporte
-portfolio.pending.error.requestSupport=Favor reportar o problema para seu árbitro.\n\nEle encaminhará a informação para os desenvolvedores investigarem o problema.\nApós o problema ser analisado, você receberá de volta todos os fundos travados.
+portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds.
portfolio.pending.communicateWithArbitrator=Por favor, vá até a seção \"Suporte\" e entre em contato com o árbitro.
+portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator.
portfolio.pending.supportTicketOpenedMyUser=Você já abriu um ticket de suporte\n{0}
portfolio.pending.disputeOpenedMyUser=Você já abriu uma disputa.\n{0}
portfolio.pending.disputeOpenedByPeer=Seu parceiro de negociação abriu uma disputa\n{0}
portfolio.pending.supportTicketOpenedByPeer=Seu parceiro de negociação abriu um ticket de suporte.\n{0}
portfolio.pending.noReceiverAddressDefined=Nenhum endereço de recebimento definido
-portfolio.pending.removeFailedTrade=Se o árbitro não puder fechar a negociação, você pode movê-la para a tela de negociações falhas.\nVocê quer remover a negociação que falhou da tela de negociações pendentes?
+portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade?
+
+portfolio.pending.mediationResult.headline=Suggested payout from mediation
+portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout.
+portfolio.pending.mediationResult.info.selfAccepted=You have accepted the mediator's suggestion. Waiting for peer to accept as well.
+portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted the mediator's suggestion. Do you accept as well?
+portfolio.pending.mediationResult.button=View proposed resolution
+portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0}
+portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0}
+portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=Concluído
-portfolio.closed.ticketClosed=Ticket fechado
+portfolio.closed.ticketClosed=Arbitrated
+portfolio.closed.mediationTicketClosed=Mediated
portfolio.closed.canceled=Cancelado
portfolio.failed.Failed=Falha
@@ -745,6 +807,9 @@ funds.tx.multiSigDeposit=Depósito Multisig: {0}
funds.tx.multiSigPayout=Pagamento Multisig: {0}
funds.tx.disputePayout=Pagamento de disputa: {0}
funds.tx.disputeLost=Caso de perda de disputa: {0}
+funds.tx.collateralForRefund=Refund collateral: {0}
+funds.tx.timeLockedPayoutTx=Time locked payout tx: {0}
+funds.tx.refund=Refund from arbitration: {0}
funds.tx.unknown=Razão desconhecida: {0}
funds.tx.noFundsFromDispute=Nenhum reembolso de disputa
funds.tx.receivedFunds=Fundos recebidos
@@ -765,14 +830,15 @@ funds.tx.dustAttackTx.popup=Esta transação está enviando uma quantia muito pe
# Support
####################################################################
-support.tab.support=Tickets de suporte
-support.tab.ArbitratorsSupportTickets=Tickets de suporte do árbitro
-support.tab.TradersSupportTickets=Tickets de suporte do negociador
+support.tab.mediation.support=Mediation
+support.tab.arbitration.support=Arbitration
+support.tab.legacyArbitration.support=Legacy Arbitration
+support.tab.ArbitratorsSupportTickets={0}'s tickets
support.filter=Lista de filtragem
support.filter.prompt=Insira ID da negociação. data. endereço onion ou dados da conta
support.noTickets=Não há tickets de suporte abertos
support.sendingMessage=Enviando mensagem...
-support.receiverNotOnline=Recebedor não está conectado. A mensagem foi gravada na caixa postal.
+support.receiverNotOnline=Receiver is not online. Message is saved to their mailbox.
support.sendMessageError=Erro ao enviar a mensagem: {0}
support.wrongVersion=A oferta nessa disputa foi criada com uma versão anterior do Bisq.\nVocê não pode fechar aquela disputa com a sua versão atual do programa.\n\nFavor utilizar uma versão mais velha com protocolo versão {0}
support.openFile=Abrir arquivo para anexar (tamanho máximo: {0} kb)
@@ -782,7 +848,7 @@ support.attachment=Anexo
support.tooManyAttachments=Você não pode enviar mais de 3 anexos em uma mensagem.
support.save=Salvar arquivo para o disco
support.messages=Mensagens
-support.input.prompt=Favor escreva aqui sua mensagem para o árbitro
+support.input.prompt=Enter message...
support.send=Enviar
support.addAttachments=Adicionar arquivos
support.closeTicket=Fechar ticket
@@ -801,14 +867,18 @@ support.buyerOfferer=Comprador de BTC / Ofetante
support.sellerOfferer=Vendedor de BTC / Ofertante
support.buyerTaker=Comprador de BTC / Aceitador da oferta
support.sellerTaker=Vendedor de BTC / Aceitador da oferta
-support.backgroundInfo=Como a Bisq não é uma empresa, as disputas são resolvidas de maneira diferente.\n\nSe surgir alguma disputa no processo de negociação (ex: se você não receber um pagamento), o aplicativo irá exibir um botão \"Abrir disputa\" após o período de negociação ter terminado. Esse botão permitirá que você entre em contato com árbitro da negociação.\n\nSe surgir algum problema/bug no aplicativo, o próprio aplicativo tentará detectá-lo e, se possível, irá exibir um botão \"Abrir ticket de suporte\". Este ticket será enviado para o árbitro, que encaminhará o problema detectado para os desenvolvedores do aplicativo.\n\nSe surgir algum problema/bug no aplicativo e o botão \"Abrir ticket de suporte\" não for exibido, você poderá abrir um ticket manualmente. Para fazer isso, acesse \"Portfolio/Negociações em aberto\", selecione a negociação em que o problema surgiu e use a combinação de teclas \"alt + o\" ou \"option + o\" no seu teclado. Por favor, utilize esse método somente se você tiver certeza de que o software não está funcionando como o esperado. Se você tiver problemas ou dúvidas, leia as dúvidas comuns (FAQ) no site https://bisq.network ou faça uma postagem na seção Suporte do fórum do Bisq.
-support.initialInfo=Descreva o seu problema no campo de texto abaixo. Adicione o máximo de informação possível para acelerar o tempo de resolução de disputa.\n\nAqui está uma lista de informações que você deve fornecer:\n● Se você é o comprador de BTC: Você fez a transferência da moeda fiduciária ou da Altcoin? Se sim, você clicou no botão 'pagamento iniciado' no programa?\n● Se você é o vendedor de BTC: Você recebeu o pagamento da moeda fiduciária ou Altcoin? Se sim, você clicou no botão 'pagamento recebido' no programa?\n● Qual é a versão do Bisq que está usando?\n● Qual é o sistema operacional que está usando?\n● Se encontrou um problema com transações falhas, considere trocar para um novo diretório de dados.\nÀs vezes, o diretório de dados fica corrompido e gera erros estranhos.\nConsulte: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPor favor, esteja familiarizado com as regras básicas para o processo de disputa:\n● Você precisa responder às solicitações do árbitro dentro de 2 dias.\n● O período máximo para uma disputa é de 14 dias.\n● Você precisa cooperar com o árbitro e fornecer as informações solicitadas para apresentar seu caso.\n● Você aceitou as regras descritas no documento de disputa no contrato do utilizador quando iniciou o programa pela primeira vez.\n\nVocê pode ler mais sobre o processo de disputa em: https://bisq.network/docs/exchange/arbitration-system
+support.backgroundInfo=Bisq is not a company, so it handles disputes differently.\n\nTraders can communicate within the application via a secure chat on the open trades screen to attempt solving a dispute on their own. If that is not sufficient, a mediator can step in to help. The mediator will evaluate the situation and give a recommendation for the payout of the trade funds. If both traders accept this suggestion, the payout transaction is completed and the trade is closed. If one or both traders do not agree to the mediator's recommended payout, they can request arbitration.The arbitrator has the third key of the deposit transaction and will make the payout based on their findings.
+support.initialInfo=Please enter a description of your problem in the text field below. Add as much information as possible to speed up dispute resolution time.\n\nHere is a check list for information you should provide:\n\t● If you are the BTC buyer: Did you make the Fiat or Altcoin transfer? If so, did you click the 'payment started' button in the application?\n\t● If you are the BTC seller: Did you receive the Fiat or Altcoin payment? If so, did you click the 'payment received' button in the application?\n\t● Which version of Bisq are you using?\n\t● Which operating system are you using?\n\t● If you encountered an issue with failed transactions please consider switching to a new data directory.\n\t Sometimes the data directory gets corrupted and leads to strange bugs. \n\t See: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPlease make yourself familiar with the basic rules for the dispute process:\n\t● You need to respond to the {0}''s requests within 2 days.\n\t● Mediators respond in between 2 days. Arbitrators respond in between 5 business days.\n\t● The maximum period for a dispute is 14 days.\n\t● You need to cooperate with the {1} and provide the information they request to make your case.\n\t● You accepted the rules outlined in the dispute document in the user agreement when you first started the application.\n\nYou can read more about the dispute process at: {2}
support.systemMsg=Mensagem do sistema: {0}
support.youOpenedTicket=Você abriu um pedido de suporte.\n\n{0}\n\nBisq versão: {1}
support.youOpenedDispute=Você abriu um pedido para uma disputa.\n\n{0}\n\nBisq versão: {1}
-support.peerOpenedTicket=O seu parceiro de negociação fez um pedido de suporte devido à problemas técnicos.\n\n{0}
-support.peerOpenedDispute=Seu parceiro de negociação solicitou uma disputa.\n\n{0}
+support.youOpenedDisputeForMediation=You requested mediation.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedTicket=Your trading peer has requested support due to technical problems.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDispute=Your trading peer has requested a dispute.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDisputeForMediation=Your trading peer has requested mediation.\n\n{0}\n\nBisq version: {1}
+support.mediatorsDisputeSummary=System message:\nMediator''s dispute summary:\n{0}
+support.mediatorsAddress=Mediator''s node address: {0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=Adicionar altcoin
setting.preferences.displayOptions=Opções de exibição
setting.preferences.showOwnOffers=Exibir minhas ofertas no livro de ofertas
setting.preferences.useAnimations=Usar animações
+setting.preferences.useDarkMode=Use dark mode (beta)
setting.preferences.sortWithNumOffers=Ordenar pelo nº de ofertas/negociações
setting.preferences.resetAllFlags=Esquecer marcações \"Não exibir novamente\"
setting.preferences.reset=Resetar
@@ -852,7 +923,7 @@ settings.preferences.selectCurrencyNetwork=Rede
setting.preferences.daoOptions=Opções da DAO
setting.preferences.dao.resync.label=Reconstruir o estado da DAO à partir da tx genesis
setting.preferences.dao.resync.button=Ressincronizar
-setting.preferences.dao.resync.popup=Depois de um reinício do programa, os dados de governança da rede P2P serão recarregados a partir dos nós semente e o estado consenso do BSQ será reconstruído a partir da transação genesis.
+setting.preferences.dao.resync.popup=After an application restart the Bisq 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=Executar Bisq como nó completo DAO
setting.preferences.dao.rpcUser=Nome de usuário de RPC
setting.preferences.dao.rpcPw=Senha de RPC
@@ -862,7 +933,7 @@ setting.preferences.dao.fullNodeInfo.ok=Abrir página de documentos
setting.preferences.dao.fullNodeInfo.cancel=Não, eu fico com o modo nó lite
settings.net.btcHeader=Rede Bitcoin
-settings.net.p2pHeader=Rede P2P
+settings.net.p2pHeader=Bisq network
settings.net.onionAddressLabel=Meu endereço onion
settings.net.btcNodesLabel=Usar nodos personalizados do Bitcoin Core
settings.net.bitcoinPeersLabel=Pares conectados
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=Recebido
settings.net.peerTypeColumn=Tipo
settings.net.openTorSettingsButton=Abrir configurações do Tor
+settings.net.versionColumn=Version
+settings.net.subVersionColumn=Subversion
+settings.net.heightColumn=Height
+
settings.net.needRestart=Você precisa reiniciar o programa para aplicar esta alteração.\nDeseja fazer isso agora?
settings.net.notKnownYet=Ainda desconhecido...
settings.net.sentReceived=Enviado: {0}, recebido: {1}
@@ -928,9 +1003,11 @@ setting.about.subsystems.val=Versão da rede: {0}; Versão de mensagens P2P: {1}
####################################################################
account.tab.arbitratorRegistration=Registro de árbitro
+account.tab.mediatorRegistration=Mediator registration
+account.tab.refundAgentRegistration=Refund agent registration
account.tab.account=Conta
account.info.headline=Bem vindo à sua conta Bisq
-account.info.msg=Nesta seção você pode criar e administrar contas para moedas nacionais e altcoins, escolher árbitros e fazer backup de sua carteira e dos dados da sua conta.\n\nUma carteira Bitcoin vazia foi criada na primeira vez que você iniciou o Bisq.\n\nRecomendamos que você anote as palavras da semente da sua carteira Bitcoin (na seção \"Semente da carteira\") e considere adicionar uma senha antes de transferir fundos para ela. Os depósitos e retiradas em Bitcoin são administrados na seção \"Fundos\".\n\nPrivacidade & Segurança:\nO Bisq é uma exchange descentralizada – ou seja, todos os seus dados pessoais são mantidos em seu computador. Nenhum servidor ou pessoa tem acesso às suas informações pessoais, seus fundos ou mesmo ao seu endereço IP. Dados como nº da conta corrente, endereços de Bitcoin e altcoins, etc. são compartilhados somente com os usuários que você iniciar uma negociação (caso surja uma disputa, o árbitro irá ver os mesmos dados que o seu parceiro de negociação consegue ver).
+account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer).
account.menu.paymentAccount=Contas de moedas nacionais
account.menu.altCoinsAccountView=Contas de altcoins
@@ -939,42 +1016,39 @@ account.menu.seedWords=Semente da carteira
account.menu.backup=Backup
account.menu.notifications=Notificações
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=Chave pública
-account.arbitratorRegistration.register=Registrar árbitro
-account.arbitratorRegistration.revoke=Revogar registro
-account.arbitratorRegistration.info.msg=Note que você precisa estar disponível por 15 dias após a revogação, pois podem existir negociações que estão utilizando você como árbitro. A duração máxima de uma negociação é de 8 dias e o processo de disputa pode levar até 7 dias.
+account.arbitratorRegistration.register=Register
+account.arbitratorRegistration.registration={0} registration
+account.arbitratorRegistration.revoke=Revogar
+account.arbitratorRegistration.info.msg=Please note that you need to stay available for 15 days after revoking as there might be trades which are using you as {0}. The max. allowed trade period is 8 days and the dispute process might take up to 7 days.
account.arbitratorRegistration.warn.min1Language=Você precisa escolher pelo menos 1 idioma.\nNós adicionamos o idioma padrão para você.
-account.arbitratorRegistration.removedSuccess=Você removeu com sucesso seu árbitro da rede P2P.
-account.arbitratorRegistration.removedFailed=Não foi possível remover árbitro.{0}
-account.arbitratorRegistration.registerSuccess=Você registrou seu árbitro com sucesso à rede P2P.
-account.arbitratorRegistration.registerFailed=Não foi possível registrar árbitro. {0}
-
-account.arbitratorSelection.minOneArbitratorRequired=Você precisa escolher pelo menos 1 idioma.\nNós adicionamos o idioma padrão para você.
-account.arbitratorSelection.whichLanguages=Quais idiomas você fala?
-account.arbitratorSelection.whichDoYouAccept=Quais árbitros você aceita
-account.arbitratorSelection.autoSelect=Selecionar automaticamente todos árbitros com língua compatível
-account.arbitratorSelection.regDate=Data de registro
-account.arbitratorSelection.languages=Idiomas
-account.arbitratorSelection.cannotSelectHimself=Um árbitro não pode selecionar a si mesmo para negociar.
-account.arbitratorSelection.noMatchingLang=Sem idioma compatível.
-account.arbitratorSelection.noLang=Você só pode selecionar árbitros que falem ao menos 1 idioma em comum.
-account.arbitratorSelection.minOne=Você precisa selecionar ao menos um árbitro.
+account.arbitratorRegistration.removedSuccess=You have successfully removed your registration from the Bisq network.
+account.arbitratorRegistration.removedFailed=Could not remove registration.{0}
+account.arbitratorRegistration.registerSuccess=You have successfully registered to the Bisq network.
+account.arbitratorRegistration.registerFailed=Could not complete registration.{0}
account.altcoin.yourAltcoinAccounts=Suas contas de altcoins
-account.altcoin.popup.wallet.msg=Certifique-se de seguir os requisitos para o uso de carteiras {0} conforme descrito na página {1}.\nUsar carteiras de exchanges centralizadas onde (a) você não controla suas chaves ou (b) que não usem carteiras compatíveis é arriscado: pode levar à perda dos fundos negociados!\nO árbitro não é um especialista de {2} e não pode ajudar em tais casos.
+account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases.
account.altcoin.popup.wallet.confirm=Eu entendo e confirmo que sei qual carteira preciso usar.
-account.altcoin.popup.arq.msg=Negociar ARQ no Bisq requer que você entenda e atenda aos seguintes requisitos:\n\nPara enviar ARQ, você precisa usar a wallet oficial do ArQmA GUI ou a carteira do ArQmA CLI com o marcador store-tx-info ativado (padrão em novas versões). Certifique-se que você pode acessar a chave da tx porque isso será necessário em caso de uma disputa.\narqma-wallet-cli (use o comando get_tx_key)\narqma-wallet-gui (vá para a aba do histórico e clique no botão (P) para comprovar o pagamento)\n\nEm exploradores de blocos normais, a transferência não é verificável.\n\nVocê precisa fornecer ao árbitro os seguintes dados em caso de disputa:\n- A chave privada da tx\n- O hash da transação\n- O endereço público do destinatário\n\nA falha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda do caso de disputa. O remetente do ARQ é responsável por fornecer a verificação da transferência do ARQ ao árbitro em caso de disputa.\n\nNão é necessário um código de pagamento, apenas o endereço público normal.\nSe você não tiver certeza sobre esse processo, visite o canal de discord do ArQmA (https://discord.gg/s9BQpJT) ou o fórum do ArQmA (https://labs.arqma.com) para obter mais informações.
-account.altcoin.popup.xmr.msg=Negociar XMR no Bisq requer que você entenda e cumpra os seguintes requisitos:\n\nPara enviar XMR, você precisa usar a carteira oficial Monero GUI ou a carteira Monero CLI com a flag store-tx-info ativada (padrão em novas versões). Por favor, certifique-se que você pode acessar a chave da tx porque isso será necessário em caso de uma disputa.\nmonero-wallet-cli (use o comando get_tx_key)\nmonero-wallet-gui (vá para a aba do histórico e clique no botão (P) para comprovar o pagamento)\n\nAlém da ferramenta checktx XMR (https://xmr.llcoins.net/checktx.html), a verificação também pode ser realizada na carteira.\nmonero-wallet-cli: usando o comando (check_tx_key).\nmonero-wallet-gui: na página Advanced> Prove/Check.\nEm exploradores de blocos normais, a transferência não é verificável.\n\nVocê precisa fornecer ao árbitro os seguintes dados em caso de disputa:\n- A chave privada da tx\n- O hash da transação\n- O endereço público do destinatário\n\nFalhar em fornecer os dados acima, ou se você usar uma carteira incompatível, resultará na perda do caso de disputa. O remetente da XMR é responsável por fornecer a verificação da transferência da XMR para o árbitro no caso de uma disputa.\n\nNão é necessário um código de pagamento, apenas o endereço público normal.\nSe você não tem certeza sobre o processo, visite (https://www.getmonero.org/resources/user-guides/prove-payment.html) ou o fórum Monero (https://forum.getmonero.org) para mais informações.
-account.altcoin.popup.blur.msg=Negociar BLUR no Bisq requer que você entenda e cumpra os seguintes requisitos:\n\nPara enviar BLUR você deve usar a carteira CLI da Blur Network ou a carteira GUI.\n\nSe você estiver usando a carteira CLI, um hash de transação (tx ID) será exibido após uma transferência ser enviada. Você deve guardar esta informação. Imediatamente após o envio da transferência, você deve usar o comando 'get_tx_key' para recuperar a chave privada da transação. Se você não conseguir executar essa etapa, talvez não consiga recuperar a chave mais tarde.\n\nSe você estiver usando a carteira GUI do Blur Network, a chave privada da transação e a ID da transação podem ser encontradas convenientemente na aba "Histórico". Imediatamente após o envio, localize a transação de interesse. Clique no símbolo "?" no canto inferior direito da caixa que contém a transação. Você deve guardar esta informação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um árbitro: 1.) a ID da transação, 2.) a chave privada da transação e 3.) o endereço do destinatário. O árbitro verificará a transferência do BLUR usando o Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nO não fornecimento das informações necessárias ao árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente de BLUR tem 100% de responsabilidade na verificação de transações para um árbitro.\n\nSe você não entender esses requisitos, não negocie no Bisq. Primeiro, procure ajuda no Discord da Rede de Blur (https://discord.gg/dMWaqVW).
-account.altcoin.popup.cash2.msg=Negociar o CASH2 no Bisq requer que você entenda e cumpra os seguintes requisitos:\n\nPara enviar CASH2, você deve usar Cash2 Wallet versão 3 ou superior.\n\nDepois que uma transação é enviada, a ID da transação será exibida. Você deve guardar esta informação. Imediatamente após o envio da transação, você deve usar o comando 'getTxKey' no simplewallet para recuperar a chave secreta da transação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um árbitro: 1) a ID da transação, 2) a chave secreta da transação e 3) o endereço Cash2 do destinatário. O árbitro irá então verificar a transferência do CASH2 usando o Explorador de Blocos do Cash2 (https://blocks.cash2.org).\n\nO não fornecimento das informações necessárias ao árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente do CASH2 tem 100% de responsabilidade na verificação de transações para um árbitro.\n\nSe você não entender esses requisitos, não negocie no Bisq. Primeiro procure ajuda no Discord do Cash2 (https://discord.gg/FGfXAYN).
-account.altcoin.popup.qwertycoin.msg=Negociar Qwertycoin no Bisq requer que você entenda e cumpra os seguintes requisitos:\n\nPara enviar o QWC, você deve usar a versão oficial do QWC Wallet 5.1.3 ou superior.\n\nDepois que uma transação é enviada, o ID da transação será exibida. Você deve guardar esta informação. Imediatamente após o envio da transação, você deve usar o comando 'get_Tx_Key' na simplewallet para recuperar a chave secreta da transação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um árbitro: 1) o ID da transação, 2) a chave secreta da transação e 3) o endereço QWC do destinatário. O árbitro então verificará a transferência do QWC usando o Explorador de Blocos QWC (https://explorer.qwertycoin.org).\n\nO não fornecimento das informações necessárias ao árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente QWC tem 100% da responsabilidade na verificação de transações para um árbitro.\n\nSe você não entender esses requisitos, não negocie no Bisq. Primeiro, procure ajuda no QWC Discord (https://discord.gg/rUkfnpC).
-account.altcoin.popup.drgl.msg=Negociar Dragonglass no Bisq requer que você entenda e cumpra os seguintes requisitos:\n\nPor causa da privacidade que a Dragonglass fornece, uma transação não é verificável na blockchain pública. Se necessário, você pode comprovar seu pagamento através do uso de sua chave privada TXN.\nA chave privade TXN é uma chave única gerada automaticamente para cada transação que só pode ser acessada dentro da sua carteira DRGL.\nTanto pela GUI do DRGL-wallet (dentro da janela de detalhes da transação) ou pelo simplewallet da CLI do Dragonglass (usando o comando "get_tx_key").\n\nÉ NECESSÁRIA a atulizicação da versão 'Oathkeeper' e superior do DRGL para ambas as partes.\n\nEm caso de disputa, você deve fornecer ao árbitro os seguintes dados:\n- A chave privada TXN\n- O hash da transação\n- O endereço público do destinatário\n\nA verificação do pagamento pode ser feita usando os dados acima como inputs em (http://drgl.info/#check_txn).\n\nA falha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda disputa. O remetente da Dragonglass é responsável por fornecer a verificação da transferência do DRGL para o árbitro em caso de disputa. O uso de PaymentID não é obrigatório.\n\nSe você não tiver certeza sobre qualquer parte deste processo, visite Dragonglass on Discord (http://discord.drgl.info) para obter ajuda.
-account.altcoin.popup.ZEC.msg=Ao usar o Zcash, você só pode usar os endereços transparentes (começando com t) e não os endereços z (privados), porque o árbitro não seria capaz de verificar a transação com endereços z.
-account.altcoin.popup.XZC.msg=Ao usar a Zcoin, você só pode usar os endereços transparentes (rastreáveis) e não os endereços não-rastreáveis, porque o árbitro não seria capaz de verificar a transação com endereços não rastreáveis num explorador de blocos.
+account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information.
+account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information.
+account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending XMR, you need to use either the official Monero GUI wallet or Monero CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nmonero-wallet-cli (use the command get_tx_key)\nmonero-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nIn addition to XMR checktx tool (https://xmr.llcoins.net/checktx.html) verification can also be accomplished in-wallet.\nmonero-wallet-cli : using command (check_tx_key).\nmonero-wallet-gui : on the Advanced > Prove/Check page.\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The XMR sender is responsible for providing verification of the XMR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit (https://www.getmonero.org/resources/user-guides/prove-payment.html) or the Monero forum (https://forum.getmonero.org) to find more information.
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs).
+account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW).
+account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/).
+account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN).
+account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC).
+account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help.
+account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses.
+account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer.
account.altcoin.popup.grin.msg=GRIN requer um processo interativo entre o remetente e o destinatário para criar a transação. Certifique-se de seguir as instruções da página web do projeto GRIN para enviar e receber de forma confiável o GRIN (o destinatário precisa estar online ou pelo menos estar online durante um determinado período de tempo).\n\nBisq suporta apenas o formato de URL da carteira Grinbox (Wallet713).\n\nO remetente GRIN é obrigado a fornecer prova de que ele enviou GRIN com sucesso. Se a carteira não puder fornecer essa prova, uma potencial disputa será resolvida em favor do destinatário de GRIN. Certifique-se de usar o software Grinbox mais recente, que suporta a prova de transação e que você entende o processo de transferência e receção do GRIN, bem como criar a prova.\n\nConsulte https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only para obter mais informações sobre a ferramenta de prova Grinbox.
account.altcoin.popup.beam.msg=BEAM requer um processo interativo entre o remetente e o destinatário para criar a transação.\n\nCertifique-se de seguir as instruções da página Web do projeto BEAM para enviar e receber BEAM de forma confiável (o destinatário precisa estar online ou pelo menos estar online durante um determinado período de tempo).\n\nO remetente BEAM é obrigado a fornecer prova de que ele enviou o BEAM com sucesso. Certifique-se de usar uma carteira que possa produzir tal prova. Se a carteira não puder fornecer a prova, uma disputa potencial será resolvida em favor do destinarário do BEAM.
-account.altcoin.popup.pars.msg=Negociar ParsiCoin no Bisq requer que você entenda e cumpra os seguintes requisitos:\n\nPara enviar o PARS, você deve usar a versão 3.0.0 ou superior da Wallet oficial ParsiCoin.\n\nVocê pode verificar o seu Transaction Hash e Transaction Key na seção Transações na sua carteira GUI (ParsiPay) Você precisa clicar com o botão direito sobre a transação e, em seguida, clique em mostrar detalhes.\n\nNo caso em que a arbitragem é necessária, você deve apresentar o seguinte a um árbitro: 1) o Hash de Transação, 2) a Chave de Transação e 3) o endereço de PARS do destinatário. O árbitro irá então verificar a transferência do PARS usando o ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nO não fornecimento das informações necessárias ao árbitro resultará na perda do caso de disputa. Em todos os casos de litígio, o remetente da ParsiCoin suporta 100% do ônus da responsabilidade na verificação de transações para um árbitro.\n\nSe você não entender esses requisitos, não negocie no Bisq. Primeiro, procure ajuda no Discord da ParsiCoin (https://discord.gg/c7qmFNh).
+account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh).
+
+account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash.
account.fiat.yourFiatAccounts=Suas contas de moeda nacional
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=Fator de unidade de cargo vinculado em BSQ
dao.param.ISSUANCE_LIMIT=Limite de emissão por ciclo em BSQ
dao.param.currentValue=Valor atual: {0}
+dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1})
dao.param.blocks={0} blocos
dao.results.cycle.duration.label=Duração de {0}
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} bloco(s)
dao.results.cycle.value.postFix.isDefaultValue=(valor padrão)
dao.results.cycle.value.postFix.hasChanged=(foi modificado em votação)
-dao.results.invalidVotes=Nós tivemos votos inválidos neste ciclo de votação. Isso pode ocorrer quando um voto não é bem distribuído na rede P2P.\n{0}
+dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=Indefinido
@@ -1503,7 +1578,7 @@ 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.name=Exact GitHub username
dao.proposal.display.link=Link para mais detalhes
dao.proposal.display.link.prompt=Link para proposta
dao.proposal.display.requestedBsq=Quantia requerida em BSQ
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=Voto atual: ''{0}''. Mudar voto para:
dao.proposal.display.myVote.accepted=Aceito
dao.proposal.display.myVote.rejected=Rejeitado
dao.proposal.display.myVote.ignored=Ignorado
-dao.proposal.myVote.summary=Votou: {0}; Peso do voto: {1} (ganhou: {2} + participação: {3});
+dao.proposal.display.myVote.unCounted=Vote was not included in result
+dao.proposal.myVote.summary=Voted: {0}; Vote weight: {1} (earned: {2} + stake: {3}) {4}
dao.proposal.myVote.invalid=O voto era inválido
dao.proposal.voteResult.success=Aceito
@@ -1680,6 +1756,7 @@ dao.monitor.daoState.utxoConflicts=Conflitos de UTXO
dao.monitor.daoState.utxoConflicts.blockHeight=Altura do bloco: {0}
dao.monitor.daoState.utxoConflicts.sumUtxo=Soma do total de UTXO: {0} BSQ
dao.monitor.daoState.utxoConflicts.sumBsq=Soma do total de BSQ: {0} BSQ
+dao.monitor.daoState.checkpoint.popup=DAO state is not in sync with the network. After restart the DAO state will resync.
dao.monitor.proposal.headline=Estado de propostas
dao.monitor.proposal.table.headline=Corrente dos hashes de estado da proposta
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=Transações BSQ
dao.factsAndFigures.dashboard.marketPrice=Dados de mercado
dao.factsAndFigures.dashboard.price=Último preço negociado de BSQ/BTC (no Bisq)
+dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price
+dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price
dao.factsAndFigures.dashboard.marketCap=Capitalização do mercado (com base no preço de negociação)
dao.factsAndFigures.dashboard.availableAmount=Total de BSQ disponível
@@ -1769,10 +1848,6 @@ displayUpdateDownloadWindow.download.openDir=Abrir pasta de download
disputeSummaryWindow.title=Resumo
disputeSummaryWindow.openDate=Data da abertura do ticket
disputeSummaryWindow.role=Função do negociador
-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/Screencast
disputeSummaryWindow.payout=Pagamento da quantia negociada
disputeSummaryWindow.payout.getsTradeAmount={0} BTC fica com o pagamento da negociação
disputeSummaryWindow.payout.getsAll={0} BTC fica com tudo
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=Banco
disputeSummaryWindow.summaryNotes=Notas de resumo
disputeSummaryWindow.addSummaryNotes=Adicionar notas de resumo
disputeSummaryWindow.close.button=Fechar ticket
-disputeSummaryWindow.close.msg=Ticket fechado em {0}\n\nResumo:\n{1} evidência resistente a adulteração entregue: {2}\n{3} fez verificação de ID: {4}\n{5} fez screencast ou vídeo: {6}\nQuantia de pagamento para o comprador BTC: {7}\nQuantia de pagamento para o vendedor BTC: {8}\n\nNotas do resumo:\n{9}
+disputeSummaryWindow.close.msg=Ticket closed on {0}\n\nSummary:\nPayout amount for BTC buyer: {1}\nPayout amount for BTC seller: {2}\n\nSummary notes:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\nNext steps:\nOpen ongoing trade and accept or reject the suggested mediation
disputeSummaryWindow.close.closePeer=Você também precisa fechar o ticket dos parceiros de negociação!
+disputeSummaryWindow.close.txDetails.headline=Publish refund transaction
+disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction?
emptyWalletWindow.headline={0} ferramenta de emergência da carteira
emptyWalletWindow.info=Por favor, utilize essa opção apenas em caso de emergência, caso você não consiga acessar seus fundos a partir do programa.\n\nNote que todas as ofertas abertas serão fechadas automaticamente quando você utilizar esta ferramenta.\n\nAntes de usar esta ferramenta, faça um backup da sua pasta de dados. Você pode fazer isso em \"Conta/Backup\".\n\nHavendo qualquer problema, avise-nos através do GitHub ou do fórum Bisq, para que assim possamos investigar o que causou o problema.
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=Você possui ofertas abertas que serão removi
emptyWalletWindow.openOffers.yes=Sim, tenho certeza
emptyWalletWindow.sent.success=O conteúdo da sua carteira foi transferido com sucesso.
-enterPrivKeyWindow.headline=Cadastro aberto apenas para árbitros convidados
+enterPrivKeyWindow.headline=Enter private key for registration
filterWindow.headline=Editar lista de filtragem
filterWindow.offers=Ofertas filtradas (sep. por vírgula):
@@ -1815,6 +1895,8 @@ filterWindow.accounts=Dados de conta de negociação filtrados:\nFormato: lista
filterWindow.bannedCurrencies=Códigos de moedas filtrados (sep. por vírgula)
filterWindow.bannedPaymentMethods=IDs de método de pagamento filtrados (sep. por vírgula)
filterWindow.arbitrators=Árbitros filtrados (endereços onion sep. por vírgula)
+filterWindow.mediators=Filtered mediators (comma sep. onion addresses)
+filterWindow.refundAgents=Filtered refund agents (comma sep. onion addresses)
filterWindow.seedNode=Nós de semente filtrados (endereços onion sep. por vírgula)
filterWindow.priceRelayNode=Nós de transmissão de preço filtrados (endereços onion sep. por vírgula)
filterWindow.btcNode=Nós de Bitcoin filtrados (endereços + portas sep. por vírgula)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(ID/BIC/SWIFT do banco do ofertante)
offerDetailsWindow.offerersBankName=(nome do banco do ofertante)
offerDetailsWindow.bankId=ID do banco (ex: BIC ou SWIFT)
offerDetailsWindow.countryBank=País do banco do ofertante
-offerDetailsWindow.acceptedArbitrators=Árbitros aceitos
offerDetailsWindow.commitment=Compromisso
offerDetailsWindow.agree=Eu concordo
offerDetailsWindow.tac=Termos e condições
@@ -1847,11 +1928,11 @@ qRCodeWindow.msg=Utilize esse código QR para realizar depósitos em sua carteir
qRCodeWindow.request=Solicitação de pagamento:\n{0}
selectDepositTxWindow.headline=Selecionar transação de depósito para disputa
-selectDepositTxWindow.msg=A transação do depósito não foi guardada na negociação.\nPor favor, selecione a transação multisig de sua carteira usada como transação de depósito na negociação que falhou.\n\nVocê pode descobrir qual foi a transação abrindo a janela de detalhe de negociações (clique no ID da negociação na lista) e seguindo a saída (output) da transação de pagamento da taxa de negociação para a próxima transação onde você verá a transação de depósito multisig (o endereço inicia com o número 3). Esse ID de transação deve estar visível na lista apresentada aqui. Uma vez encontrada a transação, selecione-a aqui e continue.\n\nDesculpe-nos pelo ocorrido, este erro deveria ocorrer muito raramente e no futuro iremos procurar melhores maneiras de resolvê-lo.
+selectDepositTxWindow.msg=A transação do depósito não foi armazenada na negociação.\nPor favor, selecione a transação multisig da sua carteira utilizada como transação de depósito na negociação que falhou.\n\nVocê pode verificar qual foi a transação abrindo a janela de detalhe de negociações (clique no ID da negociação na lista) e seguindo a saída (output) da transação de pagamento da taxa de negociação para a próxima transação onde você verá a transação de depósito multisig (o endereço começa com o número 3). Esse ID de transação deve estar visível na lista apresentada aqui. Uma vez encontrada a transação, selecione-a aqui e continue.\n\nDesculpe o transtorno, este erro deve ocorrer muito pouco e no futuro vamos procurar melhores formas de resolvê-lo.
selectDepositTxWindow.select=Selecionar transação de depósito
selectBaseCurrencyWindow.headline=Seleção de mercado
-selectBaseCurrencyWindow.msg=O mercado padrão selecionado é {0}.\n\nSe você quer trocá-lo para outra moeda, por favor, selecione-a.\nVocê também pode mudar isso depois na tela \"Configurações/Rede\".
+selectBaseCurrencyWindow.msg=O mercado padrão selecionado é {0}.\n\nSe quiser trocá-lo para outra moeda, por favor, selecione.\nVocê também pode trocar a moeda depois, na tela \"Configurações/Rede\".
selectBaseCurrencyWindow.select=Escolher moeda de base
sendAlertMessageWindow.headline=Enviar notificação global
@@ -1883,6 +1964,7 @@ tradeDetailsWindow.tradeDate=Data da negociação
tradeDetailsWindow.txFee=Taxa de mineração
tradeDetailsWindow.tradingPeersOnion=Endereço onion dos parceiros de negociação
tradeDetailsWindow.tradeState=Estado da negociação
+tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
walletPasswordWindow.headline=Digite senha para abrir:
@@ -1895,7 +1977,7 @@ torNetworkSettingWindow.obfs3=obfs3
torNetworkSettingWindow.obfs4=obfs4 (recomendado)
torNetworkSettingWindow.meekAmazon=meek-amazon
torNetworkSettingWindow.meekAzure=meek-azure
-torNetworkSettingWindow.enterBridge=Insira um ou mais relés de pontes (um por linha)
+torNetworkSettingWindow.enterBridge=Insira uma ou mais pontes de retransmissão (uma por linha)
torNetworkSettingWindow.enterBridgePrompt=digite endereço:porta
torNetworkSettingWindow.restartInfo=Você precisa reiniciar o programa para aplicar as modificações
torNetworkSettingWindow.openTorWebPage=Abrir site do projeto Tor
@@ -1923,62 +2005,63 @@ popup.headline.instruction=Favor observar:
popup.headline.attention=Atenção
popup.headline.backgroundInfo=Informação preliminar
popup.headline.feedback=Concluído
-popup.headline.confirmation=Comfirmação
+popup.headline.confirmation=Confirmação
popup.headline.information=Informação
popup.headline.warning=Aviso
popup.headline.error=Erro
popup.doNotShowAgain=Não mostrar novamente
popup.reportError.log=Abrir arquivo de log
-popup.reportError.gitHub=Relatar à lista de problemas do GitHub
-popup.reportError={0}\n\nPara nos ajudar a melhorar o programa, reporte o problema criando um relato (Issue) em nossa página do GitHub em https://github.com/bisq-network/bisq/issues.\n\nA mensagem de erro exibida acima será copiada para a área de transferência quando você clicar qualquer um dos botões abaixo.\nO resolvimento de problemas será mais fácil se você anexar o arquivo bisq.log ao clicar em "Abrir arquivo de log", salvando uma cópia e incluindo-a em seu relato do problema (Issue) no GitHub.
+popup.reportError.gitHub=Reportar à lista de problemas no GitHub
+popup.reportError={0}\n\nPara nos ajudar a melhorar o aplicativo, reporte o bug criando um relatório (Issue) em nossa página do GitHub em https://github.com/bisq-network/bisq/issues.\n\nA mensagem de erro exibida acima será copiada para a área de transferência quando você clicar qualquer um dos botões abaixo.\nA solução de problemas será mais fácil se você anexar o arquivo bisq.log ao clicar em "Abrir arquivo de log", salvando uma cópia e incluindo-a em seu relatório do problema (Issue) no GitHub.
popup.error.tryRestart=Por favor, reinicie o aplicativo e verifique sua conexão de Internet para ver se o problema foi resolvido.
-popup.error.takeOfferRequestFailed=Um erro ocorreu quando alguém tentou aceitar uma de suas ofertas:\n{0}
+popup.error.takeOfferRequestFailed=Houve um quando alguém tentou aceitar uma de suas ofertas:\n{0}
-error.spvFileCorrupted=Um erro ocorreu ao ler o arquivo SPV chain.\nPode ser que o arquivo SPV chain esteja corrompido.\n\nMensagem de erro: {0}\n\nDeseja remover o arquivo e ressincronizar?
+error.spvFileCorrupted=Houve um erro ao ler o arquivo SPV chain.\nPode ser que o arquivo SPV chain esteja corrompido.\n\nMensagem de erro: {0}\n\nDeseja remover o arquivo e re-sincronizar?
error.deleteAddressEntryListFailed=Não foi possível apagar o arquivo AddressEntryList.\nErro: {0}
popup.warning.walletNotInitialized=A carteira ainda não foi inicializada
-popup.warning.wrongVersion=Você provavelmente está usando a versão incorreta do Bisq para este computador.\nA arquitetura do seu computador é: {0}.\nO binário do Bisq que você instalou é: {1}.\nPor favor, feche o programa e reinstale a versão correta ({2}).
-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=O Bisq já está sendo executado. 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 ID {0} atingiu metade do período máximo permitido e ainda não foi concluída.\n\nO período de negociação acaba em {1}\n\nFavor verifique o estado de sua negociação em \"Portfolio/Negociações em aberto\" para mais informações.
-popup.warning.tradePeriod.ended=Sua negociação com ID {0} atingiu o período máximo permitido e ainda não foi concluída.\n\nO período de negociação acabou em {1}\n\nFavor verifique sua negociação em \"Portfolio/Negociações em aberto\" para entrar em contato com o árbitro.
-popup.warning.noTradingAccountSetup.headline=Você ainda não configurou uma conta de negociação
-popup.warning.noTradingAccountSetup.msg=Você precisa criar uma conta com moeda nacional ou altcoin antes de criar uma oferta.\nQuer criar uma conta?
+popup.warning.wrongVersion=Você provavelmente está usando a versão incorreta do Bisq para este computador.\nA arquitetura do seu computador é: {0}.\nO binário do Bisq que você instalou é: {1}.\nPor favor, feche o programa e instale a versão correta ({2}).
+popup.warning.incompatibleDB=Detectamos arquivos de base de dados incompatíveis!\n\nEsse(s) arquivo(s) 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) arquivo(s) corrompido(s) e aplicamos os valores padrão a uma nova versão da base de dados.\n\nO backup está 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=O Bisq já está sendo executado. Você não pode executar duas instâncias do Bisq ao mesmo tempo.
+popup.warning.cryptoTestFailed=Parece que você usa um binário auto-compilado e não seguiu as instruções de compilação publicadas em: https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nSe não for este o caso, e você estiver usando 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 ID {0} chegou à metade do período máximo permitido e ainda não foi concluída.\n\nO período de negociação acaba em {1}\n\nFavor verifique o estado de sua negociação em \"Portfolio/Negociações em aberto\" para mais informações.
+popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
+popup.warning.noTradingAccountSetup.headline=Você ainda não configurou uma conta para negociação
+popup.warning.noTradingAccountSetup.msg=Você precisa criar uma conta em moeda nacional ou altcoin para poder criar uma oferta.\nCriar uma conta?
popup.warning.noArbitratorsAvailable=Não há árbitros disponíveis.
+popup.warning.noMediatorsAvailable=There are no mediators available.
popup.warning.notFullyConnected=Você precisa aguardar até estar totalmente conectado à rede.\nIsto pode levar até 2 minutos na inicialização do programa.
popup.warning.notSufficientConnectionsToBtcNetwork=Você precisa esperar até ter pelo menos {0} conexões à rede Bitcoin.
-popup.warning.downloadNotComplete=Você precisa aguardar até que termine o download dos blocos Bitcoin restantes
+popup.warning.downloadNotComplete=Você precisa aguardar até que termine o download dos blocos de Bitcoin restantes
popup.warning.removeOffer=Tem certeza que deseja remover essa oferta?\nA taxa de oferta de {0} será perdida se você removê-la.
-popup.warning.tooLargePercentageValue=Você não pode definir uma porcentage suprior a 100%.
-popup.warning.examplePercentageValue=Digite um número porcentual como \"5.4\" para 5.4%
-popup.warning.noPriceFeedAvailable=Não há canal de preços disponível para essa moeda. Você não pode usar um preço porcentual.\nFavor selecionar um preço fixo.
-popup.warning.sendMsgFailed=O envio da mensagem para seu parceiro de negociação falhou.\nFavor tentar novamente e se o erro persistir reportar o erro (bug report).
+popup.warning.tooLargePercentageValue=Você não pode definir uma porcentagem superior a 100%.
+popup.warning.examplePercentageValue=Digite um número percentual, como \"5.4\" para 5.4%
+popup.warning.noPriceFeedAvailable=Não há feed de preços disponível para essa moeda. Você não pode usar um preço porcentual.\nPor favor selecione um preço fixo.
+popup.warning.sendMsgFailed=O envio da mensagem para seu parceiro de negociação falhou.\nFavor tentar novamente, e se o erro persistir reportar o erro (bug report).
popup.warning.insufficientBtcFundsForBsqTx=Você não possui fundos BTC suficientes para pagar a taxa de mineração para essa transação.\nPor favor, deposite BTC em sua carteira.\nFundos faltando: {0}
-popup.warning.bsqChangeBelowDustException=Essa transação cria uma mudança no output que está abaixo do limite de poeira (546 Satoshi) e que seria rejeitada na rede Bitcoin.\n\nVocê precisa adicionar essa quantia de poeira no envio para evitar poeira.\n\nO output de poeira é [0].
-popup.warning.btcChangeBelowDustException=Essa transação cria um output de troco que está abaixo do limite de poeira (546 Satoshi) e seria rejeitada pela rede Bitcoin.\n\nPara evitar isso, é necessário adicionar o valor da poeira na quantia a ser enviada.\n\nO output de peira é {0}.
+popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the Bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the Bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
-popup.warning.insufficientBsqFundsForBtcFeePayment=Você não tem fundos de BSQ suficientes para pagar a taxa de negócio em BSQ. Você pode pagar a taxa em BTC ou você precisa financiar sua carteira BSQ. Você pode comprar BSQ no Bisq.\n\nFundos BSQ em falta: {0}
+popup.warning.insufficientBsqFundsForBtcFeePayment=Você não tem fundos de BSQ suficientes para pagar a taxa de negociação em BSQ. Você pode pagar a taxa em BTC ou você precisa depositar mais sua carteira BSQ. Você pode comprar BSQ no Bisq.\n\nFundos BSQ faltando: {0}
popup.warning.noBsqFundsForBtcFeePayment=Sua carteira BSQ não possui fundos suficientes para pagar a taxa de transação em BSQ.
-popup.warning.messageTooLong=Sua mensagem excede o tamanho máximo permitido. Favor enviá-la em várias partes ou subir utilizando um serviço como https://pastebin.com.
-popup.warning.lockedUpFunds=Você bloqueou fundos de um negócio falhado.\nSaldo bloqueado: {0}\nEndereço de tx de depósito: {1}\nID do negócio: {2}.\n\nPor favor, abra um bilhete de apoio selecionando o negócio no ecrã de negócios pendentes e clicando em \"alt + o\" ou \"option + o\"."
+popup.warning.messageTooLong=Sua mensagem excede o tamanho máximo permitido. Favor enviá-la em várias partes ou utilizando um serviço como https://pastebin.com.
+popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"."
-popup.warning.nodeBanned=Um dos {0} nodos foi banido. Por favor, reinicie o programa para certificar-se de que você não está conectado ao nodo banido.
+popup.warning.nodeBanned=Um dos {0} nodes foi banido. Por favor, reinicie o programa para certificar-se de que você não está conectado ao node banido.
popup.warning.priceRelay=transmissão de preço
popup.warning.seed=semente
-popup.warning.mandatoryUpdate.trading=Faça o update para a última versão do Bisq. Um update obrigatório que foi lançado, desabilita negociações em versões antigas. Por gentileza, veja o Fórum do Bisq para mais informações.
-popup.warning.mandatoryUpdate.dao=Faça o update para a última versão do Bisq. Um update obrigatório que foi lançado, desabilita a DAO Bisq e BSQ. Por gentileza, veja o Fórum do Bisq para mais informações.
-popup.warning.disable.dao=A DAO Bisq e BSQ estão temporariamente desabilitados. Verifique o fórum Bisq para mais informações.
-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.warning.mandatoryUpdate.trading=Faça o update para a última versão do Bisq. Um update obrigatório foi lançado e desabilita negociações em versões antigas. Por favor, veja o Fórum do Bisq para mais informações.
+popup.warning.mandatoryUpdate.dao=Faça o update para a última versão do Bisq. Um update obrigatório foi publicado, ele desabilita a DAO Bisq e BSQ em versões anteriores. Por gentileza, veja o Fórum do Bisq para mais informações.\n\n
+popup.warning.disable.dao=A DAO Bisq e BSQ estão temporariamente desativados. Verifique o fórum Bisq para mais informações.
+popup.warning.burnBTC=Esta transação não é possível, pois as taxas de mineração de {0} excederiam 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 ambas as partes sigam o protocolo de negociação, tanto o vendedor quanto o comprador precisam realizar um depósito de segurança.\n\nEste depósito permanecerá em sua carteira local até que a negociação seja concluída com sucesso. A seguir, ele será devolvido para você.\n\nAtenção: se você está criando uma nova oferta, é necessário que você mantenha o programa aberto, para que outro usuário possa aceitar a sua oferta. Para manter suas ofertas online, mantenha o Bisq sempre aberto e certifique-se de que as funções de economia de energia do seu computador estão desativadas (desative a função standby do seu computador).
+popup.info.securityDepositInfo=Para garantir que ambas as partes sigam o protocolo de negociação, tanto o vendedor quanto o comprador precisam fazer um depósito de segurança.\n\nEste depósito permanecerá em sua carteira local até que a negociação seja concluída com sucesso. Depois, ele será devolvido para você.\n\nAtenção: se você está criando uma nova oferta, é necessário que você mantenha o programa aberto, para que outro usuário possa aceitar a sua oferta. Para manter suas ofertas online, mantenha o Bisq sempre aberto e conectado à internet (por exemplo: verifique-se de que as funções de economia de energia do seu computador estão desativadas).
popup.info.cashDepositInfo=Certifique-se de que você possui uma agência bancária em sua região para poder fazer o depósito em dinheiro.\nO ID (BIC/SWIFT) do banco do vendedor é: {0}.
-popup.info.cashDepositInfo.confirm=Eu confirmo que eu posso fazer o depósito
-popup.info.shutDownWithOpenOffers=O Bisq está sendo desligado, mas existem ofertas abertas.\n\nEstas ofertas não ficaram disponíveis na rede P2P enquanto o Bisq estiver desligado, mas elas serão republicadas na rede na próxima vez que você iniciar o programa.\n\nPara manter suas ofertas online, mantenha o Bisq aberto e certifique-se de que o seu computador permanece online (ex: certifique-se de que o computador não está entrando em modo de hibernação).\n
+popup.info.cashDepositInfo.confirm=Eu confirmo que posso fazer o depósito
+popup.info.shutDownWithOpenOffers=O Bisq está desligando, mas há ofertas abertas.\n\nEstas ofertas não ficaram disponíveis na rede P2P enquanto o Bisq estiver desligado, mas elas serão republicadas na rede assim que você iniciar o programa.\n\nPara manter suas ofertas online, mantenha o Bisq aberto e certifique-se de que o seu computador continua online (ex: certifique-se de que o computador não está entrando em modo de hibernação).\n
popup.privateNotification.headline=Notificação privada importante!
@@ -1986,26 +2069,43 @@ popup.privateNotification.headline=Notificação privada importante!
popup.securityRecommendation.headline=Recomendação de segurança importante
popup.securityRecommendation.msg=Lembre-se de proteger a sua carteira com uma senha, caso você já não tenha criado uma.\n\nRecomendamos que você escreva num papel as palavras da semente de sua carteira. Essas palavras funcionam como uma senha mestra para recuperar a sua carteira Bitcoin, caso o seu computador apresente algum problema.\nVocê irá encontrar mais informações na seção \"Semente da carteira\".\n\nTambém aconselhamos que você faça um backup completo da pasta de dados do programa na seção \"Backup\".
-popup.bitcoinLocalhostNode.msg=O Bisq detectou um nó do Bitcoin Core em execução localmente (no localhost).\nPor favor, certifique-se de que este nó esteja totalmente sincronizado antes de iniciar o Bisq e que ele não esteja em execução no pruned mode.
+popup.bitcoinLocalhostNode.msg=O Bisq detectou um node do Bitcoin Core em execução no ambiente local (localhost).\nPor favor, certifique-se de que este node esteja totalmente sincronizado antes de iniciar o Bisq e que ele não esteja em execução em pruned mode.
popup.shutDownInProgress.headline=Desligando
-popup.shutDownInProgress.msg=O desligamento do programa pode levar alguns segundos.\nPor favor, não interrompa o processo.
+popup.shutDownInProgress.msg=O desligamento do programa pode levar alguns segundos.\nPor favor, não interrompa este processo.
popup.attention.forTradeWithId=Atenção para a negociação com ID {0}
-popup.roundedFiatValues.headline=Valores arredondados em moeda fiduciária
-popup.roundedFiatValues.msg=Para aumentar a privacidade da sua transação, a quantia em {0} foi arredondada.\n\nDependendo da versão do cliente, você poderá fazer transações com valores arredondados ou não.\n\nTanto os valores arredondados quanto os não arredondados são aceitos como válidos no protocolo de negociação.\n\nOs valores em BTC serão modificados automaticamente para corresponderem o mais próximo possível à quantia arredondada em moeda fiduciária.
-
popup.info.multiplePaymentAccounts.headline=Múltiplas contas de pagamento disponíveis
popup.info.multiplePaymentAccounts.msg=Você tem várias contas de pagamento disponíveis para esta oferta. Por favor, verifique se você escolheu a correta.
-popup.dao.launch.headline=A visão completa, concretizada
-popup.dao.launch.governance.title=Governança
-popup.dao.launch.governance=A rede de negociação do Bisq já era descentralizada.\nCom a DAO do Bisq, a liderança do Bisq agora também é descentralizada, tornando o Bisq excepcionalmente resistente à censura.
-popup.dao.launch.trading.title=Negociação
-popup.dao.launch.trading=Negocie BSQ (um bitcoin colorido) para participar na governança do Bisq. Você pode comprar e vender BSQ como qualquer outro ativo no Bisq.
-popup.dao.launch.cheaperFees.title=Taxas mais baratas
-popup.dao.launch.cheaperFees=Obtenha um desconto de 90% nas taxas de negociação quando você usa BSQ. Economize e apoie o projeto ao mesmo tempo!\n\n
+popup.news.launch.headline=Two Major Updates
+popup.news.launch.accountSigning.headline=ACCOUNT SIGNING
+popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer.
+popup.news.launch.ntp.headline=NEW TRADE PROTOCOL
+popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant.
+
+popup.accountSigning.selectAccounts.headline=Select payment accounts
+popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign.
+popup.accountSigning.selectAccounts.signAll=Sign all payment methods
+popup.accountSigning.selectAccounts.datePicker=Select point of time until which accounts will be signed
+
+popup.accountSigning.confirmSelectedAccounts.headline=Confirm selected payment accounts
+popup.accountSigning.confirmSelectedAccounts.description=Based on your input, {0} payment accounts will be selected.
+popup.accountSigning.confirmSelectedAccounts.button=Confirm payment accounts
+popup.accountSigning.signAccounts.headline=Confirm signing of payment accounts
+popup.accountSigning.signAccounts.description=Based on your selection, {0} payment accounts will be signed.
+popup.accountSigning.signAccounts.button=Sign payment accounts
+popup.accountSigning.signAccounts.ECKey=Enter private arbitrator key
+popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey
+
+popup.accountSigning.success.headline=Congratulations
+popup.accountSigning.success.description=All {0} payment accounts were successfully signed!
+popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0}
+popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1}
+popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0}
+popup.accountSigning.peerSigner=One of your accounts is mature enough to sign other payment accounts and the initial limit for one of your accounts has been lifted.\n\n{0}
####################################################################
# Notifications
@@ -2013,16 +2113,16 @@ popup.dao.launch.cheaperFees=Obtenha um desconto de 90% nas taxas de negociaçã
notification.trade.headline=Notificação para o oferta com ID {0}
notification.ticket.headline=Ticket de suporte para a oferta com ID {0}
-notification.trade.completed=A negociação completou e você já pode retirar seus fundos.
-notification.trade.accepted=Sua oferta foi aceita por um {0} BTC.
-notification.trade.confirmed=Sua negociação tem ao menos uma confirmação da blockchain.\nVocê pode iniciar o pagamento agora.
+notification.trade.completed=A negociação foi concluída e você já pode retirar seus fundos.
+notification.trade.accepted=Sua oferta foi aceita por um {0}.
+notification.trade.confirmed=Sua negociação tem pelo menos uma confirmação da blockchain.\nVocê já pode iniciar o pagamento.
notification.trade.paymentStarted=O comprador BTC iniciou o pagamento
notification.trade.selectTrade=Selecionar negociação
notification.trade.peerOpenedDispute=Seu parceiro de negociação abriu um {0}.
notification.trade.disputeClosed=A {0} foi fechada.
notification.walletUpdate.headline=Update da carteira de negociação
notification.walletUpdate.msg=Sua carteira Bisq tem saldo suficiente.\nQuantia: {0}
-notification.takeOffer.walletUpdate.msg=Sua carteira Bisq já tinha saldo suficiente proveniente de uma tentativa anterior de aceitar oferta.\nQuantia: {0}
+notification.takeOffer.walletUpdate.msg=Sua carteira Bisq já tinha saldo suficiente de uma tentativa anterior de aceitar oferta.\nQuantia: {0}
notification.tradeCompleted.headline=Negociação concluída
notification.tradeCompleted.msg=Você pode retirar seus fundos agora para sua carteira Bitcoin externa ou transferi-los para a carteira Bisq.
@@ -2031,8 +2131,8 @@ notification.tradeCompleted.msg=Você pode retirar seus fundos agora para sua ca
# System Tray
####################################################################
-systemTray.show=Mostrar janela do programa
-systemTray.hide=Esconder janela do programa
+systemTray.show=Mostrar janela do applicativo
+systemTray.hide=Esconder janela do applicativo
systemTray.info=Informações sobre Bisq
systemTray.exit=Sair
systemTray.tooltip=Bisq: A exchange descentralizada
@@ -2042,20 +2142,20 @@ systemTray.tooltip=Bisq: A exchange descentralizada
# GUI Util
####################################################################
-guiUtil.miningFeeInfo=Certifique-se de que a taxa de mineração utilizada na sua carteira externa tenha pelo menos {0} satoshis/byte. Caso contrário, as transações da negociação podem não ser confirmadas e a negociação pode resultar em uma disputa.
+guiUtil.miningFeeInfo=Certifique-se de que a taxa de mineração utilizada na sua carteira externa tenha pelo menos {0} satoshis/byte. Caso contrário, as transações da negociação podem não ser confirmadas e a negociação pode resultar numa disputa.
guiUtil.accountExport.savedToPath=Contas de negociação salvas na pasta:\n{0}
-guiUtil.accountExport.noAccountSetup=Você não tem contas de negociação prontas para exportar.
+guiUtil.accountExport.noAccountSetup=Você não tem contas de negociação para exportar.
guiUtil.accountExport.selectPath=Selecione pasta de {0}
# suppress inspection "TrailingSpacesInProperty"
guiUtil.accountExport.tradingAccount=Conta de negociação com ID {0}
# suppress inspection "TrailingSpacesInProperty"
-guiUtil.accountImport.noImport=Nós não importamos uma conta de negociação com id {0} pois ela já existe.\n
+guiUtil.accountImport.noImport=Não importamos a conta de negociação com id {0} pois ela já existe.\n
guiUtil.accountExport.exportFailed=Exportar para CSV falhou pois houve um erro.\nErro = {0}
guiUtil.accountExport.selectExportPath=Selecionar pasta para exportar
guiUtil.accountImport.imported=Conta de negociação importada da pasta:\n{0}\n\nContas importadas:\n{1}
-guiUtil.accountImport.noAccountsFound=Nenhuma conta de negociação exportada foi encontrada no caminho: {0}.\nNome do arquivo é {1}."
-guiUtil.openWebBrowser.warning=Você abrirá uma página da web em seu navegador padrão.\nDeseja abrir a página agora?\n\nSe você não estiver usando o \"Tor Browser\" como seu navegador padrão você conectará à página na rede aberta (clear net).\n\nURL: \"{0}\"
+guiUtil.accountImport.noAccountsFound=Nenhuma conta de negociação exportada foi encontrada em: {0}.\nNome do arquivo é {1}."
+guiUtil.openWebBrowser.warning=Você abrirá uma página web em seu navegador padrão.\nDeseja abrir a página agora?\n\nSe você não estiver usando o \"Tor Browser\" como seu navegador padrão você conectará à página pela internet aberta (clear net).\n\nURL: \"{0}\"
guiUtil.openWebBrowser.doOpen=Abrir a página e não perguntar novamente
guiUtil.openWebBrowser.copyUrl=Copiar URL e fechar
guiUtil.ofTradeAmount=da quantia da negociação
@@ -2071,6 +2171,7 @@ list.currency.editList=Editar lista de moedas
table.placeholder.noItems=Atualmente não há {0} disponíveis
table.placeholder.noData=Não há dados disponíveis no momento
+table.placeholder.processingData=Processing data...
peerInfoIcon.tooltip.tradePeer=Parceiro de negociação
@@ -2081,30 +2182,31 @@ peerInfoIcon.tooltip.age=Conta de pagamento criada {0} atrás.
peerInfoIcon.tooltip.unknownAge=Idade da conta de pagamento desconhecida.
tooltip.openPopupForDetails=Abrir popup para mais detalhes
-tooltip.openBlockchainForAddress=Abrir um explorador de blockchain externo para endereço: {0}
-tooltip.openBlockchainForTx=Abrir um explorador de blockchain externo para transação: {0}
+tooltip.openBlockchainForAddress=Abrir um explorer de blockchain externo para o endereço: {0}
+tooltip.openBlockchainForTx=Abrir um explorer de blockchain externo para a transação: {0}
-confidence.unknown=Estado desconhecido da transação
+confidence.unknown=Transação com estado desconhecido
confidence.seen=Visto por {0} par(es) / 0 confirmações
confidence.confirmed=Confirmado em {0} bloco(s)
confidence.invalid=A transação é inválida
peerInfo.title=Informação do par
peerInfo.nrOfTrades=Nº de negociações concluídas
-peerInfo.notTradedYet=Você ainda não negociou com esse usuário.
-peerInfo.setTag=Definir uma etiqueta para esse trader
-peerInfo.age=Idade da conta de pagamento
+peerInfo.notTradedYet=Você ainda não negociou com este usuário.
+peerInfo.setTag=Definir um rótulo para este par
+peerInfo.age.noRisk=Idade da conta de pagamento
+peerInfo.age.chargeBackRisk=Time since signing
peerInfo.unknownAge=Idade desconhecida
addressTextField.openWallet=Abrir a sua carteira Bitcoin padrão
addressTextField.copyToClipboard=Copiar endereço para área de transferência
addressTextField.addressCopiedToClipboard=Endereço copiado para área de transferência
-addressTextField.openWallet.failed=Erro ao abrir a carteira padrão de Bitcoin. Talvez você não possua uma instalada.
+addressTextField.openWallet.failed=Erro ao abrir a carteira padrão Bitcoin. Talvez você não possua uma instalada.
-peerInfoIcon.tooltip={0}\nEtiqueta: {1}
+peerInfoIcon.tooltip={0}\nRótulo: {1}
-txIdTextField.copyIcon.tooltip=Copiar ID de transação
-txIdTextField.blockExplorerIcon.tooltip=Abrir um explorador de blockchain com o ID dessa transação
+txIdTextField.copyIcon.tooltip=Copiar ID da transação
+txIdTextField.blockExplorerIcon.tooltip=Abrir um explorer de blockchain com o ID dessa transação
####################################################################
@@ -2112,7 +2214,7 @@ txIdTextField.blockExplorerIcon.tooltip=Abrir um explorador de blockchain com o
####################################################################
navigation.account=\"Conta\"
-navigation.account.walletSeed=\"Conta/Sementa da carteira\"
+navigation.account.walletSeed=\"Conta/Semente da carteira\"
navigation.funds.availableForWithdrawal=\"Fundos/Enviar fundos\"
navigation.portfolio.myOpenOffers=\"Portfolio/Minhas ofertas\"
navigation.portfolio.pending=\"Portfolio/Negociações em aberto\"
@@ -2131,7 +2233,7 @@ navigation.dao.wallet.receive=\"DAO/Carteira BSQ/Receber\"
formatter.formatVolumeLabel={0} quantia{1}
formatter.makerTaker=Ofertante: {1} de {0} / Aceitador: {3} de {2}
formatter.youAreAsMaker=Você está {0} {1} como ofertante / Aceitador está {2} {3}
-formatter.youAreAsTaker=Você está {0} {1} como aceitador / Ofetante é {2} {3}
+formatter.youAreAsTaker=Você está {0} {1} como aceitador / Ofertante é {2} {3}
formatter.youAre=Você está {0} {1} ({2} {3})
formatter.youAreCreatingAnOffer.fiat=Você está criando uma oferta para {0} {1}
formatter.youAreCreatingAnOffer.altcoin=Você está criando uma oferta para {0} {1} ({2} {3})
@@ -2154,7 +2256,7 @@ BTC_REGTEST=Regtest do Bitcoin
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=Testnet da DAO do Bitcoin (descontinuada)
# suppress inspection "UnusedProperty"
-BTC_DAO_BETANET=Rede beta da DAO do Bitcoin (Mainnet do Bitcoin)
+BTC_DAO_BETANET=Bisq DAO Betanet (Bitcoin Mainnet)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=Regtest da DAO do Bitcoin
@@ -2178,27 +2280,27 @@ password.enterPassword=Insira a senha
password.confirmPassword=Confirme a senha
password.tooLong=A senha deve ter menos de 500 caracteres.
password.deriveKey=Derivando chave a partir da senha
-password.walletDecrypted=A carteira foi decriptada com sucesso e a proteção por senha removida
+password.walletDecrypted=A carteira foi decifrada com sucesso e a proteção por senha removida
password.wrongPw=Você digitou a senha incorreta.\n\nFavor tentar novamente, verificando com cuidado erros de digitação ou ortografia.
-password.walletEncrypted=A carteira foi criptografada e a proteção por senha foi ativada com sucesso.
-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.walletEncrypted=A carteira foi encriptada e a proteção por senha foi ativada com sucesso.
+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, entre em contato com os desenvolvedores no Fórum Bisq.
password.passwordsDoNotMatch=As 2 senhas inseridas não são iguais.
password.forgotPassword=Esqueceu a senha?
-password.backupReminder=Ao definir uma senha para a carteira, todos os backups criados automaticamente a partir da carteira não criptografada serão apagados.\n\nAntes de definir uma senha, é altamente recomendável que você faça um backup da pasta do Bisq e anote a semente da carteira em um papel.
+password.backupReminder=Ao definir uma senha para a carteira, todos os backups criados automaticamente a partir da carteira não encriptada serão apagados.\n\nAntes de definir uma senha, é altamente recomendável que você faça um backup da pasta do Bisq e anote a semente da carteira em um papel.
password.backupWasDone=Eu já fiz um backup
seed.seedWords=Semente da carteira
seed.enterSeedWords=Insira a semente da carteira
seed.date=Data da carteira
-seed.restore.title=Restaurar carteira
-seed.restore=Restaurar carteira
+seed.restore.title=Recuperar carteira a partir das palavras semente
+seed.restore=Recuperar carteira
seed.creationDate=Criada em
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 inválidos.\n\nPor favor, finalize suas negociações, feche todas as suas ofertas abertas e vá para a seção Fundos para sacar seus bitcoins.\nCaso você não consiga acessar seus bitcoins, 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 mesmo assim
-seed.warn.walletNotEmpty.emptyWallet=Eu esvaziarei as carteiras primeiro
-seed.warn.notEncryptedAnymore=Suas carteiras estão criptografadas.\n\nApós a restauração, as carteiras não estarão mais criptografadas e você deve definir uma nova senha.\n\nQuer continuar?
-seed.restore.success=Carteiras restauradas com sucesso com novas palavras semente.\n\nVocê precisa desligar e reiniciar o programa.
-seed.restore.error=Um erro ocorreu ao restaurar as carteiras com palavras semente.{0}
+seed.warn.walletNotEmpty.restore=Desejo recuperar mesmo assim
+seed.warn.walletNotEmpty.emptyWallet=Esvaziarei as carteiras primeiro
+seed.warn.notEncryptedAnymore=Suas carteiras estão encriptadas.\n\nApós a restauração, as carteiras não estarão mais encriptadas e você deverá definir uma nova senha.\n\nDeseja continuar?
+seed.restore.success=Carteiras recuperadas com sucesso com as novas palavras semente.\n\nVocê precisa desligar e reiniciar o aplicativo.
+seed.restore.error=Ocorreu um erro ao restaurar as carteiras com palavras semente.{0}
####################################################################
@@ -2221,14 +2323,14 @@ payment.select.region=Selecionar região
payment.select.country=Selecionar país
payment.select.bank.country=Selecionar país do banco
payment.foreign.currency=Tem certeza que deseja selecionar uma moeda que não seja a moeda padrão do pais?
-payment.restore.default=Não, resturar para a moeda padrão
+payment.restore.default=Não, restaurar para a moeda padrão
payment.email=E-mail
payment.country=País
payment.extras=Requerimentos adicionais
payment.email.mobile=E-mail ou celular
payment.altcoin.address=Endereço 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 na tela 'Portfolio'.
+payment.altcoin.tradeInstant.popup=Para negociação instantânea, é necessário que os dois pares de negociação estejam online para concluir a negociação em menos de 1 hora.\n\nSe você tem ofertas abertas e você não está disponível, por favor desative essas ofertas na tela 'Portfolio'.
payment.altcoin=Altcoin
payment.select.altcoin=Selecionar ou buscar altcoin
payment.secret=Pergunta secreta
@@ -2242,8 +2344,8 @@ payment.popmoney.accountId=E-mail ou nº de telefone
payment.revolut.email=E-mail
payment.revolut.phoneNr=Nº de telefone registrado
payment.promptPay.promptPayId=ID de cidadão/ID de impostos ou nº de telefone
-payment.supportedCurrencies=Moedas suportadas
-payment.limitations=Limites
+payment.supportedCurrencies=Moedas disponíveis
+payment.limitations=Limitações
payment.salt=Sal para verificação da idade da conta
payment.error.noHexSalt=O sal precisa estar em formato hexadecimal.\nO campo sal só deve ser editado se você quiser transferir o sal de uma conta antiga para manter a idade de conta. A idade da conta é verificada utilizando o sal da conta e os dados identificadores da conta (por exemplo, o IBAN).
payment.accept.euro=Aceitar negociações destes países do Euro
@@ -2253,6 +2355,7 @@ payment.accepted.banks=Bancos aceitos (ID)
payment.mobile=Celular
payment.postal.address=CEP
payment.national.account.id.AR=Número CBU
+shared.accountSigningState=Account signing status
#new
payment.altcoin.address.dyn=Endereço {0}
@@ -2261,7 +2364,7 @@ payment.accountNr=Nº da conta
payment.emailOrMobile=E-mail ou celular
payment.useCustomAccountName=Usar nome personalizado
payment.maxPeriod=Período máximo de negociação permitido
-payment.maxPeriodAndLimit=Duração máx. da negociação: {0} / Limite de negociação: {1} / Idade da conta: {2}
+payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3}
payment.maxPeriodAndLimitCrypto=Duração máxima de negociação: {0} / Limite de negociação: {1}
payment.currencyWithSymbol=Moeda: {0}
payment.nameOfAcceptedBank=Nome do banco aceito
@@ -2284,12 +2387,13 @@ payment.moneyGram.info=Ao usar o MoneyGram, o comprador de BTC deve enviar o Nú
payment.westernUnion.info=Ao usar o Western Union, o comprador do BTC deve enviar o MTCN (número de rastreamento) e uma foto do recibo por e-mail ao vendedor de BTC. O recibo deve mostrar claramente o nome completo do vendedor, a cidade, o país e a quantia. O comprador visualizará o e-mail do vendedor no processo de negócio.
payment.halCash.info=Ao usar o HalCash, o comprador de BTC precisa enviar ao vendedor de BTC o código HalCash através de uma mensagem de texto do seu telefone.\n\nPor favor, certifique-se de não exceder a quantia máxima que seu banco lhe permite enviar com o HalCash. O valor mínimo de saque é de 10 euros e valor máximo é de 600 EUR. Para saques repetidos é de 3000 euros por destinatário por dia e 6000 euros por destinatário por mês. Por favor confirme esses limites com seu banco para ter certeza de que eles usam os mesmos limites mencionados aqui.\n\nO valor de saque deve ser um múltiplo de 10 euros, pois você não pode sacar notas diferentes de uma ATM. Esse valor em BTC será ajustado na telas de criar e aceitar ofertas para que a quantia de EUR esteja correta. Você não pode usar o preço com base no mercado, pois o valor do EUR estaria mudando com a variação dos preços.\n\nEm caso de disputa, o comprador de BTC precisa fornecer a prova de que enviou o EUR.
payment.limits.info=Por favor, esteja ciente de que todas as transferências bancárias possuem um certo risco de serem estornadas.\n\nPara reduzir esse risco, o Bisq definite limites por transação, que são baseados em dois fatores:\n\n1. O nível estimado de risco de estorno para o método de pagamento utilizado\n2. A idade da sua conta para aquele método de pagamento\n\nA conta que você está criando agora é considerada nova, e portanto tem uma idade de zero. À medida que a idade da sua conta for aumentando, os seus limites também irão aumentar:\n\n● Durante o 1º mês, o seu limite por negociação será de {0}\n● Durante o 2º mês, o seu limite por negociação será de {1}\n● Após o 2º mês, o seu limite por negociação será de {2}\n\nNote que esses limites são para cada negociação. Não existem limites no número total de negociações que você pode realizar.
+payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade buy limits based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account you just created carries some chargeback risk and is not yet signed by an arbitrator or trusted peer, so it is limited to buying {0} per trade. After it is signed, buy limits will increase as follows:\n\n● Before signing, and up to 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase merely as account age increases. More information is at https://docs.bisq.network/payment-methods#account-signing.\n\nThere are no limits on the number of trades you can make.
payment.cashDeposit.info=Certifique-se de que o seu banco permite a realização de depósitos em espécie na conta de terceiros.
payment.revolut.info=Certifique-se de que o número de telefone que você usou para sua conta Revolut está registrado na Revolut, caso contrário o comprador de BTC não poderá enviar-lhe os fundos.
-payment.usPostalMoneyOrder.info=Ordens de pagamento são um dos métodos de compra de moedas fiduciárias mais privados disponíveis no Bisq.\n\nEntretanto, esteja ciente dos riscos potencialmente maiores associados ao seu uso. O Bisq não assumirá qualquer responsabilidade no caso de uma ordem de pagamento enviada ser roubada, e os árbitros, nesses casos, concederão o BTC ao remetente da ordem de pagamento, desde que possam produzir informações de rastreamento e recibos. Pode ser aconselhável que o remetente escreva o nome do vendedor de BTC na ordem de pagamento, a fim de minimizar o risco de que a ordem de pagamento seja sacada por outra pessoa.
+payment.usPostalMoneyOrder.info=Money orders are one of the more private fiat purchase methods available on Bisq.\n\nHowever, please be aware of potentially increased risks associated with their use. Bisq will not bear any responsibility in case a sent money order is stolen, and the mediator or arbitrator will in such cases award the BTC to the sender of the money order, provided they can produce tracking information and receipts. It may be advisable for the sender to write the BTC seller's name on the money order, in order to minimize the risk that the money order is cashed by someone else.
payment.f2f.contact=Informações para contato
payment.f2f.contact.prompt=Como prefere ser contatado pelo seu parceiro de negociação? (e-mail, telefone...)
@@ -2299,11 +2403,15 @@ payment.f2f.optionalExtra=Informações adicionais opcionais
payment.f2f.extra=Informações adicionais
payment.f2f.extra.prompt=O ofertante pode definir 'termos e condições' ou adicionar informação de um contato público. Este será exibido junto da oferta.
-payment.f2f.info=A negociação 'Cara à Cara' possui regras e riscos diferentes das transações online.\n\nAs principais diferenças são:\n● Os pares de negociação precisam de trocar informação sobre a localização e hora do encontro, usando os contatos providenciados.\n● Os pares de negociação precisam de trazer os seus laptops a fazer a confirmação de 'pagamento enviado' e 'pagamento recebido' no local de encontro.\n● Se um ofertante tem 'termos e condições' especiais, ele precisa de mencioná-los no campo de texto 'Informações Adicionais' na sua conta.\n● Ao aceitar uma oferta, o aceitador concorda com os 'termos e condições' declarados pelo ofertante.\n● Em caso de disputa o árbitro não pode ajudar muito porque normalmente é difícil obter evidência inalterável do que aconteceu no encontro. Nesses casos os fundos em BTC podem ficar bloqueados indefinidamente ou até que os pares de negociação cheguem a um acordo.\n\nPara ter a certeza de que percebe a diferença com negociações 'Cara à Cara' por favor leias as instruções e recomendações em: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
+payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
payment.f2f.info.openURL=Abrir site
-payment.f2f.offerbook.tooltip.countryAndCity=Estado e cidade: {0} / {1}
+payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
payment.f2f.offerbook.tooltip.extra=Informações adicionais: {0}
+payment.japan.bank=Banco
+payment.japan.branch=Branch
+payment.japan.account=Conta
+payment.japan.recipient=Nome
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -2317,6 +2425,7 @@ CASH_DEPOSIT=Depósito em dinheiro (cash deposit)
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=Face a face (pessoalmente)
+JAPAN_BANK=Japan Bank Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=Bancos nacionais
@@ -2334,6 +2443,8 @@ MONEY_GRAM_SHORT=MoneyGram
WESTERN_UNION_SHORT=Western Union
# suppress inspection "UnusedProperty"
F2F_SHORT=F2F
+# suppress inspection "UnusedProperty"
+JAPAN_BANK_SHORT=Japan Furikomi
# Do not translate brand names
# suppress inspection "UnusedProperty"
@@ -2495,7 +2606,12 @@ validation.pattern=Input deve ser no formato: {0}
validation.noHexString=O input não está no formato hexadecimal
validation.advancedCash.invalidFormat=Deve ser um e-mail válido ou uma ID de carteira no formato: X000000000000
validation.invalidUrl=Essa URL não é válida
-validation.mustBeDifferent=O seu input deve ser diferente do valor atual
+validation.mustBeDifferent=Your input must be different from the current value
validation.cannotBeChanged=O parâmetro não pode ser alterado
validation.numberFormatException=Exceção do formato do número {0}
validation.mustNotBeNegative=O input não deve ser negativo
+validation.phone.missingCountryCode=Need two letter country code to validate phone number
+validation.phone.invalidCharacters=Phone number {0} contains invalid characters
+validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number
+validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number
+validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}.
diff --git a/core/src/main/resources/i18n/displayStrings_ru.properties b/core/src/main/resources/i18n/displayStrings_ru.properties
index fd59a9f03c..e325e0b92b 100644
--- a/core/src/main/resources/i18n/displayStrings_ru.properties
+++ b/core/src/main/resources/i18n/displayStrings_ru.properties
@@ -62,6 +62,10 @@ shared.priceWithCur=Цена в {0}
shared.priceInCurForCur=Цена в {0} за 1 {1}
shared.fixedPriceInCurForCur=Фиксированная цена в {0} за 1 {1}
shared.amount=Количество
+shared.txFee=Transaction Fee
+shared.makerFee=Maker Fee
+shared.buyerSecurityDeposit=Buyer Deposit
+shared.sellerSecurityDeposit=Seller Deposit
shared.amountWithCur=Количество в {0}
shared.volumeWithCur=Объём в {0}
shared.currency=Валюта
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=Отправьте подтверждение п
shared.exportCSV=Экспорт в csv
shared.exportJSON=Экспорт в JSON
shared.noDateAvailable=Дата не указана
-shared.arbitratorsFee=Комиссия арбитра
shared.noDetailsAvailable=Подробности не указаны
shared.notUsedYet=Ещё не использовано
shared.date=Дата
@@ -149,11 +152,11 @@ shared.save=Сохранить
shared.onionAddress=Onion-адрес
shared.supportTicket=запрос в службу поддержки
shared.dispute=спор
+shared.mediationCase=mediation case
shared.seller=продавец
shared.buyer=покупатель
shared.allEuroCountries=Все страны Еврозоны
shared.acceptedTakerCountries=Одобренные страны для тейкера
-shared.arbitrator=Выбранный арбитр
shared.tradePrice=Цена сделки
shared.tradeAmount=Сумма сделки
shared.tradeVolume=Объём сделки
@@ -203,6 +206,15 @@ shared.proposal=Предложение
shared.votes=Голоса
shared.learnMore=Узнать больше
shared.dismiss=Отмена
+shared.selectedArbitrator=Выбранный арбитр
+shared.selectedMediator=Selected mediator
+shared.selectedRefundAgent=Выбранный арбитр
+shared.mediator=Посредник
+shared.arbitrator=Арбитр
+shared.refundAgent=Арбитр
+shared.refundAgentForSupportStaff=Refund agent
+shared.delayedPayoutTxId=Refund collateral transaction ID
+
####################################################################
# UI views
@@ -244,7 +256,7 @@ mainView.footer.btcInfo.synchronizingWith=Синхронизация с
mainView.footer.btcInfo.synchronizedWith=Синхронизировано с
mainView.footer.btcInfo.connectingTo=Подключение к
mainView.footer.btcInfo.connectionFailed=соединение не удалось
-mainView.footer.p2pInfo=Пиров сети P2P: {0}
+mainView.footer.p2pInfo=Bisq network peers: {0}
mainView.footer.daoFullNode=Полный узел ДАО
mainView.bootstrapState.connectionToTorNetwork=(1/4) Подключение к сети Tor...
@@ -254,10 +266,10 @@ mainView.bootstrapState.initialDataReceived=(4/4) Исходные данные
mainView.bootstrapWarning.noSeedNodesAvailable=Нет доступных исходных узлов
mainView.bootstrapWarning.noNodesAvailable=Нет доступных исходных узлов и пиров
-mainView.bootstrapWarning.bootstrappingToP2PFailed=Начальная загрузка в сеть P2P не удалась
+mainView.bootstrapWarning.bootstrappingToP2PFailed=Bootstrapping to Bisq network failed
mainView.p2pNetworkWarnMsg.noNodesAvailable=Отсутствуют исходные узлы или постоянные пиры для запроса данных.\nПроверьте подключение к интернету или перезапустите приложение.
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Сбой подключения к сети P2P (ошибка: {0}).\nПроверьте подключение к интернету или перезапустите приложение.
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Connecting to the Bisq network failed (reported error: {0}).\nPlease check your internet connection or try to restart the application.
mainView.walletServiceErrorMsg.timeout=Подключение к сети Биткойн не удалось из-за истечения времени ожидания.
mainView.walletServiceErrorMsg.connectionError=Не удалось подключиться к сети Биткойн из-за ошибки: {0}
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=Закрыт:
market.trades.tooltip.candle.high=Высший:
market.trades.tooltip.candle.low=Низший:
market.trades.tooltip.candle.average=Средний:
+market.trades.tooltip.candle.median=Median:
market.trades.tooltip.candle.date=Дата:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=Допустимые страны банка
offerbook.availableOffers=Доступные предложения
offerbook.filterByCurrency=Фильтровать по валюте
offerbook.filterByPaymentMethod=Фильтровать по способу оплаты
+offerbook.timeSinceSigning=Time since signing
+offerbook.timeSinceSigning.info=This account was verified and {0}
+offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
+offerbook.timeSinceSigning.info.peer=signed by a peer, waiting for limits to be lifted
+offerbook.timeSinceSigning.info.peerLimitLifted=signed by a peer and limits were lifted
+offerbook.timeSinceSigning.info.signer=signed by peer and can sign peer accounts (limits lifted)
+offerbook.timeSinceSigning.daysSinceSigning={0} дн.
+offerbook.timeSinceSigning.daysSinceSigning.long={0} since signing
+
+offerbook.timeSinceSigning.help=When you successfully complete a trade with a peer who has a signed payment account, your payment account is signed.\n{0} days later, the initial limit of {1} is lifted and your account can sign other peers'' payment accounts.
+offerbook.timeSinceSigning.notSigned=Not signed yet
+offerbook.timeSinceSigning.notSigned.noNeed=Н/Д
+shared.notSigned=This account hasn't been signed yet
+shared.notSigned.noNeed=This account type doesn't use signing
offerbook.nrOffers=Кол-во предложений: {0}
offerbook.volume={0} (мин. — макс.)
@@ -345,14 +372,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=У вас нет торгов
offerbook.warning.noMatchingAccount.headline=Нет подходящего торгового счёта.
offerbook.warning.noMatchingAccount.msg=Чтобы принять это предложение, вам необходимо добавить платежный счёт с использованием данного метода платежа.\n\nХотите сделать это сейчас?
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=Это предложение нельзя принять из соображений безопасности в соответствии со следующими критериями:\n- платёжный счёт мейкера был создан после 1 марта 2019 года;\n- минимальная сумма сделки превышает 0,01 BTC;\n- метод платежа, используемый в предложении, подвержен риску возврата платежа банком.\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=Это предложение нельзя принять из соображений безопасности в соответствии со следующими критериями:\n- ваш платёжный счёт был создан после 1 марта 2019 года;\n- минимальная сумма сделки превышает 0,01 BTC;\n- метод платежа, используемый в предложении, подвержен риску возврата платежа банком.\n\n{0}
+offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=Мы вынуждены применить это ограничение в качестве дополнительной краткосрочной меры обеспечения безопасности.\n\nСледующая версия программы будет включать усовершенствованные инструменты защиты, которые позволят совершать сделки с высоким риском.
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=Допустимая сумма сделки ограничена 0,01 BTC из соображений безопасности в соответствии со следующим критериями:\n- учётная запись покупателя была создана после 1 марта 2019 г.;\n- метод платежа, используемый в предложении, подвержен риску возврата платежа банком.\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=Допустимая сумма сделки ограничена 0,01 BTC из соображений безопасности в соответствии со следующим критериями:\n- ваш платёжный счет был создан после 1 марта 2019 г.;\n- метод платежа, используемый в предложении, подвержен риску возврата платежа банком.\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
offerbook.warning.wrongTradeProtocol=Это предложение требует другой версии протокола, чем та, что используется в вашей версии приложения.\n\nПроверьте, установлена ли у вас новейшая версия приложения. Если да, то пользователь, создавший предложение, использовал старую версию.\n\nПри использовании несовместимой версии торгового протокола торговля невозможна.
offerbook.warning.userIgnored=Onion-адрес данного пользователя добавлен в чёрный список.
@@ -478,7 +503,7 @@ takeOffer.failed.offerTaken=Невозможно принять это пред
takeOffer.failed.offerRemoved=Невозможно принять это предложение, так как оно уже удалено.
takeOffer.failed.offererNotOnline=Не удалось принять предложение, так как его создатель уже не в сети.
takeOffer.failed.offererOffline=Невозможно принять это предложение, так как его создатель не в сети.
-takeOffer.warning.connectionToPeerLost=Соединение с мейкером разорвано.\nВероятно, он отключился от сети, либо его соединение с вами было прервано из-за большого количества открытых соединений.\n\nЕсли вы ещё видите его предложение, вы можете попробовать принять его снова.
+takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again.
takeOffer.error.noFundsLost=\n\nСредства ещё не сняты с вашего кошелька.\nПерезапустите приложение и проверьте сетевое соединение, чтобы попытаться решить эту проблему.
takeOffer.error.feePaid=\n\nПерезапустите приложение и проверьте сетевое соединение, чтобы попытаться решить эту проблему.
@@ -516,8 +541,8 @@ portfolio.pending.step3_seller.confirmPaymentReceived=Подтвердите п
portfolio.pending.step5.completed=Завершено
portfolio.pending.step1.info=Депозитная транзакция опубликована.\n{0} должен дождаться хотя бы одного подтверждения в блокчейне перед началом платежа.
-portfolio.pending.step1.warn=Депозитная транзакция все еще не подтверждена.\nЭто бывает в редких случаях, когда комиссия трейдера, использующего внешний кошелёк, слишком мала.
-portfolio.pending.step1.openForDispute=Депозитная транзакция все еще не подтверждена.\nЭто бывает в редких случаях, когда комиссия трейдера, использующего внешний кошелёк, слишком мала.\nМаксимальный срок сделки истёк.\n\nВы можете подождать дольше или обратиться к арбитру и начать спор.
+portfolio.pending.step1.warn=The deposit transaction is still not confirmed. This sometimes happens in rare cases when the funding fee of one trader from an external wallet was too low.
+portfolio.pending.step1.openForDispute=The deposit transaction is still not confirmed. You can wait longer or contact the mediator for assistance.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=Ваша сделка подтверждена в блокчейне не менее одного раза.\nВы можете дождаться дополнительных подтверждений (в целях безопасности рекомендуется дождаться 6 подтверждений).\n\n
@@ -535,8 +560,10 @@ portfolio.pending.step2_buyer.altcoin=Переведите {1} с внешнег
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=Обратитесь в банк и заплатите {0} продавцу ВТС.\n\n
portfolio.pending.step2_buyer.cash.extra=ВАЖНОЕ ТРЕБОВАНИЕ:\nПосле оплаты напишите на бумажной квитанции «ВОЗВРАТУ НЕ ПОДЛЕЖИТ».\nЗатем разорвите квитанцию на 2 части, сфотографируйте её и отошлите на электронный адрес продавца ВТС.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=Заплатите {0} продавцу BTC через MoneyGram.\n\n
portfolio.pending.step2_buyer.moneyGram.extra=ВАЖНОЕ ТРЕБОВАНИЕ:\nПосле оплаты отправьте продавцу BTC по электронной почте код подтверждения и фото квитанции.\nВ квитанции должно быть четко указано полное имя продавца, страна (штат) и сумма. Электронный адрес продавца: {0}.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=Заплатите {0} продавцу BTC через Western Union.\n\n
portfolio.pending.step2_buyer.westernUnion.extra=ВАЖНОЕ ТРЕБОВАНИЕ: \nПосле оплаты отправьте по электронной почте продавцу BTC контрольный номер MTCN и фото квитанции.\nВ квитанции должно быть четко указано полное имя продавца, город, страна и сумма. Электронный адрес продавца: {0}.
@@ -544,14 +571,15 @@ portfolio.pending.step2_buyer.westernUnion.extra=ВАЖНОЕ ТРЕБОВАНИ
portfolio.pending.step2_buyer.postal=Отправьте {0} \«Почтовым денежным переводом США\» продавцу BTC.\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.bank=Заплатите {0} продавцу BTC через интернет-сервис вашего банка.\n\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=Свяжитесь с продавцом BTC с помощью указанных контактных данных и договоритесь о встрече для оплаты {0}.\n\n
portfolio.pending.step2_buyer.startPaymentUsing=Начать оплату, используя {0}
portfolio.pending.step2_buyer.amountToTransfer=Сумма для перевода
portfolio.pending.step2_buyer.sellersAddress={0}-адрес продавца
portfolio.pending.step2_buyer.buyerAccount=Используемый платёжный счет
portfolio.pending.step2_buyer.paymentStarted=Платёж начат
-portfolio.pending.step2_buyer.warn=Вы ещё не оплатили {0}!\nСделка должна быть завершена до {1}, иначе арбитр начнёт разбирательство.
-portfolio.pending.step2_buyer.openForDispute=Вы не завершили оплату!\nМаксимальный срок, отведенный для сделки, истек.\n\nОбратитесь к арбитру и начните спор.
+portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
+portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.Please contact the mediator for assistance.
portfolio.pending.step2_buyer.paperReceipt.headline=Вы отослали бумажную квитанцию продавцу ВТС?
portfolio.pending.step2_buyer.paperReceipt.msg=Помните:\nВам необходимо написать на бумажной квитанции «ВОЗВРАТУ НЕ ПОДЛЕЖИТ».\nЗатем разорвите её пополам, сфотографируйте и отошлите по электронной почте продавцу ВТС.
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=Отправить код подтверждения и квитанцию
@@ -569,7 +597,11 @@ portfolio.pending.step2_seller.waitPayment.headline=Ожидайте плате
portfolio.pending.step2_seller.f2fInfo.headline=Контактная информация покупателя
portfolio.pending.step2_seller.waitPayment.msg=Депозитная транзакция подтверждена в блокчейне не менее одного раза.\nДождитесь начала платежа в {0} покупателем BTC.
portfolio.pending.step2_seller.warn=Покупатель BTC все еще не завершил платеж в {0}.\nДождитесь начала оплаты.\nЕсли сделка не завершится {1}, арбитр начнет разбирательство.
-portfolio.pending.step2_seller.openForDispute=Покупатель BTC не приступил к оплате!\nМаксимальный срок сделки истёк.\nВы можете подождать и дать контрагенту больше времени или связаться с арбитром и начать спор.
+portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance.
+
+tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}''
+tradeChat.openChat=Open chat window
+tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=Неопределено
@@ -578,7 +610,7 @@ message.state.SENT=Сообщение отправлено
# suppress inspection "UnusedProperty"
message.state.ARRIVED=Сообщение прибыло к контрагенту
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=Сообщение сохранено в почтовом ящике
+message.state.STORED_IN_MAILBOX=Message of payment sent but not yet received by peer
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=Контрагент подтвердил получение сообщения
# suppress inspection "UnusedProperty"
@@ -589,22 +621,23 @@ portfolio.pending.step3_buyer.wait.info=Ожидание подтвержден
portfolio.pending.step3_buyer.wait.msgStateInfo.label=Статус сообщения о начале платежа
portfolio.pending.step3_buyer.warn.part1a=в блокчейне {0}
portfolio.pending.step3_buyer.warn.part1b=у вашего поставщика платёжных услуг (напр., банка)
-portfolio.pending.step3_buyer.warn.part2=Продавец BTC ещё не подтвердил ваш платёж!\nПроверьте {0} и убедитесь, что платёж успешно отправлен.\nЕсли продавец BTC не подтвердит получение оплаты до {1}, арбитр начнёт разбирательство.
-portfolio.pending.step3_buyer.openForDispute=Продавец BTC не подтвердил ваш платёж!\nМаксимальный срок сделки истёк.\nВы можете подождать и дать контрагенту больше времени или связаться с арбитром и начать спор.
+portfolio.pending.step3_buyer.warn.part2=The BTC seller still has not confirmed your payment. Please check {0} if the payment sending was successful.
+portfolio.pending.step3_buyer.openForDispute=The BTC seller has not confirmed your payment! The max. period for the trade has elapsed. You can wait longer and give the trading peer more time or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=Ваш контрагент подтвердил начало оплаты в {0}.\n\n
portfolio.pending.step3_seller.altcoin.explorer=в вашем любимом обозревателе блоков {0}
portfolio.pending.step3_seller.altcoin.wallet=в вашем кошельке {0}
portfolio.pending.step3_seller.altcoin={0}Проверьте {1}, была ли транзакция в ваш адрес\n{2}\nподтверждена достаточное количество раз.\nСумма платежа должна составлять {3}.\n\n Вы можете скопировать и вставить свой адрес {4} из главного окна после закрытия этого окна.
portfolio.pending.step3_seller.postal={0}Проверьте, получили ли вы {1} \«Почтовым денежным переводом США\» от покупателя BTC.\n\nИдентификатор сделки (поле \«Назначение платежа\»): \«{2}\»
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=Ваш контрагент подтвердил начало платежа в {0}.\n\nЗайдите в свой интернет-банк и проверьте получение {1} от покупателя BTC.\n\nИдентификатор сделки (поле \«Назначение платежа\»): \«{2}\»\n\n
portfolio.pending.step3_seller.cash=Так как оплата осуществляется наличными на счёт, покупатель BTC должен написать \«НЕ ПОДЛЕЖИТ ВОЗВРАТУ\» на квитанции, разорвать её на 2 части и отправить вам её фото по электронной почте.\n\nЧтобы избежать возврата платёжа, подтверждайте его получение только после получения этого фото, если вы не сомневаетесь в подлинности квитанции.\nЕсли вы не уверены, {0}
portfolio.pending.step3_seller.moneyGram=Покупатель обязан отправить вам по электронной почте код подтверждения и фото квитанции.\nВ квитанции должно быть четко указано ваше полное имя, страна (штат) и сумма. Убедитесь, что вы получили код подтверждения по электронной почте.\n\nПосле закрытия этого окна вы увидите имя и адрес покупателя BTC, которые необходимо указать для получения денег от MoneyGram.\n\nПодтвердите получение только после того, как вы успешно заберете деньги!
portfolio.pending.step3_seller.westernUnion=Покупатель обязан отправить вам по электронной почте контрольный номер MTCN и фото квитанции.\nВ квитанции должно быть четко указано ваше полное имя, город, страна и сумма. Убедитесь, что вы получили номер MTCN по электронной почте.\n\nПосле закрытия этого окна вы увидите имя и адрес покупателя BTC, которые необходимо указать для получения денег от Western Union. \n\nПодтвердите получение только после того, как вы успешно заберете деньги!
portfolio.pending.step3_seller.halCash=Покупатель должен отправить вам код HalCash в текстовом сообщении. Кроме того, вы получите сообщение от HalCash с информацией, необходимой для снятия EUR в банкомате, поддерживающем HalCash.\n\nПосле того, как вы заберете деньги из банкомата, подтвердите получение платежа в приложении!
-portfolio.pending.step3_seller.bankCheck=\n\nУбедитесь, что имя отправителя в вашей банковской выписке соответствует имени вашего контрагента:\nИмя отправителя: {0}\n\nЕсли имя не соответствует показанному здесь, {1}
-portfolio.pending.step3_seller.openDispute=начните спор, нажав \«alt + o\» или \«option + o\».
+portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1}
+portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=Подтвердите получение платежа
portfolio.pending.step3_seller.amountToReceive=Сумма поступления
portfolio.pending.step3_seller.yourAddress=Ваш адрес {0}
@@ -617,17 +650,18 @@ portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Проверьте к
portfolio.pending.step3_seller.buyerStartedPayment.fiat=Проверьте получение на свой торговый счёт (напр. банковский счёт) и подтвердите после получения платежа.
portfolio.pending.step3_seller.warn.part1a=в блокчейне {0}
portfolio.pending.step3_seller.warn.part1b=у вашего поставщика платёжных услуг (напр., банка)
-portfolio.pending.step3_seller.warn.part2=Вы ещё не подтвердили получение платежа.\nПроверьте получение платежа {0}.\nЕсли вы не подтвердите платеж до {1}, арбитр начнет разбирательство.
-portfolio.pending.step3_seller.openForDispute=Вы не подтвердили получение платежа!\nВремя, отведенное на сделку, истекло.\nПодтвердите оплату или обратитесь к арбитру и начните спор.
+portfolio.pending.step3_seller.warn.part2=You still have not confirmed the receipt of the payment. Please check {0} if you have received the payment.
+portfolio.pending.step3_seller.openForDispute=You have not confirmed the receipt of the payment!\nThe max. period for the trade has elapsed.\nPlease confirm or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=Вы получили платеж в {0} от своего контрагента?\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=Идентификатор сделки (поле \«Назначение платежа\»): \«{0}\»\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=Убедитесь, что имя отправителя в вашей банковской выписке соответствует имени вашего контрагента:\nИмя отправителя: {0}\n\nЕсли имя не соответствует указанному здесь, начните спор, нажав \«alt + o\» или \«option + o\».\n\n
-portfolio.pending.step3_seller.onPaymentReceived.note=Как только вы подтвердите получение платежа, заблокированная сумма сделки будет отправлена покупателю BTC, а залог будет возвращён вам.
+portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Please note, that as soon you have confirmed the receipt, the locked trade amount will be released to the BTC buyer and the security deposit will be refunded.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Подтвердите получение платежа
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Да, я получил (-а) платёж
+portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANT: By confirming receipt of payment, you are also verifying the account of the counterparty and signing it accordingly. Since the account of the counterparty hasn't been signed yet, you should delay confirmation of the payment as long as possible to reduce the risk of a chargeback.
portfolio.pending.step5_buyer.groupTitle=Детали завершённой сделки
portfolio.pending.step5_buyer.tradeFee=Комиссия за сделку
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=Oбщая комиссия май
portfolio.pending.step5_buyer.refunded=Сумма возмещённого залога
portfolio.pending.step5_buyer.withdrawBTC=Вывести биткойны
portfolio.pending.step5_buyer.amount=Сумма для вывода
+portfolio.pending.step5_buyer.signer=By withdrawing your bitcoins, you verify that the counterparty has acted according to the trade protocol.
portfolio.pending.step5_buyer.withdrawToAddress=Вывести на адрес
portfolio.pending.step5_buyer.moveToBisqWallet=Перевести средства в кошелёк Bisq
portfolio.pending.step5_buyer.withdrawExternal=Вывести на внешний кошелёк
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=Начало отсчета срока сде
portfolio.pending.tradePeriodWarning=При превышении срока оба трейдера могут начать спор.
portfolio.pending.tradeNotCompleted=Сделка не завершена вовремя (до {0})
portfolio.pending.tradeProcess=Процесс сделки
-portfolio.pending.openAgainDispute.msg=Если вы не уверены, что сообщение дошло арбитру (напр., нет ответа спустя 1 день), начните спор заново.
+portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community.
portfolio.pending.openAgainDispute.button=Начать спор заново
portfolio.pending.openSupportTicket.headline=Обратиться за поддержкой
-portfolio.pending.openSupportTicket.msg=Используйте эту функцию только при крайней необходимости, если у вас не появилась кнопка \«Обратиться за поддержкой\» или \«Начать спор\».\n\nПри обращении за поддержкой сделка будет прервана и проведена арбитром.
+portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator.
+
+portfolio.pending.timeLockNotOver=You have to wait until ≈{0} ({1} more blocks) before you can open an arbitration dispute.
+
portfolio.pending.notification=Уведомление
-portfolio.pending.openDispute=Начать спор
-portfolio.pending.arbitrationRequested=Спор начат
+
+portfolio.pending.support.headline.getHelp=Need help?
+portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator.
+portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator.
+portfolio.pending.support.button.getHelp=Get support
+portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket?
+portfolio.pending.support.popup.button=Обратиться за поддержкой
+portfolio.pending.support.headline.halfPeriodOver=Check payment
+portfolio.pending.support.headline.periodOver=Время сделки истекло
+
+portfolio.pending.mediationRequested=Mediation requested
+portfolio.pending.refundRequested=Refund requested
portfolio.pending.openSupport=Обратиться за поддержкой
portfolio.pending.supportTicketOpened=Запрос на поддержку отправлен
portfolio.pending.requestSupport=Запрос поддержки
-portfolio.pending.error.requestSupport=Сообщите о своей проблеме арбитру.\n\nОн направит информацию разработчикам для дальнейшего изучения.\nПосле анализа проблемы вам вернут все заблокированные средства.
+portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds.
portfolio.pending.communicateWithArbitrator=Свяжитесь с арбитром в разделе \«Поддержка\».
+portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator.
portfolio.pending.supportTicketOpenedMyUser=Вы уже обратились за поддержкой.\n{0}
portfolio.pending.disputeOpenedMyUser=Вы уже начали спор.\n{0}
portfolio.pending.disputeOpenedByPeer=Ваш контрагент начал спор\n{0}
portfolio.pending.supportTicketOpenedByPeer=Ваш контрагент обратился за поддержкой.\n{0}
portfolio.pending.noReceiverAddressDefined=Адрес получателя не установлен
-portfolio.pending.removeFailedTrade=Если арбитр не смог закрыть эту сделку, вы можете перенести ее в раздел неудачных самостоятельно.\nУдалить эту неудачную сделку из раздела «Текущие сделки»?
+portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade?
+
+portfolio.pending.mediationResult.headline=Suggested payout from mediation
+portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout.
+portfolio.pending.mediationResult.info.selfAccepted=You have accepted the mediator's suggestion. Waiting for peer to accept as well.
+portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted the mediator's suggestion. Do you accept as well?
+portfolio.pending.mediationResult.button=View proposed resolution
+portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0}
+portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0}
+portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=Завершена
-portfolio.closed.ticketClosed=Обращение обработано
+portfolio.closed.ticketClosed=Arbitrated
+portfolio.closed.mediationTicketClosed=Mediated
portfolio.closed.canceled=Отменена
portfolio.failed.Failed=Не удалась
@@ -745,6 +807,9 @@ funds.tx.multiSigDeposit=Депозит на multisig-адрес: {0}
funds.tx.multiSigPayout=Выплата с multisig-адреса: {0}
funds.tx.disputePayout=Выплата по спору: {0}
funds.tx.disputeLost=Проигранный спор: {0}
+funds.tx.collateralForRefund=Refund collateral: {0}
+funds.tx.timeLockedPayoutTx=Time locked payout tx: {0}
+funds.tx.refund=Refund from arbitration: {0}
funds.tx.unknown=Неизвестная причина: {0}
funds.tx.noFundsFromDispute=Без возмещения по спору
funds.tx.receivedFunds=Полученные средства
@@ -765,14 +830,15 @@ funds.tx.dustAttackTx.popup=Вы получили очень маленькую
# Support
####################################################################
-support.tab.mediation.support=Обращения в поддержку
-support.tab.ArbitratorsSupportTickets=Обращения в поддержку арбитра
-support.tab.TradersSupportTickets=Обращения в поддержку трейдера
+support.tab.mediation.support=Mediation
+support.tab.arbitration.support=Arbitration
+support.tab.legacyArbitration.support=Legacy Arbitration
+support.tab.ArbitratorsSupportTickets={0}'s tickets
support.filter=Фильтры
support.filter.prompt=Введите идентификатор сделки, дату, onion-адрес или данные учётной записи
support.noTickets=Нет текущих обращений
support.sendingMessage=Отправка сообщения...
-support.receiverNotOnline=Получатель не в сети. Сообщение сохранено в его почтовом ящике.
+support.receiverNotOnline=Receiver is not online. Message is saved to their mailbox.
support.sendMessageError=Сбой отправки сообщения. Ошибка: {0}
support.wrongVersion=Предложение, по которому открыт этот спор, было создано в устаревшей версии Bisq.\nНевозможно закрыть спор с помощью текущей версии приложения.\n\nВоспользуйтесь старой версией протокола: {0}
support.openFile=Открыть файл для отправки (макс. размер файла: {0} Кб)
@@ -782,7 +848,7 @@ support.attachment=Вложенный файл
support.tooManyAttachments=Нельзя отправлять более 3 файлов в одном сообщении.
support.save=Сохранить файл на диск
support.messages=Сообщения
-support.input.prompt=Введите сообщение арбитру
+support.input.prompt=Enter message...
support.send=Отправить
support.addAttachments=Прикрепить файлы
support.closeTicket=Закрыть запрос
@@ -801,14 +867,18 @@ support.buyerOfferer=Покупатель ВТС/мейкер
support.sellerOfferer=Продавец ВТС/мейкер
support.buyerTaker=Покупатель ВТС/тейкер
support.sellerTaker=Продавец BTC/тейкер
-support.backgroundInfo=Bisq не является компанией, и поэтому разбирается со спорами по-другому.\n\nЕсли в процессе торговли возникают споры (напр., трейдер не соблюдает торговый протокол), вы увидите кнопку \«Открыть спор\» и сможете обратиться к арбитру после истечения срока сделки.\n\nВ случае неполадок в работе приложения оно попытается их обнаружить и, если это возможно, отобразит кнопку \«Обратиться за поддержкой\», чтобы вы могли связаться с арбитром, который сообщит о проблеме разработчикам. \n\nЕсли кнопка \«Обратиться за поддержкой\» не отобразится, вы можете обратиться за поддержкой, выбрав спорную сделку в разделе \«Сделки/Текущие сделки\» и нажав \«alt + o\» или \«option + o\». Используйте этот метод, только если вы уверены, что приложение не работает должным образом. Если у вас возникли проблемы или вопросы, ознакомьтесь с часто задаваемыми вопросами на сайте bisq.network или задайте вопрос в разделе поддержки на форуме Bisq.
-support.initialInfo=Введите описание проблемы в поле ниже и добавьте как можно больше информации, чтобы ускорить разрешение спора. \n\nВот перечень информации, которую необходимо предоставить:\n\t● Если вы покупаете BTC: вы перевели нац. валюту или альткойны продавцу? Если да, то нажали ли вы кнопку «Платёж начат» в приложении?\n\t ● Если вы продаете BTC: вы получили платёж в нац. валюте или альткойнах от покупателя? Если да, то нажали ли вы кнопку «Оплата получена» в приложении?\n\t ● Какую версию Bisq вы используете?\n\t ● Какую операционную систему вы используете?\n\t ● Если ваши транзакции не проходят, попробуйте создать новый каталог данных для приложения.\n\t Иногда данные приложения повреждаются, что приводит к неожиданным ошибкам.\n\t См.: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nВам также следует ознакомиться с основными правилами разрешения споров:\n\t● Вы обязаны отвечать на запросы арбитра в течении 2 дней.\n\t ● Максимальный срок, отведенный на спор: 14 дней. \n\t ● Вы обязаны содействовать арбитру и предоставлять запрашиваемую информацию по вашему спору.\n\t ● Вы согласились с правилами разрешения споров, изложенными в Пользовательском соглашении, при первом запуске приложения.\n\nПодробнее с правилами рассмотрения споров можно ознакомиться по ссылке: https://bisq.network/docs/exchange/arbitration-system\n
+support.backgroundInfo=Bisq is not a company, so it handles disputes differently.\n\nTraders can communicate within the application via a secure chat on the open trades screen to attempt solving a dispute on their own. If that is not sufficient, a mediator can step in to help. The mediator will evaluate the situation and give a recommendation for the payout of the trade funds. If both traders accept this suggestion, the payout transaction is completed and the trade is closed. If one or both traders do not agree to the mediator's recommended payout, they can request arbitration.The arbitrator has the third key of the deposit transaction and will make the payout based on their findings.
+support.initialInfo=Please enter a description of your problem in the text field below. Add as much information as possible to speed up dispute resolution time.\n\nHere is a check list for information you should provide:\n\t● If you are the BTC buyer: Did you make the Fiat or Altcoin transfer? If so, did you click the 'payment started' button in the application?\n\t● If you are the BTC seller: Did you receive the Fiat or Altcoin payment? If so, did you click the 'payment received' button in the application?\n\t● Which version of Bisq are you using?\n\t● Which operating system are you using?\n\t● If you encountered an issue with failed transactions please consider switching to a new data directory.\n\t Sometimes the data directory gets corrupted and leads to strange bugs. \n\t See: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPlease make yourself familiar with the basic rules for the dispute process:\n\t● You need to respond to the {0}''s requests within 2 days.\n\t● Mediators respond in between 2 days. Arbitrators respond in between 5 business days.\n\t● The maximum period for a dispute is 14 days.\n\t● You need to cooperate with the {1} and provide the information they request to make your case.\n\t● You accepted the rules outlined in the dispute document in the user agreement when you first started the application.\n\nYou can read more about the dispute process at: {2}
support.systemMsg=Системное сообщение: {0}
support.youOpenedTicket=Вы запросили поддержку.\n\n{0}\n\nВерсия Bisq: {1}
support.youOpenedDispute=Вы начали спор.\n\n{0}\n\nВерсия Bisq: {1}
-support.peerOpenedTicket=Ваш контрагент запросил поддержку по техническим причинам.\n\n{0}
-support.peerOpenedDispute=Ваш контрагент начал спор.\n\n{0}
+support.youOpenedDisputeForMediation=You requested mediation.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedTicket=Your trading peer has requested support due to technical problems.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDispute=Your trading peer has requested a dispute.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDisputeForMediation=Your trading peer has requested mediation.\n\n{0}\n\nBisq version: {1}
+support.mediatorsDisputeSummary=System message:\nMediator''s dispute summary:\n{0}
+support.mediatorsAddress=Mediator''s node address: {0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=Добавить альткойн
setting.preferences.displayOptions=Параметры отображения
setting.preferences.showOwnOffers=Показать мои предложения в списке предложений
setting.preferences.useAnimations=Использовать анимацию
+setting.preferences.useDarkMode=Use dark mode (beta)
setting.preferences.sortWithNumOffers=Сортировать списки по кол-ву предложений/сделок
setting.preferences.resetAllFlags=Сбросить все флажки \«Не показывать снова\»
setting.preferences.reset=Сброс
@@ -852,7 +923,7 @@ settings.preferences.selectCurrencyNetwork=Выбрать сеть
setting.preferences.daoOptions=Настройки ДАО
setting.preferences.dao.resync.label=Перестроить состояние ДАО от первичной транзакции
setting.preferences.dao.resync.button=Повторная синхронизация
-setting.preferences.dao.resync.popup=После перезапуска приложения данные управления сетью P2P будут повторно загружены с исходных узлов, а состояние консенсуса BSQ будет восстановлено из первичной транзакции.
+setting.preferences.dao.resync.popup=After an application restart the Bisq 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=Запустить Bisq в режиме полного узла ДАО
setting.preferences.dao.rpcUser=Логин RPC
setting.preferences.dao.rpcPw=Пароль RPC
@@ -862,7 +933,7 @@ setting.preferences.dao.fullNodeInfo.ok=Открыть документацию
setting.preferences.dao.fullNodeInfo.cancel=Нет, остаюсь в режиме облегчённого узла
settings.net.btcHeader=Сеть Биткойн
-settings.net.p2pHeader=Сеть Р2Р
+settings.net.p2pHeader=Bisq network
settings.net.onionAddressLabel=Мой onion-адрес
settings.net.btcNodesLabel=Использовать особые узлы Bitcoin Core
settings.net.bitcoinPeersLabel=Подключенные пиры
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=Получено
settings.net.peerTypeColumn=Тип узла
settings.net.openTorSettingsButton=Открыть настройки Tor
+settings.net.versionColumn=Version
+settings.net.subVersionColumn=Subversion
+settings.net.heightColumn=Height
+
settings.net.needRestart=Необходимо перезагрузить приложение, чтобы применить это изменение.\nСделать это сейчас?
settings.net.notKnownYet=Пока неизвестно...
settings.net.sentReceived=Отправлено: {0}, получено: {1}
@@ -928,9 +1003,11 @@ setting.about.subsystems.val=Версия сети: {0}; версия P2P-соо
####################################################################
account.tab.arbitratorRegistration=Регистрация арбитра
+account.tab.mediatorRegistration=Mediator registration
+account.tab.refundAgentRegistration=Refund agent registration
account.tab.account=Счёт
account.info.headline=Добро пожаловать в ваш счёт Bisq
-account.info.msg=Здесь можно добавить свои торговые счета для нац. валют и альткойнов, выбрать арбитров, создать резервные копии своего кошелька и данных счёта.\n\nВо время первого запуска Bisq для вас был создан новый кошелёк Биткойн.\nНастоятельно рекомендуем записать мнемоническую фразу от кошелька (см. вкладку вверху) и установить пароль до ввода средств. Ввод и вывод биткойнов осуществляется в разделе \«Средства\».\n\nО безопасности и конфиденциальности: так как Bisq является децентрализованной биржей, ваши данные хранятся только на вашем компьютере. В Bisq не используются сервера, поэтому у нас нет доступа к вашим личным данным, средствам и даже IP-адресу. Данные банковских счетов, адреса кошельков и т. п. сообщаются только вашему контрагенту для обеспечения ваших сделок (в случае спора, арбитр увидит те же данные, что и контрагент).
+account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer).
account.menu.paymentAccount=Счета в нац. валюте
account.menu.altCoinsAccountView=Альткойн-счета
@@ -939,42 +1016,39 @@ account.menu.seedWords=Мнемоническая фраза
account.menu.backup=Резервное копирование
account.menu.notifications=Уведомления
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=Публичный ключ
-account.arbitratorRegistration.register=Зарегистрировать арбитра
-account.arbitratorRegistration.revoke=Отозвать регистрацию
-account.arbitratorRegistration.info.msg=Если вы больше не являетесь арбитром, вы обязаны быть доступны в течение 15 дней после отзыва регистрации для завершения открытых споров, в которых вы выступаете арбитром. Максимально допустимый срок сделки составляет 8 дней, а спор может рассматриваться до 7 дней.
+account.arbitratorRegistration.register=Register
+account.arbitratorRegistration.registration={0} registration
+account.arbitratorRegistration.revoke=Аннулировать
+account.arbitratorRegistration.info.msg=Please note that you need to stay available for 15 days after revoking as there might be trades which are using you as {0}. The max. allowed trade period is 8 days and the dispute process might take up to 7 days.
account.arbitratorRegistration.warn.min1Language=Необходимо указать хотя бы 1 язык.\nМы добавили язык по умолчанию.
-account.arbitratorRegistration.removedSuccess=Арбитр удален из из сети P2P.
-account.arbitratorRegistration.removedFailed=Не удалось удалить арбитра.{0}
-account.arbitratorRegistration.registerSuccess=Арбитр зарегистрирован в сети P2P.
-account.arbitratorRegistration.registerFailed=Не удалось зарегистрировать арбитра.{0}
-
-account.arbitratorSelection.minOneArbitratorRequired=Необходимо указать хотя бы 1 язык.\nМы добавили язык по умолчанию.
-account.arbitratorSelection.whichLanguages=На каких языках вы говорите?
-account.arbitratorSelection.whichDoYouAccept=Каких арбитров вы принимаете
-account.arbitratorSelection.autoSelect=Автовыбор всех арбитров, владеющих соответствующим языком
-account.arbitratorSelection.regDate=Дата регистрации
-account.arbitratorSelection.languages=Языки
-account.arbitratorSelection.cannotSelectHimself=Арбитру нельзя выбирать самого себя для совершения сделок.
-account.arbitratorSelection.noMatchingLang=Нет соответствующего языка.
-account.arbitratorSelection.noLang=Можно выбирать только тех арбитров, которые говорят с вами хотя бы на одном общем языке.
-account.arbitratorSelection.minOne=Необходимо выбрать хотя бы одного арбитра.
+account.arbitratorRegistration.removedSuccess=You have successfully removed your registration from the Bisq network.
+account.arbitratorRegistration.removedFailed=Could not remove registration.{0}
+account.arbitratorRegistration.registerSuccess=You have successfully registered to the Bisq network.
+account.arbitratorRegistration.registerFailed=Could not complete registration.{0}
account.altcoin.yourAltcoinAccounts=Ваши альткойн-счета
-account.altcoin.popup.wallet.msg=Убедитесь, что соблюдаете требования пользования кошельками {0}, указанные на веб-странице {1}.\nИспользование кошельков централизованных бирж рискованно, если вы (а) не контролируете свои ключи или (б) используете несовместимый кошелёк. Это может привести к потере ваших средств!\nАрбитр не является специалистом в использовании {2} и не может помочь в таких случаях.
+account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases.
account.altcoin.popup.wallet.confirm=Я понимаю и подтверждаю, что знаю, какой кошелёк нужно использовать.
-account.altcoin.popup.arq.msg=Для торговли ARQ в Bisq необходимо понять и выполнить следующие требования:\n\nДля отправки ARQ необходимо использовать официальный кошелёк ArQmA с графическим интерфейсом (GUI) или командной строкой (CLI) с установленным флажком store-tx-info (данная функция включена автоматически в новых версиях кошелька). Убедитесь, что у вас есть доступ к ключу транзакции, так как он потребуется в случае возникновения спора.\narqma-wallet-cli (используйте команду get_tx_key)\narqma-wallet-gui (перейдите на вкладку «История» и нажмите на кнопку P, чтобы получить доказательство платежа)\n\nПеревод невозможно подтвердить с помощью обычного обозревателя блоков.\n\nВ случае возникновения спора арбитру необходимо предоставить следующие данные:\n- приватный ключ транзакции;\n- хеш транзакции;\n- публичный адрес получателя.\n\nНепредоставление вышеуказанных данных или использование несовместимого кошелька приведут к тому, что спор будет решен не в вашу пользу. Отправитель ARQ несет ответственность за предоставление подтверждения перевода ARQ арбитру в случае возникновения спора.\n\nВам необходимо предоставить не идентификатор платежа, а обычный публичный адрес.\nДля получения дополнительной информации о том, как найти указанные данные, посетите канал ArQmA в Discord (https://discord.gg/s9BQpJT) или форум ArQmA (https://labs.arqma.com).
-account.altcoin.popup.xmr.msg=Для торговли XMR в Bisq необходимо понять и выполнить следующие требования:\n\nДля отправки XMR необходимо использовать официальный кошелёк Monero с графическим интерфейсом (GUI) или командной строкой (CLI) с установленным флажком store-tx-info (данная функция включена автоматически в новых версиях кошелька). Убедитесь, что у вас есть доступ к ключу транзакции, так как он потребуется в случае возникновения спора.\nmonero-wallet-cli (используйте команду get_tx_key)\nmonero-wallet-gui (перейдите на вкладку «История» и нажмите на кнопку P, чтобы получить доказательство платежа)\n\nДля подтверждения транзакции можно использовать инструмент XMR checktx (https://xmr.llcoins.net/checktx.html), а также сам кошелёк.\nmonero-wallet-cli : используйте команду (check_tx_key).\nmonero-wallet-gui : страница Дополнительно > Подтвердить/Проверить.\nПеревод невозможно подтвердить с помощью обычного обозревателя блоков.\n\nВ случае возникновения спора арбитру необходимо предоставить следующие данные:\n- приватный ключ транзакции;\n- хеш транзакции;\n- публичный адрес получателя.\n\nНепредоставление вышеуказанных данных или использование несовместимого кошелька приведут к тому, что спор будет решен не в вашу пользу. Отправитель XMR несет ответственность за предоставление подтверждения перевода XMR арбитру в случае возникновения спора.\n\nВам необходимо предоставить не идентификатор платежа, а обычный публичный адрес.\nДля получения дополнительной информации о том, как найти указанные данные, посетите страницу https://web.getmonero.org/ru/resources/user-guides/prove-payment.html или форум Monero (https://forum.getmonero.org).
-account.altcoin.popup.blur.msg=Для торговли BLUR в Bisq необходимо понять и выполнить следующие требования:\n\nДля отправки BLUR необходимо использовать кошелёк Blur Network с командой строкой (CLI) или графическим интерфейсом (GUI). \n\nЕсли вы используете кошелёк с командной строкой, после отправки перевода вы увидите хеш транзакции (идентификатор транзакции). Вы должны сохранить его. Сразу после отправки перевода необходимо воспользоваться командой get_tx_key, чтобы получить закрытый ключ транзакции. Если вы этого не сделаете, вы можете утратить доступ к ключу навсегда. \n\nЕсли вы используете кошелёк Blur Network с графическим интерфейсом, закрытый ключ транзакции и ее идентификатор можно найти во вкладке «История» (History). Найдите нужную транзакцию сразу после отправки перевода. Нажмите на «?» в нижнем правом углу поля транзакции и сохраните информацию о ней. \n\nВ случае если потребуется вмешательство арбитра, вы должны предоставить ему следующие данные: 1) Идентификатор транзакции. 2) Приватный ключ транзакции. 3.) Адрес получателя. Арбитр удостоверит перевод BLUR с помощью средства просмотра транзакций Blur (https://blur.cash/#tx-viewer).\n\nНепредоставление необходимой информации арбитру приведет к тому, что спор будет решен не в вашу пользу. При любых спорах отправитель BLUR несет полную ответственность за подтверждение транзакций перед арбитром. \n\nЕсли вам непонятны данные требования, воздержитесь от торговли в Bisq и сначала обратитесь за помощью в Discord Blur Network (https://discord.gg/dMWaqVW).
-account.altcoin.popup.cash2.msg=Для торговли CASH2 в Bisq необходимо понять и выполнить следующие требования:\n\nДля отправки CASH2 необходимо использовать кошелёк Cash2 версии 3 или выше. \n\nПосле отправки перевода вы увидите идентификатор транзакции. Вы должны сохранить его. Сразу после отправки транзакции вы должны воспользоваться командой getTxKey в simplewallet для получения секретного ключа транзакции. \n\nВ случае если потребуется вмешательство арбитра, вы должны предоставить ему следующие данные: 1) Идентификатор транзакции. 2) Секретный ключ транзакции. 3) Адрес получателя Cash2. Арбитр удостоверит перевод CASH2 с помощью обозревателя блоков Cash2 (https://blocks.cash2.org).\n\nНепредоставление необходимой информации арбитру приведет к тому, что спор будет решен не в вашу пользу. При любых спорах отправитель CASH2 несет полную ответственность за подтверждение транзакций перед арбитром.\n\nЕсли вам непонятны данные требования, воздержитесь от торговли в Bisq и сначала обратитесь за помощью в Discord Cash2 (https://discord.gg/FGfXAYN).
-account.altcoin.popup.qwertycoin.msg=Для торговли Qwertycoin в Bisq необходимо понять и выполнить следующие требования:\n\nДля отправки QWC необходимо использовать официальный кошелёк QWC версии 5.1.3 или выше. \n\nПосле отправки перевода вы увидите идентификатор транзакции. Вы должны сохранить его. Сразу после отправки транзакции вы должны воспользоваться командой get_Tx_Key в simplewallet для получения секретного ключа транзакции. \n\nВ случае если потребуется вмешательство арбитра, вы должны предоставить ему следующие данные: 1) Идентификатор транзакции. 2) Секретный ключ транзакции. 3) Адрес получателя QWC. Арбитр удостоверит перевод QWC с помощью обозревателя блоков QWC (https://explorer.qwertycoin.org).\n\nНепредоставление необходимой информации арбитру приведет к тому, что спор будет решен не в вашу пользу. При любых спорах отправитель QWC несет полную ответственность за подтверждение транзакций перед арбитром.\n\nЕсли вам непонятны данные требования, воздержитесь от торговли в Bisq и сначала обратитесь за помощью в Discord QWC (https://discord.gg/rUkfnpC).
-account.altcoin.popup.drgl.msg=Для торговли Dragonglass в Bisq необходимо понять и выполнить следующие требования:\n\nИз-за обеспечиваемой Dragonglass конфиденциальности транзакцию в публичном блокчейне подтвердить невозможно. Подтвердить платеж можно с помощью закрытого ключа транзакции (TXN-Private-Key).\nЗакрытый ключ транзакции — это одноразовый ключ, автоматически генерируемый для каждой транзакции, доступ к которому можно получить из вашего кошелька DRGL.\nКлюч можно найти в кошельке DRGL с графическим интерфейсом (GUI), открыв окно с информацией о транзакции, или в кошельке Dragonglass с командной строкой (CLI simplewallet), воспользовавшись командой get_tx_key.\n\nДля получения закрытого ключа транзакции требуется DRGL версии Oathkeeper или выше.\n\nВ случае возникновения спора необходимо предоставить арбитру следующие данные:\n- Приватный ключ транзакции (TXN-Private-Key).\n- Хеш транзакции.\n- Публичный адрес получателя.\n\nУдостоверить факт платежа можно с помощью вышеуказанных данных на сайте http://drgl.info/#check_txn.\n\nНепредоставление указанных выше данных или использование несовместимого кошелька приведут к тому, что спор будет решен не в вашу пользу. Отправитель Dragonglass несет ответственность за предоставление подтверждения перевода DRGL арбитру в случае возникновения спора. Использование идентификатора платежа (PaymentID) не требуется.\n\nЕсли вас есть какие-либо вопросы относительно указанных выше действий, посетите канал Dragonglass в Discord (http://discord.drgl.info).
-account.altcoin.popup.ZEC.msg=Для торговли Zcash можно использовать только прозрачные адреса (начинающиеся с t), а не z-адреса (скрытые), так как арбитр не сможет удостоверить транзакцию с z-адресами.
-account.altcoin.popup.XZC.msg=Для торговли Zcoin можно использовать только прозрачные (отслеживаемые) адреса, а не неотслеживаемые адреса, так как арбитр не сможет удостоверить транзакцию с неотслеживаемыми адресами в обозревателе блоков.
+account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information.
+account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information.
+account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending XMR, you need to use either the official Monero GUI wallet or Monero CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nmonero-wallet-cli (use the command get_tx_key)\nmonero-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nIn addition to XMR checktx tool (https://xmr.llcoins.net/checktx.html) verification can also be accomplished in-wallet.\nmonero-wallet-cli : using command (check_tx_key).\nmonero-wallet-gui : on the Advanced > Prove/Check page.\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The XMR sender is responsible for providing verification of the XMR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit (https://www.getmonero.org/resources/user-guides/prove-payment.html) or the Monero forum (https://forum.getmonero.org) to find more information.
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs).
+account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW).
+account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/).
+account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN).
+account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC).
+account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help.
+account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses.
+account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer.
account.altcoin.popup.grin.msg=При создании транзакции в GRIN требуется взаимодействие в реальном времени между отправителем и получателем. Следуйте инструкциям на веб-сайте проекта GRIN, чтобы узнать, как отправлять и получать GRIN (получатель должен находиться в сети в момент отправки перевода или в течение определенного периода). \n\nBisq поддерживает кошельки только в формате Grinbox (Wallet713). \n\nОтправитель GRIN должен предоставить доказательство успешной отправки перевода. Если отправитель не сможет предоставить это доказательство, потенциальный спор будет решен в пользу получателя GRIN. Убедитесь, что используете последнюю версию Grinbox с поддержкой доказательства транзакций и что понимаете, как нужно отправлять и получать GRIN, а также как создавать доказательство перевода. \n\nЧтобы узнать подробности работы с инструментом доказательства транзакции в Grinbox, см. https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only.
account.altcoin.popup.beam.msg=При создании транзакции в BEAM требуется взаимодействие в реальном времени между отправителем и получателем. \n\nСледуйте инструкциям на веб-сайте проекта BEAM, чтобы узнать, как отправлять и получать BEAM (получатель должен находиться в сети в момент отправки перевода или в течение определенного периода). \n\nОтправитель BEAM должен предоставить доказательство успешной отправки перевода. Используйте кошелёк, позволяющий получить доказательство перевода. Если отправитель не сможет предоставить это доказательство, потенциальный спор будет решен в пользу получателя BEAM.
-account.altcoin.popup.pars.msg=Для торговли ParsiCoin в Bisq необходимо понять и выполнить следующие требования:\n\nДля отправки PARS необходимо использовать официальный кошелёк ParsiCoin версии 3.0.0 или новее. \n\nВы можете узнать хеш и ключ транзакции в разделе транзакций своего кошелька с графическим интерфейсом (ParsiPay). Щелкните правой кнопкой мыши на поле «Транзакция» и выберите информацию о транзакции. \n\nВ случае если потребуется вмешательство арбитра, вы должны предоставить ему следующие данные: 1) Хеш транзакции. 2) Ключ транзакции. 3) PARS-адрес получателя. Арбитр удостоверит перевод PARS с помощью обозревателя блоков ParsiCoin (http://explorer.parsicoin.net/#check_payment).\n\nНепредоставление необходимой информации арбитру приведет к тому, что спор будет решен не в вашу пользу. При любых спорах отправитель ParsiCoin несет полную ответственность за подтверждение транзакций перед арбитром. \n\nЕсли вам непонятны данные требования, воздержитесь от торговли в Bisq и сначала обратитесь за помощью в Discord ParsiCoin (https://discord.gg/c7qmFNh).
+account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh).
+
+account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash.
account.fiat.yourFiatAccounts=Ваши счета в нац. валюте
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=Обеспеченная роль до принят
dao.param.ISSUANCE_LIMIT=Лимит эмиссии на цикл в BSQ
dao.param.currentValue=Текущее значение {0}
+dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1})
dao.param.blocks={0} блоков
dao.results.cycle.duration.label=Продолжительность {0}
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} блок (-ов)
dao.results.cycle.value.postFix.isDefaultValue=(значение по умолчанию)
dao.results.cycle.value.postFix.hasChanged=(были изменены при голосовании)
-dao.results.invalidVotes=В этом цикле голосования возникли недействительные голоса. Это может произойти, если голосование было плохо распределено в сети P2P.\n{0}
+dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=Неопределено
@@ -1503,7 +1578,7 @@ dao.proposal.create.publish=Опубликовать предложение
dao.proposal.create.publishing=Публикация предложения...
dao.proposal=предложение
dao.proposal.display.type=Тип предложения
-dao.proposal.display.name=Имя/ник
+dao.proposal.display.name=Exact GitHub username
dao.proposal.display.link=Ссылка на подробную информацию
dao.proposal.display.link.prompt=Ссылка на предложение
dao.proposal.display.requestedBsq=Запрашиваемая сумма в BSQ
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=Текущий голос: «{0}».
dao.proposal.display.myVote.accepted=Принято
dao.proposal.display.myVote.rejected=Отклонено
dao.proposal.display.myVote.ignored=Проигнорировано
-dao.proposal.myVote.summary=Голоса: {0}; вес голоса: {1} (заработано: {2} + доля: {3});
+dao.proposal.display.myVote.unCounted=Vote was not included in result
+dao.proposal.myVote.summary=Voted: {0}; Vote weight: {1} (earned: {2} + stake: {3}) {4}
dao.proposal.myVote.invalid=Голосование было недействительным
dao.proposal.voteResult.success=Принято
@@ -1680,6 +1756,7 @@ dao.monitor.daoState.utxoConflicts=Конфликты UTXO
dao.monitor.daoState.utxoConflicts.blockHeight=Номер блока: {0}
dao.monitor.daoState.utxoConflicts.sumUtxo=Сумма всех UTXO: {0} BSQ
dao.monitor.daoState.utxoConflicts.sumBsq=Сумма всех BSQ: {0} BSQ
+dao.monitor.daoState.checkpoint.popup=DAO state is not in sync with the network. After restart the DAO state will resync.
dao.monitor.proposal.headline=Состояние выдвижения предложений
dao.monitor.proposal.table.headline=Цепочка хешей состояния выдвижения предложений
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=Транзакции в BSQ
dao.factsAndFigures.dashboard.marketPrice=Данные рынка
dao.factsAndFigures.dashboard.price=Текущий курс BSQ/BTC (в Bisq)
+dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price
+dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price
dao.factsAndFigures.dashboard.marketCap=Рыночная капитализация (на основе цены последней сделки)
dao.factsAndFigures.dashboard.availableAmount=Доступное количество BSQ
@@ -1769,10 +1848,6 @@ displayUpdateDownloadWindow.download.openDir=Открыть директорию
disputeSummaryWindow.title=Сводка
disputeSummaryWindow.openDate=Дата обращения за поддержкой
disputeSummaryWindow.role=Роль трейдера
-disputeSummaryWindow.evidence=Доказательство
-disputeSummaryWindow.evidence.tamperProof=Неподдельное доказательство
-disputeSummaryWindow.evidence.id=Проверка идентификации
-disputeSummaryWindow.evidence.video=Видео / Демонстрация экрана
disputeSummaryWindow.payout=Выплата суммы сделки
disputeSummaryWindow.payout.getsTradeAmount={0} BTC получит выплату суммы сделки
disputeSummaryWindow.payout.getsAll={0} BTC получит всё
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=Банк
disputeSummaryWindow.summaryNotes=Примечания
disputeSummaryWindow.addSummaryNotes=Добавить примечания
disputeSummaryWindow.close.button=Закрыть обращение
-disputeSummaryWindow.close.msg=Обращение за поддержкой закрыто {0}\n\nИтог:\n{1} предoставил (-a) неподдельное доказательство: {2}\n{3} подтвердил (-a) личность: {4}\n{5} произвел (-a) подтверждение по видео или с помощью демонстрации экрана: {6}\nСумма выплаты покупателю BTC: {7}\nСумма выплаты продавцу BTC: {8}\n\nПримечания:\n{9}
+disputeSummaryWindow.close.msg=Ticket closed on {0}\n\nSummary:\nPayout amount for BTC buyer: {1}\nPayout amount for BTC seller: {2}\n\nSummary notes:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\nNext steps:\nOpen ongoing trade and accept or reject the suggested mediation
disputeSummaryWindow.close.closePeer=Вам также необходимо закрыть обращение контрагента!
+disputeSummaryWindow.close.txDetails.headline=Publish refund transaction
+disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction?
emptyWalletWindow.headline=Аварийный кошелёк {0}
emptyWalletWindow.info=Используйте этот инструмент только в экстренном случае, если вам недоступны средства из пользовательского интерфейса.\n\nУчтите, что все открытые предложения будут автоматически закрыты при использовании этого инструмента.\n\nПрежде чем воспользоваться этим инструментом, создайте резервную копию своего каталога данных. Это можно сделать в разделе \«Счёт/Резервное копирование\».\n\nСообщите нам о неисправности и создайте отчёт о ней в Github или на форуме Bisq, чтобы мы могли выявить её причину.
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=У вас есть открытые предл
emptyWalletWindow.openOffers.yes=Да, я уверен (-а)
emptyWalletWindow.sent.success=Все средства с вашего кошелька были успешно отправлены.
-enterPrivKeyWindow.headline=Регистрация открыта только для приглашенных арбитров
+enterPrivKeyWindow.headline=Enter private key for registration
filterWindow.headline=Изменить список фильтров
filterWindow.offers=Отфильтрованные предложения (через запят.)
@@ -1815,6 +1895,8 @@ filterWindow.accounts=Отфильтрованные данные торгово
filterWindow.bannedCurrencies=Отфильтрованные коды валют (через запят.)
filterWindow.bannedPaymentMethods=Отфильтрованные идент. методов платежа (через запят.)
filterWindow.arbitrators=Отфильтрованные арбитры (onion-адреса через запят.)
+filterWindow.mediators=Filtered mediators (comma sep. onion addresses)
+filterWindow.refundAgents=Filtered refund agents (comma sep. onion addresses)
filterWindow.seedNode=Отфильтрованные исходные узлы (onion-адреса через запят.)
filterWindow.priceRelayNode=Отфильтрованные ретрансляторы курса (onion-адреса через запят.)
filterWindow.btcNode=Отфильтрованные узлы Биткойн (адреса + порты через запят.)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(Идент./BIC/SWIFT банка мейкер
offerDetailsWindow.offerersBankName=(Название банка мейкера)
offerDetailsWindow.bankId=Идентификатор банка (напр., BIC или SWIFT)
offerDetailsWindow.countryBank=Страна банка мейкера
-offerDetailsWindow.acceptedArbitrators=Принятые арбитры
offerDetailsWindow.commitment=Обязательство
offerDetailsWindow.agree=Подтверждаю
offerDetailsWindow.tac=Пользовательское соглашение
@@ -1883,6 +1964,7 @@ tradeDetailsWindow.tradeDate=Дата сделки
tradeDetailsWindow.txFee=Комиссия майнера
tradeDetailsWindow.tradingPeersOnion=Оnion-адрес контрагента
tradeDetailsWindow.tradeState=Статус сделки
+tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
walletPasswordWindow.headline=Введите пароль для разблокировки
@@ -1945,10 +2027,11 @@ popup.warning.incompatibleDB=Обнаружены несовместимые ф
popup.warning.startupFailed.twoInstances=Bisq уже запущен. Нельзя запустить два экземпляра Bisq.
popup.warning.cryptoTestFailed=Кажется, вы используете самостоятельно скомпилированный двоичный файл и не следуете инструкциям сборки, указанным по ссылке https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nЕсли это не так и вы используете официальный двоичный файл Bisq, опубликуйте отчет об ошибке на Github.\nОшибка={0}
popup.warning.tradePeriod.halfReached=Половина макс. допустимого срока сделки с идентификатором {0} истекла, однако она до сих пор не завершена.\n\nСрок сделки заканчивается {1}\n\nДополнительную информацию о состоянии сделки можно узнать в разделе \«Сделки/Текущие сделки\».
-popup.warning.tradePeriod.ended=Срок сделки с идентификатором {0} истек, однако сделка так и не была завершена.\n\nСрок сделки закончился {1}\n\nВы можете обратиться к арбитру в разделе \«Сделки/Текущие сделки\».
+popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
popup.warning.noTradingAccountSetup.headline=Вы не создали торговый счёт
popup.warning.noTradingAccountSetup.msg=Перед созданием предложения необходимо создать счета в национальной валюте или альткойнах. \nСоздать счёт?
popup.warning.noArbitratorsAvailable=Нет доступных арбитров.
+popup.warning.noMediatorsAvailable=There are no mediators available.
popup.warning.notFullyConnected=Необходимо дождаться полного подключения к сети.\nОно может занять до 2 минут.
popup.warning.notSufficientConnectionsToBtcNetwork=Необходимо дождаться не менее {0} соединений с сетью Биткойн.
popup.warning.downloadNotComplete=Необходимо дождаться завершения загрузки недостающих блоков сети Биткойн.
@@ -1958,13 +2041,13 @@ popup.warning.examplePercentageValue=Введите процент, наприм
popup.warning.noPriceFeedAvailable=Источник рыночного курса для этой валюты отсутствует. Невозможно использовать процентный курс.\nПросьба указать фиксированный курс.
popup.warning.sendMsgFailed=Не удалось отправить сообщение вашему контрагенту .\nПопробуйте еще раз, и если неисправность повторится, сообщите о ней.
popup.warning.insufficientBtcFundsForBsqTx=У вас недостаточно BTC для оплаты комиссии майнера за эту транзакцию.\nПополните свой кошелек BTC.\nНе хватает: {0}
-popup.warning.bsqChangeBelowDustException=В результате этой транзакции у вас останется сумма BSQ ниже минимального предела (5,46 BSQ), поэтому транзакция будет отклонена сетью Биткойн.\n\nВам следует либо отправить большую сумму, чтобы избежать получения сдачи (например, прибавив сумму «пыли» к отправляемой сумме), либо пополнить свой кошелек BSQ, чтобы избежать появления «пыли».\n\nСумма «пыли» составляет {0}.
-popup.warning.btcChangeBelowDustException=В результате этой транзакции у вас останется сумма ниже минимального предела (546 сатоши), поэтому транзакция будет отклонена сетью Биткойн.\n\nВам следует прибавить сумму «пыли» к отправляемой сумме, чтобы избежать появления «пыли».\n\nСумма «пыли» составляет {0}.
+popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the Bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the Bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
popup.warning.insufficientBsqFundsForBtcFeePayment=У Вас недостаточно BSQ для оплаты комиссии в BSQ. Вы можете оплатить комиссию в BTC или пополнить свой кошелёк BSQ. BSQ можно купить в Bisq.\n\nНедостающая сумма в BSQ: {0}
popup.warning.noBsqFundsForBtcFeePayment=В вашем кошельке BSQ недостаточно средств для оплаты комиссии за сделку в BSQ.
popup.warning.messageTooLong=Ваше сообщение превышает макс. разрешённый размер. Разбейте его на несколько частей или загрузите в веб-приложение для работы с отрывками текста, например https://pastebin.com.
-popup.warning.lockedUpFunds=У вас есть заблокированные средства от неудачной сделки.\nЗаблокированный баланс: {0}\nАдрес транзакции ввода средств: {1}\nИдентификатор сделки {2}.\n\nОбратитесь за поддержкой, выбрав сделку в разделе незавершенных сделок и нажав \«alt + o\» или \«option + o\».
+popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"."
popup.warning.nodeBanned=Один из узлов {0} был заблокирован. Перезапустите приложение, чтобы убедиться, что оно не подключено к заблокированному узлу.
popup.warning.priceRelay=ретранслятор курса
@@ -1993,19 +2076,36 @@ popup.shutDownInProgress.msg=Завершение работы приложен
popup.attention.forTradeWithId=Обратите внимание на сделку с идентификатором {0}
-popup.roundedFiatValues.headline=Новая функция конфиденциальности: округленные значения нац. валют
-popup.roundedFiatValues.msg=Для повышения конфиденциальности вашей сделки, сумма {0} была округлена.\n\nВ зависимости от версии приложения, вы заплатите или получите либо сумму, округленную до десятичного либо целого значения.\n\nОба значения соответствуют торговому протоколу.\n\nТакже имейте в виду, что значения BTC изменяются автоматически, чтобы предельно соответствовать округленной сумме нац. валюты.
-
popup.info.multiplePaymentAccounts.headline=Доступно несколько платёжных счетов
popup.info.multiplePaymentAccounts.msg=У вас есть несколько платёжных счетов, доступных для этого предложения. Просьба убедиться, что вы выбрали правильный счёт.
-popup.dao.launch.headline=Полное реализованное видение
-popup.dao.launch.governance.title=Управление
-popup.dao.launch.governance=Торговая сеть Bisq уже была децентрализована. \nПосле запуска ДАО руководство Bisq теперь также осуществляется децентрализовано, что делает сеть Bisq чрезвычайно устойчивой к цензуре.
-popup.dao.launch.trading.title=Сделка
-popup.dao.launch.trading=Приобретите BSQ (цветные монеты в сети Биткойн), чтобы участвовать в управлении Bisq. Вы можете покупать и продавать BSQ так же, как и любой другой актив в Bisq.
-popup.dao.launch.cheaperFees.title=Низкие комиссии
-popup.dao.launch.cheaperFees=Получите скидку 90% на комиссии при использовании BSQ. Экономьте деньги, поддержав проект!\n\n
+popup.news.launch.headline=Two Major Updates
+popup.news.launch.accountSigning.headline=ACCOUNT SIGNING
+popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer.
+popup.news.launch.ntp.headline=NEW TRADE PROTOCOL
+popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant.
+
+popup.accountSigning.selectAccounts.headline=Select payment accounts
+popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign.
+popup.accountSigning.selectAccounts.signAll=Sign all payment methods
+popup.accountSigning.selectAccounts.datePicker=Select point of time until which accounts will be signed
+
+popup.accountSigning.confirmSelectedAccounts.headline=Confirm selected payment accounts
+popup.accountSigning.confirmSelectedAccounts.description=Based on your input, {0} payment accounts will be selected.
+popup.accountSigning.confirmSelectedAccounts.button=Confirm payment accounts
+popup.accountSigning.signAccounts.headline=Confirm signing of payment accounts
+popup.accountSigning.signAccounts.description=Based on your selection, {0} payment accounts will be signed.
+popup.accountSigning.signAccounts.button=Sign payment accounts
+popup.accountSigning.signAccounts.ECKey=Enter private arbitrator key
+popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey
+
+popup.accountSigning.success.headline=Congratulations
+popup.accountSigning.success.description=All {0} payment accounts were successfully signed!
+popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0}
+popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1}
+popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0}
+popup.accountSigning.peerSigner=One of your accounts is mature enough to sign other payment accounts and the initial limit for one of your accounts has been lifted.\n\n{0}
####################################################################
# Notifications
@@ -2071,6 +2171,7 @@ list.currency.editList=Редактировать перечень валют
table.placeholder.noItems=Нет доступных {0}
table.placeholder.noData=Данные недоступны
+table.placeholder.processingData=Processing data...
peerInfoIcon.tooltip.tradePeer=контрагента
@@ -2093,7 +2194,8 @@ peerInfo.title=Данные трейдера
peerInfo.nrOfTrades=Количество завершенных сделок
peerInfo.notTradedYet=Вы ещё не торговали с этим пользователем.
peerInfo.setTag=Установить метку для данного участника
-peerInfo.age=Возраст платёжного счёта
+peerInfo.age.noRisk=Возраст платёжного счёта
+peerInfo.age.chargeBackRisk=Time since signing
peerInfo.unknownAge=Возраст неизвестен
addressTextField.openWallet=Открыть Биткойн-кошелёк по умолчанию
@@ -2154,7 +2256,7 @@ BTC_REGTEST=Режим регрессионного тестирования в
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=Тестовая сеть ДАО Биткойн (устаревшая)
# suppress inspection "UnusedProperty"
-BTC_DAO_BETANET=Бета-сеть ДАО Биткойн (основная сеть Биткойн)
+BTC_DAO_BETANET=Bisq DAO Betanet (Bitcoin Mainnet)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=Режим регрессионного тестирования ДАО Биткойн
@@ -2253,6 +2355,7 @@ payment.accepted.banks=Одобренные банки (идент.)
payment.mobile=Номер моб. тел.
payment.postal.address=Почтовый адрес
payment.national.account.id.AR=Номер CBU
+shared.accountSigningState=Account signing status
#new
payment.altcoin.address.dyn={0}-адрес
@@ -2261,7 +2364,7 @@ payment.accountNr=Номер счёта
payment.emailOrMobile=Эл. адрес или номер моб. тел.
payment.useCustomAccountName=Использовать своё название счёта
payment.maxPeriod=Макс. допустимый срок сделки
-payment.maxPeriodAndLimit=Макс. срок сделки: {0} / Макс. торговый лимит: {1} / Возраст счёта: {2}
+payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3}
payment.maxPeriodAndLimitCrypto=Макс. срок сделки: {0} / Макс. торговый лимит: {1}
payment.currencyWithSymbol=Валюта: {0}
payment.nameOfAcceptedBank=Название одобренного банка
@@ -2284,12 +2387,13 @@ payment.moneyGram.info=При использовании MoneyGram покупа
payment.westernUnion.info=При использовании Western Union покупатель BTC должен отправить по электронной почте продавцу BTC контрольный номер MTCN и фотографию квитанции. В квитанции должно быть четко указано полное имя продавца, страна, город и сумма. Электронный адрес продавца будет показан покупателю в процессе сделки.
payment.halCash.info=Используя HalCash, покупатель BTC обязуется отправить продавцу BTC код HalCash через СМС с мобильного телефона.\n\nУбедитесь, что не вы не превысили максимальную сумму, которую ваш банк позволяет отправить с HalCash. Минимальная сумма на вывод средств составляет 10 EUR, а и максимальная — 600 EUR. При повторном выводе средств лимит составляет 3000 EUR на получателя в день и 6000 EUR на получателя в месяц. Просьба сверить эти лимиты с вашим банком и убедиться, что лимиты банка соответствуют лимитам, указанным здесь.\n\nВыводимая сумма должна быть кратна 10 EUR, так как другие суммы снять из банкомата невозможно. Приложение само отрегулирует сумму BTC, чтобы она соответствовала сумме в EUR, во время создания или принятия предложения. Вы не сможете использовать текущий рыночный курс, так как сумма в EUR будет меняться с изменением курса.\n\nВ случае спора покупателю BTC необходимо предоставить доказательство отправки EUR.
payment.limits.info=Обратите внимание, что все банковские переводы несут определенный риск возврата платежа.\n\nЧтобы снизить этот риск, Bisq ограничивает суммы сделок на основе двух факторов: \n\n1. Расчёт уровня риска возврата платежа для данного метода платежа.\n2. Возраст вашего счёта, созданного для этого метода платежа.\n\nСрок существования нового счёта сейчас равен нулю. С ростом этого срока в течении двух месяцев, предел сумм сделок будет расти:\n\n● В течении 1-го месяца предел каждой сделки составит {0}.\n● В течении 2-го месяца предел сделки составит {1}.\n● После 2-го месяца предел сделки составит {2}.\n\nОбщее количество совершаемых вами сделок не ограничено.
+payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade buy limits based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account you just created carries some chargeback risk and is not yet signed by an arbitrator or trusted peer, so it is limited to buying {0} per trade. After it is signed, buy limits will increase as follows:\n\n● Before signing, and up to 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase merely as account age increases. More information is at https://docs.bisq.network/payment-methods#account-signing.\n\nThere are no limits on the number of trades you can make.
payment.cashDeposit.info=Убедитесь, что ваш банк позволяет отправлять денежные переводы на счета других лиц. Например, Bank of America и Wells Fargo больше не разрешают такие переводы.
payment.revolut.info=Убедитесь, что номер телефона, который вы использовали для своего счета Revolut, зарегистрирован в Revolut. Иначе, покупатель BTC не сможет отправить вам средства.
-payment.usPostalMoneyOrder.info=Денежные переводы — это один из самых анонимных способов покупки в Bisq с помощью национальных валют.\n\nОднако их использование может быть сопряжено с потенциальными рисками. Bisq не несет какой-либо ответственности в случае присвоения денежного перевода. Арбитры в таком случае присудят BTC отправителю денежного перевода, при условии что он сможет представить номер для отслеживания и квитанции. Мы советуем отправителю указывать имя продавца BTC в денежном переводе, чтобы минимизировать риск его обналичивания иным лицом.
+payment.usPostalMoneyOrder.info=Money orders are one of the more private fiat purchase methods available on Bisq.\n\nHowever, please be aware of potentially increased risks associated with their use. Bisq will not bear any responsibility in case a sent money order is stolen, and the mediator or arbitrator will in such cases award the BTC to the sender of the money order, provided they can produce tracking information and receipts. It may be advisable for the sender to write the BTC seller's name on the money order, in order to minimize the risk that the money order is cashed by someone else.
payment.f2f.contact=Контактная информация
payment.f2f.contact.prompt=Как вы хотите связаться с контрагентом? (электронная почта, телефон...)
@@ -2299,11 +2403,15 @@ payment.f2f.optionalExtra=Дополнительная необязательн
payment.f2f.extra=Дополнительная информация
payment.f2f.extra.prompt=Мейкер вправе определить условия сделки или добавить общедоступную контактную информацию. Эти данные будут указаны в предложении.
-payment.f2f.info=В отличие от онлайн-транзакций, в сделках при личной встрече существуют особые правила и риски. \n\nОсновные различия:\n● Контрагентам нужно обмениваться информацией о месте и времени встречи, используя предоставленные ими контактные данные.\n● Контрагентам нужно принести свои ноутбуки и подтвердить отправку и получение платежа при встрече.\n● Если у мейкера есть особые условия, он обязан указать их в поле «Дополнительная информация» при создании счёта.\n● Принимая предложение, тейкер соглашается с заявленными мейкером условиями.\n● В случае возникновения спора, арбитр не сможет помочь сторонам, так как ему будет сложно получить неопровержимые доказательства того, что произошло при встрече. В таких случаях средства в BTC могут быть заблокированы навсегда или до тех пор, пока контрагенты не придут к соглашению.\n\nДля полного понимания особенностей сделок при личной встрече рекомендуется прочесть инструкции и рекомендации по ссылке: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
+payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
payment.f2f.info.openURL=Открыть веб-страницу
-payment.f2f.offerbook.tooltip.countryAndCity=Страна и город: {0} / {1}
+payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
payment.f2f.offerbook.tooltip.extra=Дополнительная информация: {0}
+payment.japan.bank=Банк
+payment.japan.branch=Branch
+payment.japan.account=Счёт
+payment.japan.recipient=Имя
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -2317,6 +2425,7 @@ CASH_DEPOSIT=Внесение наличных
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=Личная встреча
+JAPAN_BANK=Japan Bank Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=Национальные банки
@@ -2334,6 +2443,8 @@ MONEY_GRAM_SHORT=MoneyGram
WESTERN_UNION_SHORT=Western Union
# suppress inspection "UnusedProperty"
F2F_SHORT=Личная встреча
+# suppress inspection "UnusedProperty"
+JAPAN_BANK_SHORT=Japan Furikomi
# Do not translate brand names
# suppress inspection "UnusedProperty"
@@ -2495,7 +2606,12 @@ validation.pattern=Формат значения: {0}
validation.noHexString=Значение не соответствует шестнадцатеричному формату.
validation.advancedCash.invalidFormat=Требуется действительный электронный адрес или идентификатор кошелька в формате: x000000000000
validation.invalidUrl=Недопустимый URL-адрес
-validation.mustBeDifferent=Значение должно отличаться от текущего
+validation.mustBeDifferent=Your input must be different from the current value
validation.cannotBeChanged=Неизменяемый параметр
validation.numberFormatException=Исключение числового формата {0}
validation.mustNotBeNegative=Значение не может быть отрицательным
+validation.phone.missingCountryCode=Need two letter country code to validate phone number
+validation.phone.invalidCharacters=Phone number {0} contains invalid characters
+validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number
+validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number
+validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}.
diff --git a/core/src/main/resources/i18n/displayStrings_th.properties b/core/src/main/resources/i18n/displayStrings_th.properties
index 3deda3420e..26cd39a6d1 100644
--- a/core/src/main/resources/i18n/displayStrings_th.properties
+++ b/core/src/main/resources/i18n/displayStrings_th.properties
@@ -62,6 +62,10 @@ shared.priceWithCur=ราคาใน {0}
shared.priceInCurForCur=ราคาใน {0} แก่ 1 {1}
shared.fixedPriceInCurForCur=ราคาคงที่ ใน {0} แก่ 1 {1}
shared.amount=จำนวน
+shared.txFee=Transaction Fee
+shared.makerFee=Maker Fee
+shared.buyerSecurityDeposit=Buyer Deposit
+shared.sellerSecurityDeposit=Seller Deposit
shared.amountWithCur=จำนวนใน {0}
shared.volumeWithCur=ปริมาณการซื้อขายใน {0}
shared.currency=เงินตรา
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=โปรดยืนยันการส่ง
shared.exportCSV=ส่งไปที่ csv
shared.exportJSON=Export to JSON
shared.noDateAvailable=ไม่มีวันที่ให้แสดง
-shared.arbitratorsFee=ค่าธรรมเนียมสำหรับการอนุญาโตตุลาการหรือการเจรจาในการไกล่เกลี่ย
shared.noDetailsAvailable=ไม่มีรายละเอียด
shared.notUsedYet=ยังไม่ได้ใช้งาน
shared.date=วันที่
@@ -149,11 +152,11 @@ shared.save=บันทึก
shared.onionAddress=ที่อยู่ onion
shared.supportTicket=ศูนย์ช่วยเหลือ
shared.dispute=ข้อพิพาท
+shared.mediationCase=mediation case
shared.seller=ผู้ขาย
shared.buyer=ผู้ซื้อ
shared.allEuroCountries=ทุกประเทศในทวีปยูโร
shared.acceptedTakerCountries=ประเทศที่รับการยอมรับ
-shared.arbitrator=ผู้ไกล่เกลี่ยที่ได้รับการแต่งตั้ง
shared.tradePrice=ราคาการซื้อขาย
shared.tradeAmount=ยอดจำนวนการซื้อขาย
shared.tradeVolume=ปริมาณการซื้อขาย
@@ -203,6 +206,15 @@ shared.proposal=คำขอ
shared.votes=โหวต
shared.learnMore=Learn more
shared.dismiss=Dismiss
+shared.selectedArbitrator=ผู้ไกล่เกลี่ยที่ได้รับการแต่งตั้ง
+shared.selectedMediator=Selected mediator
+shared.selectedRefundAgent=ผู้ไกล่เกลี่ยที่ได้รับการแต่งตั้ง
+shared.mediator=ผู้ไกล่เกลี่ย
+shared.arbitrator=ผู้ไกล่เกลี่ย
+shared.refundAgent=ผู้ไกล่เกลี่ย
+shared.refundAgentForSupportStaff=Refund agent
+shared.delayedPayoutTxId=Refund collateral transaction ID
+
####################################################################
# UI views
@@ -244,7 +256,7 @@ mainView.footer.btcInfo.synchronizingWith=Synchronizing with
mainView.footer.btcInfo.synchronizedWith=Synchronized with
mainView.footer.btcInfo.connectingTo=Connecting to
mainView.footer.btcInfo.connectionFailed=การเชื่อมต่อล้มเหลว
-mainView.footer.p2pInfo=P2P เครือข่ายแบบเพียร์: {0}
+mainView.footer.p2pInfo=Bisq network peers: {0}
mainView.footer.daoFullNode=DAO full node
mainView.bootstrapState.connectionToTorNetwork=(1/4) เชื่อมต่อไปยัง Tor network...
@@ -254,10 +266,10 @@ mainView.bootstrapState.initialDataReceived=(4/4) ได้รับข้อม
mainView.bootstrapWarning.noSeedNodesAvailable=ไม่มีแหล่งข้อมูลในโหนดเครือข่ายให้ใช้งาน
mainView.bootstrapWarning.noNodesAvailable=ไม่มีแหล่งข้อมูลในโหนดเครือข่ายและpeers(ระบบเพียร์)ให้ใช้งาน
-mainView.bootstrapWarning.bootstrappingToP2PFailed=Bootstrapping (เงินทุนของตนเอง) ที่ส่งไปยังเครือข่าย P2P ล้มเหลว
+mainView.bootstrapWarning.bootstrappingToP2PFailed=Bootstrapping to Bisq network failed
mainView.p2pNetworkWarnMsg.noNodesAvailable=ไม่มีแหล่งข้อมูลในโหนดเครือข่ายและ peers (ระบบเพียร์) พร้อมให้บริการสำหรับการขอข้อมูล\nโปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณหรือลองรีสตาร์ทแอพพลิเคชัน
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=การเชื่อมต่อกับเครือข่าย P2P ล้มเหลว (รายงานข้อผิดพลาด: {0}) \nโปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณหรือลองรีสตาร์ทแอพพลิเคชัน
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Connecting to the Bisq network failed (reported error: {0}).\nPlease check your internet connection or try to restart the application.
mainView.walletServiceErrorMsg.timeout=การเชื่อมต่อกับเครือข่าย Bitcoin ล้มเหลวเนื่องจากหมดเวลา
mainView.walletServiceErrorMsg.connectionError=การเชื่อมต่อกับเครือข่าย Bitcoin ล้มเหลวเนื่องจากข้อผิดพลาด: {0}
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=ปิด:
market.trades.tooltip.candle.high=สูง:
market.trades.tooltip.candle.low=ต่ำ:
market.trades.tooltip.candle.average=เฉลี่ย:
+market.trades.tooltip.candle.median=Median:
market.trades.tooltip.candle.date=วันที่:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=ยอมรับตำแหน่งป
offerbook.availableOffers=ข้อเสนอที่พร้อมใช้งาน
offerbook.filterByCurrency=กรองตามสกุลเงิน
offerbook.filterByPaymentMethod=ตัวกรองตามวิธีการชำระเงิน
+offerbook.timeSinceSigning=Time since signing
+offerbook.timeSinceSigning.info=This account was verified and {0}
+offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
+offerbook.timeSinceSigning.info.peer=signed by a peer, waiting for limits to be lifted
+offerbook.timeSinceSigning.info.peerLimitLifted=signed by a peer and limits were lifted
+offerbook.timeSinceSigning.info.signer=signed by peer and can sign peer accounts (limits lifted)
+offerbook.timeSinceSigning.daysSinceSigning={0} วัน
+offerbook.timeSinceSigning.daysSinceSigning.long={0} since signing
+
+offerbook.timeSinceSigning.help=When you successfully complete a trade with a peer who has a signed payment account, your payment account is signed.\n{0} days later, the initial limit of {1} is lifted and your account can sign other peers'' payment accounts.
+offerbook.timeSinceSigning.notSigned=Not signed yet
+offerbook.timeSinceSigning.notSigned.noNeed=ไม่พร้อมใช้งาน
+shared.notSigned=This account hasn't been signed yet
+shared.notSigned.noNeed=This account type doesn't use signing
offerbook.nrOffers=No. ของข้อเสนอ: {0}
offerbook.volume={0} (ต่ำสุด - สูงสุด)
@@ -345,14 +372,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=คุณไม่มีบั
offerbook.warning.noMatchingAccount.headline=ไม่มีบัญชีซื้อขายที่ตรงกัน
offerbook.warning.noMatchingAccount.msg=To take this offer, you will need to set up a payment account using this payment method.\n\nWould you like to do this now?
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=This offer cannot be taken because of security restrictions based on the following criteria:\n- The maker''s payment account was created after March 1st 2019\n- The minimum trade amount is above 0.01 BTC\n- The payment method for the offer is considered risky for bank chargebacks\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=This offer cannot be taken because of security restrictions based on the following criteria:\n- Your payment account was created after March 1st 2019\n- The minimum trade amount is above 0.01 BTC\n- The payment method for this offer is considered risky for bank chargebacks\n\n{0}
+offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=We needed to deploy this restriction as a short-term measure for enhanced security.\n\nThe next software release will provide more robust protection tools so that offers with this risk profile can be traded again.
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to 0.01 BTC because of security restrictions based on the following criteria:\n- The buyers account was created after March 1st 2019\n- The payment method for this offer is considered risky for bank chargebacks\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to 0.01 BTC because of security restrictions based on the following criteria:\n- Your payment account was created after March 1st 2019\n- The payment method for this offer is considered risky for bank chargebacks\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
offerbook.warning.wrongTradeProtocol=ข้อเสนอดังกล่าวต้องใช้โปรโตคอลเวอร์ชันอื่นเหมือนกับเวอร์ชันที่ใช้ในซอฟต์แวร์เวอร์ชันของคุณ\n\nโปรดตรวจสอบว่าคุณได้ติดตั้งเวอร์ชั่นล่าสุด อีกนัยหนึ่งผู้ใช้ที่สร้างข้อเสนอได้ใช้รุ่นที่เก่ากว่า\n\nผู้ใช้ไม่สามารถซื้อขายกับโปรโตคอลการค้าเวอร์ชั่นซอฟต์แวร์ที่แตกต่างกันได้
offerbook.warning.userIgnored=คุณได้เพิ่มที่อยู่ onion ของผู้ใช้ลงในรายการที่ไม่สนใจแล้ว
@@ -478,7 +503,7 @@ takeOffer.failed.offerTaken=คุณไม่สามารถรับข้
takeOffer.failed.offerRemoved=คุณไม่สามารถรับข้อเสนอดังกล่าวได้เนื่องจากข้อเสนอถูกลบออกไปแล้ว
takeOffer.failed.offererNotOnline=คำขอข้อเสนอล้มเหลว เนื่องจากผู้สร้างไม่ได้ออนไลน์อยู่ในระบบ
takeOffer.failed.offererOffline=คุณไม่สามารถรับข้อเสนอดังกล่าวได้เนื่องจากผู้สร้างออฟไลน์
-takeOffer.warning.connectionToPeerLost=คุณสูญเสียการเชื่อมต่อกับผู้สร้าง\nเขาอาจจะออฟไลน์หรือปิดการเชื่อมต่อกับคุณเนื่องจากการเชื่อมต่อแบบเปิดมากเกินไป\n\nหากคุณยังคงเห็นข้อเสนอของเขาในสมุดข้อเสนอ คุณสามารถลองรับเสนออีกครั้ง
+takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again.
takeOffer.error.noFundsLost=\n\nยังไม่มีเงินเหลือ wallet อยู่เลย\nโปรดลองเริ่มแอปพลิเคชันของคุณใหม่และตรวจสอบการเชื่อมต่อเครือข่ายของคุณเพื่อดูว่าคุณสามารถแก้ไขปัญหาได้หรือไม่
takeOffer.error.feePaid=\n\nPlease try to restart your application and check your network connection to see if you can resolve the issue.
@@ -516,8 +541,8 @@ portfolio.pending.step3_seller.confirmPaymentReceived=การยืนยั
portfolio.pending.step5.completed=เสร็จสิ้น
portfolio.pending.step1.info=ธุรกรรมเงินฝากได้รับการเผยแพร่แล้ว\n{0} ต้องรอการยืนยันของบล็อกเชนอย่างน้อยหนึ่งครั้งก่อนที่จะเริ่มการชำระเงิน
-portfolio.pending.step1.warn=ธุรกรรมเงินฝากยังคงไม่ได้รับการยืนยัน\nซึ่งอาจเกิดขึ้นได้ในบางกรณีหากค่าธรรมเนียมการระดมทุนของผู้ค้ารายหนึ่งจาก wallet ภายนอกต่ำเกินไป
-portfolio.pending.step1.openForDispute=ธุรกรรมเงินฝากยังคงไม่ได้รับการยืนยัน\nซึ่งอาจเกิดขึ้นได้ในบางกรณีหากค่าธรรมเนียมการระดมทุนของผู้ค้ารายหนึ่งจากมี wallet ภายนอกต่ำเกินไป\nระยะเวลาสูงสุดสำหรับการซื้อขายได้ผ่านไปแล้ว\n\nคุณสามารถรอต่อไปก่อนหรือติดต่อผู้ไกล่เกลี่ยเพื่อเปิดข้อพิพาท
+portfolio.pending.step1.warn=The deposit transaction is still not confirmed. This sometimes happens in rare cases when the funding fee of one trader from an external wallet was too low.
+portfolio.pending.step1.openForDispute=The deposit transaction is still not confirmed. You can wait longer or contact the mediator for assistance.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=การซื้อขายของคุณมีการยืนยันบล็อกเชนอย่างน้อยหนึ่งรายการ\n(คุณสามารถรอการยืนยันเพิ่มเติมได้หากต้องการ - การยืนยันจำนวน 6 ครั้งถือว่าปลอดภัยมาก)\n
@@ -535,8 +560,10 @@ portfolio.pending.step2_buyer.altcoin=โปรดโอนจาก wallet {0}
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=โปรดไปที่ธนาคารและจ่ายเงิน {0} ให้กับผู้ขาย BTC\n
portfolio.pending.step2_buyer.cash.extra=ข้อกำหนดที่สำคัญ: \nหลังจากที่คุณได้ชำระเงินแล้วให้เขียนลงในใบเสร็จรับเงิน: NO REFUNDS (ไม่มีการคืนเงิน)\nจากนั้นแบ่งออกเป็น 2 ส่วนถ่ายรูปและส่งไปที่ที่อยู่อีเมลของผู้ขาย BTC
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=โปรดชำระเงิน {0} ให้กับผู้ขาย BTC โดยใช้ MoneyGram\n
portfolio.pending.step2_buyer.moneyGram.extra=ข้อกำหนดที่สำคัญ: \nหลังจากที่คุณได้ชำระเงินแล้วให้ส่งหมายเลข Authorization (การอนุมัติ) และรูปใบเสร็จรับเงินไปยังผู้ขาย BTC ทางอีเมล\nใบเสร็จจะต้องแสดงชื่อเต็มของผู้ขาย ประเทศ รัฐ และจำนวนเงินทั้งหมดของผู้ขาย อีเมลของผู้ขายคือ: {0}.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=โปรดชำระเงิน {0} ให้กับผู้ขาย BTC โดยใช้ Western Union
portfolio.pending.step2_buyer.westernUnion.extra=ข้อกำหนดที่สำคัญ: \nหลังจากที่คุณได้ชำระเงินแล้วให้ส่ง MTCN (หมายเลขติดตาม) และรูปใบเสร็จรับเงินไปยังผู้ขาย BTC ทางอีเมล\nใบเสร็จจะต้องแสดงชื่อเต็ม เมือง ประเทศ และจำนวนเงินทั้งหมดของผู้ขาย อีเมลของผู้ขายคือ: {0}
@@ -544,14 +571,15 @@ portfolio.pending.step2_buyer.westernUnion.extra=ข้อกำหนดที
portfolio.pending.step2_buyer.postal=โปรดส่ง {0} โดยธนาณัติ \"US Postal Money Order \" ไปยังผู้ขาย BTC\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.bank=โปรดไปที่หน้าเว็บของธนาคารออนไลน์และชำระเงิน {0} ให้กับผู้ขาย BTC\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=กรุณาติดต่อผู้ขายของ BTC ตามรายชื่อที่ได้รับและนัดประชุมเพื่อจ่ายเงิน {0}\n\n
portfolio.pending.step2_buyer.startPaymentUsing=เริ่มต้นการชำระเงินโดยใช้ {0}
portfolio.pending.step2_buyer.amountToTransfer=จำนวนเงินที่จะโอน
portfolio.pending.step2_buyer.sellersAddress=ที่อยู่ของผู้ขาย {0}
portfolio.pending.step2_buyer.buyerAccount=บัญชีการชำระเงินที่ต้องการใข้งาน
portfolio.pending.step2_buyer.paymentStarted=การชำระเงินเริ่มต้นแล้ว
-portfolio.pending.step2_buyer.warn=คุณยังไม่ได้ทำ {0} การชำระเงินของคุณ! \nโปรดทราบว่าการซื้อขายจะต้องดำเนินการโดย {1} มิฉะนั้นการค้าจะถูกตรวจสอบโดยผู้ไกล่เกลี่ย
-portfolio.pending.step2_buyer.openForDispute=การชำระเงินของคุณยังไม่เสร็จสิ้น!\nระยะเวลาสูงสุดสำหรับการซื้อขายได้ผ่านไปแล้ว\n\nโปรดติดต่ออนุญาผู้ไกล่เกลี่ยเพื่อเปิดข้อพิพาท
+portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
+portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.Please contact the mediator for assistance.
portfolio.pending.step2_buyer.paperReceipt.headline=คุณได้ส่งใบเสร็จรับเงินให้กับผู้ขาย BTC หรือไม่?
portfolio.pending.step2_buyer.paperReceipt.msg=ข้อควรจำ: \nคุณต้องเขียนลงในใบเสร็จรับเงิน: NO REFUNDS (ไม่มีการคืนเงิน)\nจากนั้นแบ่งออกเป็น 2 ส่วนถ่ายรูปและส่งไปที่ที่อยู่อีเมลของผู้ขาย BTC
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=ส่งหมายเลขการอนุมัติและใบเสร็จรับเงิน
@@ -569,7 +597,11 @@ portfolio.pending.step2_seller.waitPayment.headline=รอการชำระ
portfolio.pending.step2_seller.f2fInfo.headline=ข้อมูลการติดต่อของผู้ซื้อ
portfolio.pending.step2_seller.waitPayment.msg=ธุรกรรมการฝากเงินมีการยืนยันบล็อกเชนอย่างน้อยหนึ่งรายการ\nคุณต้องรอจนกว่าผู้ซื้อ BTC จะเริ่มการชำระเงิน {0}
portfolio.pending.step2_seller.warn=ผู้ซื้อ BTC ยังไม่ได้ทำ {0} การชำระเงิน\nคุณต้องรอจนกว่าผู้ซื้อจะเริ่มชำระเงิน\nหากการซื้อขายยังไม่เสร็จสิ้นในวันที่ {1} ผู้ไกล่เกลี่ยจะดำเนินการตรวจสอบ
-portfolio.pending.step2_seller.openForDispute=ผู้ซื้อของ BTC ยังไม่ได้ชำระเงิน! \nระยะเวลาสูงสุดที่อนุญาตสำหรับการซื้อขายผ่านไปแล้ว\nคุณสามารถรอต่อไปก่อนและให้เวลาซื้อขายเพิ่มขึ้นหรือติดต่อผู้ไกล่เกลี่ยเพื่อเปิดข้อพิพาท
+portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance.
+
+tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}''
+tradeChat.openChat=Open chat window
+tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=ไม่ได้กำหนด
@@ -578,7 +610,7 @@ message.state.SENT=ข้อความที่ถูกส่ง
# suppress inspection "UnusedProperty"
message.state.ARRIVED=ข้อความถึง เน็ตเวิร์ก peer แล้ว
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=ข้อความถูกเก็บไว้ในกล่องจดหมาย
+message.state.STORED_IN_MAILBOX=Message of payment sent but not yet received by peer
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=เน็ตเวิร์ก peer ยืนยันการรับข้อความแล้ว
# suppress inspection "UnusedProperty"
@@ -589,22 +621,23 @@ portfolio.pending.step3_buyer.wait.info=กำลังรอการยืน
portfolio.pending.step3_buyer.wait.msgStateInfo.label=เริ่มต้นสถานะการชำระเงิน
portfolio.pending.step3_buyer.warn.part1a=ใน {0} บล็อกเชน
portfolio.pending.step3_buyer.warn.part1b=ที่ผู้ให้บริการการชำระเงิน (เช่น ธนาคาร)
-portfolio.pending.step3_buyer.warn.part2=ผู้ขาย BTC ยังไม่ยืนยันการชำระเงินของคุณ\nโปรดตรวจสอบ {0} หากการส่งการชำระเงินสำเร็จแล้ว\nหากผู้ขาย BTC ไม่ยืนยันการรับเงินโดย {1} การซื้อขายจะถูกตรวจสอบโดยผู้ไกล่เกลี่ย
-portfolio.pending.step3_buyer.openForDispute=ผู้ขาย BTC ไม่ยืนยันการชำระเงินของคุณ! \nระยะเวลาสูงสุดสำหรับการซื้อขายได้ผ่านไปแล้ว\nคุณสามารถรอต่อไปอีกหน่อยและให้เวลาการซื้อขายเพิ่มขึ้นหรือติดต่อผู้ไกล่เกลี่ยเพื่อเปิดข้อพิพาท
+portfolio.pending.step3_buyer.warn.part2=The BTC seller still has not confirmed your payment. Please check {0} if the payment sending was successful.
+portfolio.pending.step3_buyer.openForDispute=The BTC seller has not confirmed your payment! The max. period for the trade has elapsed. You can wait longer and give the trading peer more time or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=พันธมิตรทางการค้าของคุณได้ยืนยันว่าพวกเขาได้เริ่มต้น {0} การชำระเงิน\n\n
portfolio.pending.step3_seller.altcoin.explorer=ผู้สำรวจบล็อกเชน {0} ที่ถูกใจของคุณ
portfolio.pending.step3_seller.altcoin.wallet=ณ กระเป๋าสตางค์ {0} ของคุณ
portfolio.pending.step3_seller.altcoin={0}โปรดตรวจสอบ {1} หากการทำธุรกรรมส่วนที่อยู่รับของคุณ\n{2}\nมีการยืนยันบล็อกเชนแล้วเรียบร้อย\nยอดการชำระเงินต้องเป็น {3}\n\nคุณสามารถคัดลอกและวาง {4} ข้อมูลที่อยู่ของคุณได้จากหน้าจอหลักหลังจากปิดหน้าต่างป๊อปอัพ
portfolio.pending.step3_seller.postal={0} โปรดตรวจสอบว่าคุณได้รับ {1} ธนาณัติ \"US Postal Money Order \" จากผู้ซื้อ BTC แล้วหรือไม่ "\n\nID การซื้อขาย (\"เหตุผลในการชำระเงิน \"ข้อความ) ของธุรกรรมคือ: \"{2} \"
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=พันธมิตรทางการค้าของคุณได้ยืนยันว่าพวกเขาได้เริ่มต้น {0} การชำระเงิน\n\nโปรดไปที่หน้าธนาคารออนไลน์ของคุณและตรวจสอบว่าคุณได้รับ {1} จากผู้ซื้อ BTC \n\nเลข ID การเทรด (\"เหตุผลในการชำระเงิน\" ข้อความ) ของการทำธุรกรรมคือ: \"{2}\"\n\n
portfolio.pending.step3_seller.cash=เนื่องจากการชำระเงินผ่าน Cash Deposit (ฝากเงินสด) ผู้ซื้อ BTC จะต้องเขียน \"NO REFUND \" ในใบเสร็จรับเงินและให้แบ่งออกเป็น 2 ส่วนและส่งรูปถ่ายทางอีเมล\n\nเพื่อหลีกเลี่ยงความเสี่ยงจากการปฏิเสธการชำระเงิน ให้ยืนยันเฉพาะถ้าคุณได้รับอีเมลและหากคุณแน่ใจว่าใบเสร็จถูกต้องแล้ว\nถ้าคุณไม่แน่ใจ {0}
portfolio.pending.step3_seller.moneyGram=ผู้ซื้อต้องส่งหมายเลขอนุมัติและรูปใบเสร็จรับเงินทางอีเมล\nใบเสร็จรับเงินต้องแสดงชื่อเต็มของคุณ ประเทศ รัฐ และจำนวนเงิน โปรดตรวจสอบอีเมลของคุณหากคุณได้รับหมายเลขการให้สิทธิ์\n\nหลังจากปิดป๊อปอัปคุณจะเห็นชื่อและที่อยู่ของผู้ซื้อ BTC เพื่อรับเงินจาก MoneyGram\n\nยืนยันเฉพาะใบเสร็จหลังจากที่คุณได้รับเงินเรียบร้อยแล้ว!
portfolio.pending.step3_seller.westernUnion=ผู้ซื้อต้องส่ง MTCN (หมายเลขติดตาม) และรูปใบเสร็จรับเงินทางอีเมล\nใบเสร็จรับเงินต้องแสดงชื่อ เมือง ประเทศ และจำนวนเงินทั้งหมดไว้อย่างชัดเจน โปรดตรวจสอบอีเมลของคุณหากคุณได้รับ MTCN\n\nหลังจากปิดป๊อปอัปคุณจะเห็นชื่อและที่อยู่ของผู้ซื้อ BTC สำหรับการขอรับเงินจาก Western Union \n\nยืนยันเฉพาะใบเสร็จหลังจากที่คุณได้รับเงินเรียบร้อยแล้ว!
portfolio.pending.step3_seller.halCash=ผู้ซื้อต้องส่งข้อความรหัส HalCash ให้คุณ ในขณะเดียวกันคุณจะได้รับข้อความจาก HalCash พร้อมกับคำขอข้อมูลจำเป็นในการถอนเงินยูโรุจากตู้เอทีเอ็มที่รองรับ HalCash \n\n หลังจากที่คุณได้รับเงินจากตู้เอทีเอ็มโปรดยืนยันใบเสร็จรับเงินจากการชำระเงินที่นี่ !
-portfolio.pending.step3_seller.bankCheck=โปรดตรวจสอบว่าชื่อผู้ส่งในใบแจ้งยอดธนาคารของคุณตรงกับชื่อผู้ส่งจากสัญญาการซื้อขายหรือไม่: \nชื่อผู้ส่ง: {0} \n\nหากชื่อไม่เหมือนกับชื่อที่แสดงไว้ที่นี่ {1}
-portfolio.pending.step3_seller.openDispute=โปรดอย่ายืนยัน แต่มาร่วมกันถกเถียงข้อโต้แย้งกันได้โดยการป้อน \"alt + o \" หรือ \"option + o \"
+portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1}
+portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=ใบเสร็จยืนยันการชำระเงิน
portfolio.pending.step3_seller.amountToReceive=จำนวนเงินที่ได้รับ
portfolio.pending.step3_seller.yourAddress=ที่อยู่ {0} ของคุณ
@@ -617,17 +650,18 @@ portfolio.pending.step3_seller.buyerStartedPayment.altcoin=ตรวจสอบ
portfolio.pending.step3_seller.buyerStartedPayment.fiat=ตรวจสอบบัญชีการซื้อขายของคุณ (เช่น บัญชีธนาคาร) และยืนยันเมื่อคุณได้รับการชำระเงิน
portfolio.pending.step3_seller.warn.part1a=ใน {0} บล็อกเชน
portfolio.pending.step3_seller.warn.part1b=ที่ผู้ให้บริการการชำระเงิน (เช่น ธนาคาร)
-portfolio.pending.step3_seller.warn.part2=คุณยังไม่ได้ยืนยันการรับเงิน! \nโปรดตรวจสอบ {0} หากคุณได้รับการชำระเงิน\nหากคุณไม่ยืนยันการรับเงินโดย {1} การซื้อขายจะถูกตรวจสอบโดยผู้ไกล่เกลี่ย
-portfolio.pending.step3_seller.openForDispute=คุณยังไม่ได้ยืนยันการรับเงิน! \nระยะเวลาสูงสุดสำหรับการซื้อขายได้ผ่านไปแล้ว\nโปรดยืนยันหรือติดต่อผู้ไกล่เกลี่ยเพื่อเปิดข้อพิพาท
+portfolio.pending.step3_seller.warn.part2=You still have not confirmed the receipt of the payment. Please check {0} if you have received the payment.
+portfolio.pending.step3_seller.openForDispute=You have not confirmed the receipt of the payment!\nThe max. period for the trade has elapsed.\nPlease confirm or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=คุณได้รับ {0} การชำระเงินจากคู่ค้าของคุณหรือไม่\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=ID การซื้อขาย (\"เหตุผลในการชำระเงิน \") ของธุรกรรมคือ: \"{0} \" \n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=โปรดตรวจสอบว่าชื่อผู้ส่งในใบแจ้งยอดธนาคารของคุณตรงกับชื่อผู้ส่งจากสัญญาการซื้อขายหรือไม่: \nชื่อผู้ส่ง: {0} \n\nถ้าชื่อไม่ตรงกันกับที่แสดงไว้ที่นี่ โปรดอย่ายืนยัน แต่เปิดข้อพิพาทโดยการป้อน \"alt + o \" หรือ \"option + o \" \n
-portfolio.pending.step3_seller.onPaymentReceived.note=โปรดทราบ ทันทีที่คุณได้รับการยืนยันการรับเงินการซื้อขาย จำนวนการค้าที่ถูกล็อกจะได้รับการอนุมัติให้แก่ผู้ซื้อ BTC และจะได้รับเงินประกันคืน
+portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Please note, that as soon you have confirmed the receipt, the locked trade amount will be released to the BTC buyer and the security deposit will be refunded.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=ยืนยันว่าคุณได้รับการชำระเงินแล้ว
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=ใช่ ฉันได้รับการชำระเงินแล้ว
+portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANT: By confirming receipt of payment, you are also verifying the account of the counterparty and signing it accordingly. Since the account of the counterparty hasn't been signed yet, you should delay confirmation of the payment as long as possible to reduce the risk of a chargeback.
portfolio.pending.step5_buyer.groupTitle=ผลสรุปการซื้อขายที่เสร็จสิ้น
portfolio.pending.step5_buyer.tradeFee=ค่าธรรมเนียมการซื้อขาย
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=ยอดรวมค่าธร
portfolio.pending.step5_buyer.refunded=เงินประกันความปลอดภัยที่ถูกคืน
portfolio.pending.step5_buyer.withdrawBTC=ถอนเงิน bitcoin ของคุณ
portfolio.pending.step5_buyer.amount=จำนวนเงินที่จะถอน
+portfolio.pending.step5_buyer.signer=By withdrawing your bitcoins, you verify that the counterparty has acted according to the trade protocol.
portfolio.pending.step5_buyer.withdrawToAddress=ถอนไปยังที่อยู่
portfolio.pending.step5_buyer.moveToBisqWallet=ย้ายเงินไปที่ Bisq wallet
portfolio.pending.step5_buyer.withdrawExternal=ถอนไปยัง wallet ภายนอก
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=หลังจากการยืนยั
portfolio.pending.tradePeriodWarning=หากเกินระยะเวลานักซื้อขายทั้งสองฝ่ายสามารถเปิดข้อพิพาทได้
portfolio.pending.tradeNotCompleted=การซื้อขายไม่เสร็จสิ้นภายในเวลา (จนถึง {0})
portfolio.pending.tradeProcess=กระบวนการทางการซื้อขาย
-portfolio.pending.openAgainDispute.msg=หากคุณไม่แน่ใจว่าข้อความถึงผู้ไกล่เกลี่ยหรือยัง (เช่น ถ้าคุณไม่ได้รับคำตอบหลังจากผ่านไป 1 วัน) คุณสามารถเปิดข้อพิพาทได้อีกครั้ง
+portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community.
portfolio.pending.openAgainDispute.button=เปิดข้อพิพาทอีกครั้ง
portfolio.pending.openSupportTicket.headline=เปิดปุ่มช่วยเหลือ
-portfolio.pending.openSupportTicket.msg=โปรดใช้ในกรณีฉุกเฉินเท่านั้น หากปุ่ม \"เปิดการช่วยเหลือและสนับสนุน \" หรือ \"เปิดข้อพิพาท \" ไม่ปรากฏขึ้น\n\nเมื่อคุณเปิดการช่วยเหลือ การซื้อขายจะถูกขัดจังหวะและดำเนินการโดยผู้ไกล่เกลี่ย
+portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator.
+
+portfolio.pending.timeLockNotOver=You have to wait until ≈{0} ({1} more blocks) before you can open an arbitration dispute.
+
portfolio.pending.notification=การแจ้งเตือน
-portfolio.pending.openDispute=เปิดข้อพิพาท
-portfolio.pending.arbitrationRequested=การพิพาทเปิดแล้ว
+
+portfolio.pending.support.headline.getHelp=Need help?
+portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator.
+portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator.
+portfolio.pending.support.button.getHelp=Get support
+portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket?
+portfolio.pending.support.popup.button=เปิดปุ่มช่วยเหลือ
+portfolio.pending.support.headline.halfPeriodOver=Check payment
+portfolio.pending.support.headline.periodOver=Trade period is over
+
+portfolio.pending.mediationRequested=Mediation requested
+portfolio.pending.refundRequested=Refund requested
portfolio.pending.openSupport=เปิดปุ่มช่วยเหลือ
portfolio.pending.supportTicketOpened=ปุ่มช่วยเหลือถูกเปิดแล้ว
portfolio.pending.requestSupport=ขอการสนับสนุนและช่วยเหลือ
-portfolio.pending.error.requestSupport=โปรดรายงานปัญหาต่อผู้ไกล่เกลี่ยของคุณ\n\nผู้ไกล่เกลี่ยนั้นจะส่งต่อข้อมูลให้กับนักพัฒนาซอฟต์แวร์เพื่อตรวจสอบปัญหา\nหลังจากที่มีการวิเคราะห์ปัญหาแล้วคุณจะได้รับเงินที่ถูกล็อคทั้งหมด
+portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds.
portfolio.pending.communicateWithArbitrator=กรุณาติดต่อโดยไปที่ \"ช่วยเหลือและสนับสนุน \" กับผู้ไกล่เกลี่ย
+portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator.
portfolio.pending.supportTicketOpenedMyUser=คุณได้ทำการเปิดปุ่มช่วยเหลือและสนับสนุนแล้ว\n{0}
portfolio.pending.disputeOpenedMyUser=คุณได้เปิดข้อพิพาทแล้ว\n{0}
portfolio.pending.disputeOpenedByPeer=ผู้ร่วมการค้าของคุณได้เปิดประเด็นการอภิปรายขึ้น\n{0}
portfolio.pending.supportTicketOpenedByPeer=เน็ตเวิร์ก peer ที่ร่วมการค้าของคุณเปิดปุ่มช่วยเหลือและสนับสนุนแล้ว\n{0}
portfolio.pending.noReceiverAddressDefined=ไม่ได้ระบุที่อยู่ผู้รับ
-portfolio.pending.removeFailedTrade=หากผู้ไกล่เกลี่ยไม่สามารถปิดการซื้อขายนั้นได้ คุณสามารถย้ายตัวเองไปยังหน้าจอการซื้อขายที่ล้มเหลวได้\nคุณต้องการลบการซื้อขายที่ล้มเหลวออกจากหน้าจอรอดำเนินการหรือไม่?
+portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade?
+
+portfolio.pending.mediationResult.headline=Suggested payout from mediation
+portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout.
+portfolio.pending.mediationResult.info.selfAccepted=You have accepted the mediator's suggestion. Waiting for peer to accept as well.
+portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted the mediator's suggestion. Do you accept as well?
+portfolio.pending.mediationResult.button=View proposed resolution
+portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0}
+portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0}
+portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=เสร็จสิ้น
-portfolio.closed.ticketClosed=คำร้องขอความช่วยเหลือได้สิ้นสุดลงแล้ว
+portfolio.closed.ticketClosed=Arbitrated
+portfolio.closed.mediationTicketClosed=Mediated
portfolio.closed.canceled=ยกเลิกแล้ว
portfolio.failed.Failed=ผิดพลาด
@@ -745,6 +807,9 @@ funds.tx.multiSigDeposit=เงินฝาก Multisig (การรองร
funds.tx.multiSigPayout=การจ่ายเงิน Multisig (การรองรับหลายลายเซ็น): {0}
funds.tx.disputePayout=การจ่ายเงินข้อพิพาท: {0}
funds.tx.disputeLost=กรณีการสูญเสียข้อพิพาท: {0}
+funds.tx.collateralForRefund=Refund collateral: {0}
+funds.tx.timeLockedPayoutTx=Time locked payout tx: {0}
+funds.tx.refund=Refund from arbitration: {0}
funds.tx.unknown=เหตุผลที่ไม่ระบุ: {0}
funds.tx.noFundsFromDispute=ไม่มีการคืนเงินจากการพิพาท
funds.tx.receivedFunds=เงินที่ได้รับ
@@ -765,14 +830,15 @@ funds.tx.dustAttackTx.popup=This transaction is sending a very small BTC amount
# Support
####################################################################
-support.tab.mediation.support=ศูนย์ช่วยเหลือ
-support.tab.ArbitratorsSupportTickets=การช่วยเหลือและสนุบสนุนของผู้ไกล่เกลี่ย
-support.tab.TradersSupportTickets=ศูนย์ช่วยเหลือและสนับสนุนของผู้ซื้อขาย
+support.tab.mediation.support=Mediation
+support.tab.arbitration.support=Arbitration
+support.tab.legacyArbitration.support=Legacy Arbitration
+support.tab.ArbitratorsSupportTickets={0}'s tickets
support.filter=รายการตัวกรอง
support.filter.prompt=Enter trade ID, date, onion address or account data
support.noTickets=ไม่มีการเปิดรับคำขอร้องหรือความช่วยเหลือ
support.sendingMessage=กำลังส่งข้อความ...
-support.receiverNotOnline=ผู้รับไม่ได้ออนไลน์ ข้อความจะถูกบันทึกลงในกล่องจดหมายของเขา
+support.receiverNotOnline=Receiver is not online. Message is saved to their mailbox.
support.sendMessageError=การส่งข้อความล้มเหลว ข้อผิดพลาด: {0}
support.wrongVersion=ข้อเสนอในข้อพิพาทดังกล่าวได้รับการสร้างขึ้นโดยใช้ Bisq เวอร์ชั่นเก่ากว่า\nคุณไม่สามารถปิดข้อพิพาทดังกล่าวกับแอปพลิเคชั่นเวอร์ชั่นของคุณได้\n\nโปรดใช้เวอร์ชันที่เก่ากว่ากับเวอร์ชั่นโปรโตคอล {0}
support.openFile=เปิดไฟล์ที่จะแนบ (ขนาดไฟล์สูงสุด: {0} kb)
@@ -782,7 +848,7 @@ support.attachment=แนบไฟล์
support.tooManyAttachments=คุณไม่สามารถส่งไฟล์แนบได้มากกว่า 3 ไฟล์ในข้อความเดียว
support.save=บันทึกไฟล์ลงในดิสก์
support.messages=ข้อความ
-support.input.prompt=โปรดป้อนข้อความของคุณที่นี่เพื่อส่งไปยังผู้ไกล่เกลี่ย
+support.input.prompt=Enter message...
support.send=ส่ง
support.addAttachments=เพิ่มไฟล์แนบ
support.closeTicket=ยุติคำร้องขอและความช่วยเหลือ
@@ -801,14 +867,18 @@ support.buyerOfferer=BTC ผู้ซื้อ / ผู้สร้าง
support.sellerOfferer= BTC ผู้ขาย/ ผู้สร้าง
support.buyerTaker=BTC ผู้ซื้อ / ผู้รับ
support.sellerTaker=BTC ผู้ขาย / ผู้รับ
-support.backgroundInfo=Bisq ไม่ใช่ บริษัท และไม่ได้รับดำเนินการใด ๆ ของการสนับสนุนและช่วยเหลือลูกค้า\n\nหากมีข้อพิพาทในกระบวนการทางการค้ซื้อขาย (เช่น ผู้ค้ารายหนึ่งไม่ปฏิบัติตามโปรโตคอลทางการค้า) แอปพลิเคชันจะแสดงปุ่ม \"เปิดข้อโต้แย้ง \" หลังจากสิ้นสุดระยะเวลาการค้าสำหรับการติดต่อผู้ไกล่เกลี่ย\nในกรณีที่มีข้อบกพร่องของซอฟต์แวร์หรือปัญหาอื่น ๆ ที่ตรวจพบ โดยโปรแกรมจะแสดงปุ่ม \"เปิดการช่วยเหลือและสนับสนุน \" เพื่อติดต่อกับผู้ไกล่เกลี่ย\n\nในกรณีที่ผู้ใช้มีข้อบกพร่องโดยไม่มีการแสดงปุ่ม \"เปิดการช่วยเหลือและสนับสนุน \" คุณสามารถเปิดปุ่มสนับสนุนด้วยตนเองโดยใช้ปุ่มลัดพิเศษ\n\nโปรดใช้เฉพาะในกรณีที่คุณมั่นใจว่าซอฟต์แวร์ไม่ทำงานอย่างที่คาดไว้ หากคุณมีปัญหาในการใช้ Bisq หรือคำถามใด ๆ โปรดอ่าน FAQ ที่หน้าเว็บ bisq.network หรือโพสต์ในฟอรัม Bisq ที่ส่วนการสนับสนุนและช่วยเหลือ\n\nหากคุณแน่ใจว่าต้องการเปิดปุ่มช่วยเหลือและสนับสนุน โปรดเลือกการซื้อขายซึ่งเป็นสาเหตุของปัญหาภายใต้ \"แฟ้มผลงาน/ เปิดการซื้อขาย \" และพิมพ์คีย์ผสม \"alt + o \" หรือ \"option + o \" เพื่อเปิดปุ่มช่วยเหลือและสนับสนุน
-support.initialInfo=Please enter a description of your problem in the text field below. Add as much information as possible to speed up dispute resolution time.\n\nHere is a check list for information you should provide:\n\t● If you are the BTC buyer: Did you make the Fiat or Altcoin transfer? If so, did you click the 'payment started' button in the application?\n\t● If you are the BTC seller: Did you receive the Fiat or Altcoin payment? If so, did you click the 'payment received' button in the application?\n\t● Which version of Bisq are you using?\n\t● Which operating system are you using?\n\t● If you encountered an issue with failed transactions please consider switching to a new data directory.\n\t Sometimes the data directory gets corrupted and leads to strange bugs. \n\t See: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPlease make yourself familiar with the basic rules for the dispute process:\n\t● You need to respond to the arbitrator's requests within 2 days.\n\t● The maximum period for a dispute is 14 days.\n\t● You need to cooperate with the arbitrator and provide the information they request to make your case.\n\t● You accepted the rules outlined in the dispute document in the user agreement when you first started the application.\n\nYou can read more about the dispute process at: https://bisq.network/docs/exchange/arbitration-system
+support.backgroundInfo=Bisq is not a company, so it handles disputes differently.\n\nTraders can communicate within the application via a secure chat on the open trades screen to attempt solving a dispute on their own. If that is not sufficient, a mediator can step in to help. The mediator will evaluate the situation and give a recommendation for the payout of the trade funds. If both traders accept this suggestion, the payout transaction is completed and the trade is closed. If one or both traders do not agree to the mediator's recommended payout, they can request arbitration.The arbitrator has the third key of the deposit transaction and will make the payout based on their findings.
+support.initialInfo=Please enter a description of your problem in the text field below. Add as much information as possible to speed up dispute resolution time.\n\nHere is a check list for information you should provide:\n\t● If you are the BTC buyer: Did you make the Fiat or Altcoin transfer? If so, did you click the 'payment started' button in the application?\n\t● If you are the BTC seller: Did you receive the Fiat or Altcoin payment? If so, did you click the 'payment received' button in the application?\n\t● Which version of Bisq are you using?\n\t● Which operating system are you using?\n\t● If you encountered an issue with failed transactions please consider switching to a new data directory.\n\t Sometimes the data directory gets corrupted and leads to strange bugs. \n\t See: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPlease make yourself familiar with the basic rules for the dispute process:\n\t● You need to respond to the {0}''s requests within 2 days.\n\t● Mediators respond in between 2 days. Arbitrators respond in between 5 business days.\n\t● The maximum period for a dispute is 14 days.\n\t● You need to cooperate with the {1} and provide the information they request to make your case.\n\t● You accepted the rules outlined in the dispute document in the user agreement when you first started the application.\n\nYou can read more about the dispute process at: {2}
support.systemMsg=ระบบข้อความ: {0}
support.youOpenedTicket=You opened a request for support.\n\n{0}\n\nBisq version: {1}
support.youOpenedDispute=You opened a request for a dispute.\n\n{0}\n\nBisq version: {1}
-support.peerOpenedTicket=Your trading peer has requested support due technical problems.\n\n{0}
-support.peerOpenedDispute=คู่ค้าของคุณได้ร้องขอข้อพิพาท\n\n{0}
+support.youOpenedDisputeForMediation=You requested mediation.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedTicket=Your trading peer has requested support due to technical problems.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDispute=Your trading peer has requested a dispute.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDisputeForMediation=Your trading peer has requested mediation.\n\n{0}\n\nBisq version: {1}
+support.mediatorsDisputeSummary=System message:\nMediator''s dispute summary:\n{0}
+support.mediatorsAddress=Mediator''s node address: {0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=เพิ่ม altcoin
setting.preferences.displayOptions=แสดงตัวเลือกเพิ่มเติม
setting.preferences.showOwnOffers=แสดงข้อเสนอของฉันเองในสมุดข้อเสนอ
setting.preferences.useAnimations=ใช้ภาพเคลื่อนไหว
+setting.preferences.useDarkMode=Use dark mode (beta)
setting.preferences.sortWithNumOffers=จัดเรียงรายการโดยเลขของข้อเสนอ / การซื้อขาย
setting.preferences.resetAllFlags=รีเซ็ตทั้งหมด \"ไม่ต้องแสดงอีกครั้ง \" ปักธง
setting.preferences.reset=ตั้งค่าใหม่
@@ -852,7 +923,7 @@ settings.preferences.selectCurrencyNetwork=เลือกเครือข่
setting.preferences.daoOptions=ตัวเลือก DAO
setting.preferences.dao.resync.label=สร้างสถานะ DAO ใหม่จากธุรกรรมต้นกำเนิด
setting.preferences.dao.resync.button=รีซิงค์ (Resync)
-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.resync.popup=After an application restart the Bisq 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=ใช้งาน Bisq ในแบบโหนด DAO full node
setting.preferences.dao.rpcUser=ชื่อผู้ใช้ RPC
setting.preferences.dao.rpcPw=รหัส RPC
@@ -862,7 +933,7 @@ setting.preferences.dao.fullNodeInfo.ok=เปิดหน้าเอกสา
setting.preferences.dao.fullNodeInfo.cancel=ไม่ ฉันติดกับไลท์โหนดโหมด (lite node mode)
settings.net.btcHeader=เครือข่าย Bitcoin
-settings.net.p2pHeader=เครือข่าย P2P
+settings.net.p2pHeader=Bisq network
settings.net.onionAddressLabel=ที่อยู่ onion ของฉัน
settings.net.btcNodesLabel=ใช้โหนดเครือข่าย Bitcoin Core ที่กำหนดเอง
settings.net.bitcoinPeersLabel=เชื่อมต่อกับเน็ตเวิร์ก peers แล้ว
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=ได้รับแล้ว
settings.net.peerTypeColumn=ประเภทเน็ตเวิร์ก peer
settings.net.openTorSettingsButton=เปิดการตั้งค่าของ Tor
+settings.net.versionColumn=Version
+settings.net.subVersionColumn=Subversion
+settings.net.heightColumn=Height
+
settings.net.needRestart=คุณต้องรีสตาร์ทแอ็พพลิเคชั่นเพื่อทำให้การเปลี่ยนแปลงนั้นเป็นผล\nคุณต้องการทำตอนนี้หรือไม่
settings.net.notKnownYet=ยังไม่ทราบ ...
settings.net.sentReceived=ส่ง: {0} ได้รับ: {1}
@@ -928,9 +1003,11 @@ setting.about.subsystems.val=เวอร์ชั่นของเครือ
####################################################################
account.tab.arbitratorRegistration=การลงทะเบียนผู้ไกล่เกลี่ย
+account.tab.mediatorRegistration=Mediator registration
+account.tab.refundAgentRegistration=Refund agent registration
account.tab.account=บัญชี
account.info.headline=ยินดีต้อนรับสู่บัญชี Bisq ของคุณ
-account.info.msg=ที่นี่คุณสามารถตั้งค่าบัญชีการซื้อขายสกุลเงินประจำชาติและ altcoins (เหรียญทางเลือก) และเลือกผู้ไกล่เกลี่ย และสำรองข้อมูล wallet และบัญชีของคุณได้\n\nกระเป๋าสตางค์ Bitcoin ที่ว่างเปล่าถูกสร้างขึ้นในครั้งแรก ณ. ตอนที่คุณเริ่มต้นใช้งาน Bisq\nเราขอแนะนำให้คุณป้อนรหัสโค้ดการแบล็กอัพข้อมูลของ กระเป๋าสตางค์ Bitcoin (ดูปุ่มด้านซ้าย) และเพิ่มรหัสผ่านก่อนการป้อนเงิน การฝากและถอนเงินของ Bitcoin จะอยู่ในส่วนของ \"เงิน \"\n\nความเป็นส่วนตัวและความปลอดภัย: \nBisq คือการแลกเปลี่ยนแบบกระจายอำนาจซึ่งหมายความว่าข้อมูลทั้งหมดของคุณจะถูกเก็บไว้ในคอมพิวเตอร์ของคุณไม่มีเซิร์ฟเวอร์และเราไม่มีสิทธิ์เข้าถึงข้อมูลส่วนบุคคล เงินทุนหรือแม้กระทั่งที่อยู่ IP ของคุณ และข้อมูล เช่น หมายเลขบัญชีธนาคาร altcoin (เหรียญทางเลือก) และที่อยู่ Bitcoin ฯลฯ ข้อมูลนั้นจะใช้ร่วมกับคู่ค้าของคุณเพื่อตอบสนองธุรกิจการซื้อขายที่คุณดำเนินการเท่านั้น (ในกรณีที่มีข้อพิพาทผู้ไกล่เกลี่ยจะเห็นข้อมูลเช่นเดียวกับ ผู้ค้าของคุณ)
+account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer).
account.menu.paymentAccount=บัญชีสกุลเงินของประเทศ
account.menu.altCoinsAccountView=บัญชี Altcoin (เหรียญทางเลือก)
@@ -939,42 +1016,39 @@ account.menu.seedWords=รหัสลับ Wallet
account.menu.backup=การสำรองข้อมูล
account.menu.notifications=การแจ้งเตือน
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=กุญแจสาธารณะ
-account.arbitratorRegistration.register=ลงทะเบียนผู้ไกล่เกลี่ย
-account.arbitratorRegistration.revoke=ยกเลิกการลงทะเบียน
-account.arbitratorRegistration.info.msg=โปรดทราบว่าคุณต้องอยู่ในระบบภายใน 15 วัน หลังจากมีการยกเลิกอันเนื่องมาจากอาจมีธุรกิจการค้าที่ใช้คุณเป็นผู้ไกล่เกลี่ย ระยะสูงสุดทางการค้าที่อนุญาตคือ 8 วัน และกระบวนการพิพาทอาจใช้เวลาถึง 7 วัน
+account.arbitratorRegistration.register=Register
+account.arbitratorRegistration.registration={0} registration
+account.arbitratorRegistration.revoke=เพิกถอน
+account.arbitratorRegistration.info.msg=Please note that you need to stay available for 15 days after revoking as there might be trades which are using you as {0}. The max. allowed trade period is 8 days and the dispute process might take up to 7 days.
account.arbitratorRegistration.warn.min1Language=คุณต้องตั้งค่าภาษาอย่างน้อย 1 ภาษา\nเราได้เพิ่มภาษาเริ่มต้นให้กับคุณแล้ว
-account.arbitratorRegistration.removedSuccess=คุณได้ลบผู้ไกล่เกลี่ยของคุณออกจากเครือข่าย P2P เรียบร้อยแล้ว
-account.arbitratorRegistration.removedFailed=ไม่สามารถลบผู้ไกล่เกลี่ยได้ {0}
-account.arbitratorRegistration.registerSuccess=คุณได้ลงทะเบียนผู้ไกล่เกลี่ยของคุณกับเครือข่าย P2P เป็นที่เรียบร้อยแล้ว
-account.arbitratorRegistration.registerFailed=ไม่สามารถลงทะเบียนผู้ไกล่เกลี่ยได้ {0}
-
-account.arbitratorSelection.minOneArbitratorRequired=คุณต้องตั้งค่าภาษาอย่างน้อย 1 ภาษา\nเราได้เพิ่มภาษาเริ่มต้นให้กับคุณแล้ว
-account.arbitratorSelection.whichLanguages=คุณพูดภาษาอะไร
-account.arbitratorSelection.whichDoYouAccept=ผู้ไกล่เกลี่ยลักษณะใดที่คุณสามารถยอมรับได้
-account.arbitratorSelection.autoSelect=ระบบอัตโนมัติโดยการเลือกผู้ไกล่เกลี่ยที่มีภาษาที่ใช้ตรงกัน
-account.arbitratorSelection.regDate=วันที่ลงทะเบียน
-account.arbitratorSelection.languages=ภาษา
-account.arbitratorSelection.cannotSelectHimself=ผู้ไกล่เกลี่ยไม่สามารถเลือกเสนอตัวเองเพื่อการซื้อขายได้
-account.arbitratorSelection.noMatchingLang=ไม่มีภาษาที่ตรงกัน
-account.arbitratorSelection.noLang=คุณสามารถเลือกผู้ไกล่เกลี่ยที่พูดภาษากลางโดยที่ใช้กันทั่วไปได้อย่างน้อย 1 ภาษาเท่านั้น
-account.arbitratorSelection.minOne=คุณต้องมีผู้ไกล่เกลี่ยอย่างน้อยหนึ่งคน
+account.arbitratorRegistration.removedSuccess=You have successfully removed your registration from the Bisq network.
+account.arbitratorRegistration.removedFailed=Could not remove registration.{0}
+account.arbitratorRegistration.registerSuccess=You have successfully registered to the Bisq network.
+account.arbitratorRegistration.registerFailed=Could not complete registration.{0}
account.altcoin.yourAltcoinAccounts=บัญชี altcoin (เหรียญทางเลือก) ของคุณ
-account.altcoin.popup.wallet.msg=โปรดตรวจสอบว่าคุณทำตามข้อกำหนดสำหรับการใช้ {0} wallet ตามที่อธิบายไว้ใน {1} หน้าเว็บเพจ\nการใช้ wallet จากการแลกเปลี่ยนแบบส่วนกลางที่คุณไม่ได้รับคีย์ภายใต้การควบคุมของคุณ หรือ ใช้ซอฟต์แวร์ wallet ที่ไม่สามารถใช้งานร่วมกันได้อาจทำให้สูญเสียเงินได้!\nผู้ไกล่เกลี่ยไม่ได้เป็น {2} ผู้เชี่ยวชาญและไม่สามารถช่วยในกรณีดังกล่าวได้
+account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases.
account.altcoin.popup.wallet.confirm=ฉันเข้าใจและยืนยันว่าฉันรู้ว่า wallet ใดที่ฉันต้องการใช้
-account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information.
-account.altcoin.popup.xmr.msg=การซื้อขาย XMR บน Bisq ประสงค์ให้คุณเข้าใจและปฏิบัติตามข้อกำหนดดังต่อไปนี้:\n\nสำหรับการส่ง XMR, คุณจำเป็นต้องใช้กระเป๋าสตางค์ทางการ Monero GUI wallet หรือกระเป๋าสตางค์ Monero CLI ด้วย store-tx-info flag (ตั้งค่าในเวอร์ชั่นใหม่). โปรดมั่นใจว่าคุณสามารถเข้าถึงคีย์ธุรกรรมในกรณีเกิดเหตุการณ์ข้อพิพาท\nmonero-wallet-cli (ใข้คำสั่ง get_tx_key)\nmonero-wallet-gui (ไปที่หน้าประวัติและคลิกบนปุ่ม (P) สำหรับหลักฐานการชำระเงิน)\n\nนอกจากนี้ การใช้วิธีการทำธุรกรรม XMR ในการพิสูจน์หลักฐาน (https://xmr.llcoins.net/checktx.html) ยังสามารถทำด้วยวิธีกระเป๋าสตางค์ภายใน in-wallet ได้เช่นกัน\nmonero-wallet-cli : กำลังใช้คำสั่ง (check_tx_key).\nmonero-wallet-gui : บน the Advanced > หน้าพิสูจน์/ตรวจสอบ\nสำหรับผู้สำรวจบล็อกทั่วไป การโอนเงินไม่สามารถพิสูจน์หลักฐานได้ \n\nคุณสามารถนำข้อมูลดังต่อไปนี้ยื่นให้แก่ผู้ไกล่เกลี่ยในกรณีข้อพิพาทได้:\n- คีย์ส่วนตัวของการทำธุรกรรม\n- แฮชของธุรกรรม\n- ที่อยู่สาธารณะของผู้รับ\n\nความล้มเหลวในการยื่นข้อมูลข้างต้น หรือเมื่อคุณใช้กระเป๋าสตางค์ที่ไม่เหมาะสมจะส่งผลให้คุณสูญเสียกรณีการพิพาทได้ ผู้ส่ง XMR มีหน้าที่ยื่นหลักฐานพิสูจน์การโอนเงิน XMR ให้กับผู้ไกล่เกลี่ยเมื่อมีกรณีข้อพิพาทเกิดขึ้น\n\nไม่จำเป็นต้องมี ID การชำระเงิน เพียงแค่ที่อยู่สาธารณะตามปกติก็สามารถดำเนินการได้หากคุณไม่แน่ใจเกี่ยวกับกระบวนการดังกล่าวโปรดไปที่ฟอรัม (https://www.getmonero.org/resources/user-guides/prove-payment.html) หรือฟอรัม Monero (https://forum.getmonero.org) เพื่อค้นหาข้อมูลเพิ่มเติม
-account.altcoin.popup.blur.msg=หากคุณต้องการที่จะเทรด BLUR บน Bisq โปรดมั่นใจว่าคุณเข้าใจและทำตามข้อกำหนดดังกล่าว:ในการส่ง BLUR คุณต้องใช้ Blur Network CLI or GUI Wallet. หากคุณกำลังใช้งาน CLI wallet, แฮชธุรกรรม (tx ID) จะมีการแสดงผลหลังจากการโอนย้ายได้ถูกส่งแล้ว คุณต้องบันทึกข้อมูลนี้ไว้ และเมื่อคุณมีการโอนย้าย ณ เดี๋ยวนั้น คุณต้องใช้คำสั่ง 'get_tx_key' ในการเรียกคืนการทำธุรกรรมคีย์ส่วนตัว หากคุณไม่ได้ปฏิบัติในขั้นตอนนี้ คุณอาจไม่สามารถเรียกคืนข้อมูลดังกล่าวในภายหลังได้หากคุณกำลังใช้งาน Blur Network GUI Wallet, ธุรกรรม คีย์ส่วนตัวและธุรกรรม ID สามารถถูกค้นหาได้ง่ายในหน้า "ประวัติ" หลังจากที่ส่ง ณ เดี๋ยวนั้น ระบุตำแหน่งรายการที่น่าสนใจ คลิกสัญลักษณ์ "?" ในมุมขวาด้านล่างของกล่องที่มีรายการอยู่ และคุณต้องทำการบันทึกข้อมูลนี้ไว้ในรายการที่จำเป็นต้องมีการไกล่เกลี่ย คุณต้องเสนอรายการดังต่อไปนี้ต่อผู้ไกล่เกลี่ย: 1.) ID การทำธุรกรรม 2.) คีย์ส่วนตัวในการทำธุรกรรม และ 3.) ที่อยู่ของผู้รับ ผู้ไกล่เกลี่ยจะมีการตรวจสอบข้อมูลการโอนถ่ายโดยการใช้งาน Blur Transaction Viewer (https://blur.cash/#tx-viewer) หากคุณไม่สามารถปฏิบัติตามข้อกำหนดต่อผู้ไกล่เกลี่ย คุณอาจไม่สามารถชนะข้อพิพาทได้ ในกรณีเคสของการพิพาททั้งหมด ผู้ส่ง BLUR สามารถค้ำประกันให้ได้ถึง 100% ในการพิสูจน์หลักฐานทางธุรกรรมให้กับผู้ไกล่เกลี่ยหากคุณไม่เข้าใจในเรื่องข้อควรปฏิบัติเหล่านี้ ได้โปรดอย่าทำการเทรดบน Bisq อันดับแรก คุณสามารถรขอความช่วยเหลือได้ทาง Blur Network Discord (https://discord.gg/dMWaqVW).
-account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN).
-account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC).
-account.altcoin.popup.drgl.msg=การค้า Dragonglass บน Bisq ประสงค์ให้คุณเข้าใจและปฏิบัติตามข้อกำหนดดังต่อไปนี้:\n\nเนื่องจากความเป็นส่วนตัวของ Dragonglass ธุรกรรมจะไม่สามารถพิสูจน์หลักฐานได้บนบล็อกเชนสาธารณะ หากแต่มีความประสงค์ คุณสามารถตรวจสอบหลักฐานการชำระเงินของคุณได้โดยการใช้คีย์ส่วนตัว TXN\nคีย์ส่วนตัว TXN เป็นคีย์แบบใช้ครั้งเดียวอัตโนมัติที่สร้างขึ้นสำหรับทุกการทำธุรกรรมที่มีการเข้าใช้งานจากกระเป๋าสตางค์ DRGL ของคุณ\nไม่ว่าจะเป็นกระเป๋าสตางค์ DRGL-wallet GUI (ไดอาล็อกรายละเอียดการธุรกรรมที่อยู่ภายใน) หรือโดยกระเป๋าสตางค์แบบปกติอย่าง Dragonglass CLI (ใช้คำสั่งเดียวกัน "get_tx_key").\n\nเวอร์ชั่น DRGL 'Oathkeeper' และแบบขั้นกว่ามีความจำเป็นอย่างมาก\n\nในกรณีข้อพิพาท คุณต้องยื่นข้อมูลดังต่อไปนี้ต่อผู้ไกล่เกลี่ย:\n- คีย์ส่วนตัว TXN\n- แฮชธุรกรรม\n- ที่อยู่สาธารณะของผู้รับ\nการพิสูจน์หลักฐานการชำระเงินจะมีผลสมบูรณ์ได้โดยการใข้ข้อมูลข้างต้นในการป้องข้อมูลเข้าที่ (http://drgl.info/#check_txn).\n\nความล้มเหลวในการยื่นข้อมูลข้างตน หรือการใช้กระเป๋าสตางค์ที่ไม่เหมาะสม จะส่งผลให้คุณสูญเสียการชนะการพิพาทได้ ผู้ส่ง Dragonglass มีหน้าที่แสดงหลักฐานของการโอนเงิน DRGL ต่อผู้ไกล่เกลี่ยในกรณีเกิดข้อพิพาม ไม่เป็นต้องใช้งานการชำเงินแบบ PaymentID \n\nหากคุณมีคำถามหรือข้อสงสัยวิธีการการใช้งาน สามารถขอความช่วยเหลือได้ที่ Dragonglass on Discord (http://discord.drgl.info)
-account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t) not the z-addresses (private), because the arbitrator would not be able to verify the transaction with z-addresses.
-account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses not the untraceable addresses, because the arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer.
+account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information.
+account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information.
+account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending XMR, you need to use either the official Monero GUI wallet or Monero CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nmonero-wallet-cli (use the command get_tx_key)\nmonero-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nIn addition to XMR checktx tool (https://xmr.llcoins.net/checktx.html) verification can also be accomplished in-wallet.\nmonero-wallet-cli : using command (check_tx_key).\nmonero-wallet-gui : on the Advanced > Prove/Check page.\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The XMR sender is responsible for providing verification of the XMR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit (https://www.getmonero.org/resources/user-guides/prove-payment.html) or the Monero forum (https://forum.getmonero.org) to find more information.
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs).
+account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW).
+account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/).
+account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN).
+account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC).
+account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help.
+account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses.
+account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer.
account.altcoin.popup.grin.msg=GRIN requires an interactive process between the sender and receiver to create the transaction. Be sure to follow the instructions from the GRIN project web page to reliably send and receive GRIN (the receiver needs to be online or at least be online during a certain time frame). \n\nBisq supports only the Grinbox (Wallet713) wallet URL format. \n\nThe GRIN sender is required to provide proof that they have sent GRIN successfully. If the wallet cannot provide that proof, a potential dispute will be resolved in favor of the GRIN receiver. Please be sure that you use the latest Grinbox software which supports the transaction proof and that you understand the process of transferring and receiving GRIN as well as how to create the proof. \n\nSee https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only for more information about the Grinbox proof tool.
account.altcoin.popup.beam.msg=BEAM requires an interactive process between the sender and receiver to create the transaction. \n\nBe sure to follow the instructions from the BEAM project web page to reliably send and receive BEAM (the receiver needs to be online or at least be online during a certain time frame). \n\nThe BEAM sender is required to provide proof that they sent BEAM successfully. Be sure to use wallet software which can produce such a proof. If the wallet cannot provide the proof a potential dispute will be resolved in favor of the BEAM receiver.
-account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh).
+account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh).
+
+account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash.
account.fiat.yourFiatAccounts=บัญชีสกุลเงินของคุณ
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=Bonded role unit factor in BSQ
dao.param.ISSUANCE_LIMIT=Issuance limit per cycle in BSQ
dao.param.currentValue=มูลค่าปัจจุบัน: {0}
+dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1})
dao.param.blocks={0} บล็อก
dao.results.cycle.duration.label=ระยะเวลา {0}
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} บล็อก
dao.results.cycle.value.postFix.isDefaultValue=(มูลค่าเริ่มต้น)
dao.results.cycle.value.postFix.hasChanged=(มีการเปลี่ยนแปลงในการลงคะแนนเสียง)
-dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the P2P network.\n{0}
+dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=ไม่ได้กำหนด
@@ -1503,7 +1578,7 @@ dao.proposal.create.publish=Publish proposal
dao.proposal.create.publishing=Proposal publishing is in progress ...
dao.proposal=ข้อเสนอ
dao.proposal.display.type=ประเภทข้อเสนอ
-dao.proposal.display.name=ชื่อ / ชื่อเล่น
+dao.proposal.display.name=Exact GitHub username
dao.proposal.display.link=Link to detailed info
dao.proposal.display.link.prompt=Link to proposal
dao.proposal.display.requestedBsq=จำนวนที่ต้องการใน BSQ
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=ผลโหวตปัจจุบ
dao.proposal.display.myVote.accepted=ได้รับการยืนยัน
dao.proposal.display.myVote.rejected=ปฏิเสธ
dao.proposal.display.myVote.ignored=ละเว้น
-dao.proposal.myVote.summary=โหวต: {0}; น้ำหนักผลการลงคะแนนเสียง: {1} (รายได้: {2} + เงินเดิมพัน: {3});
+dao.proposal.display.myVote.unCounted=Vote was not included in result
+dao.proposal.myVote.summary=Voted: {0}; Vote weight: {1} (earned: {2} + stake: {3}) {4}
dao.proposal.myVote.invalid=Vote was invalid
dao.proposal.voteResult.success=ได้รับการยืนยัน
@@ -1680,6 +1756,7 @@ 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.checkpoint.popup=DAO state is not in sync with the network. After restart the DAO state will resync.
dao.monitor.proposal.headline=Proposals state
dao.monitor.proposal.table.headline=Chain of proposal state hashes
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=BSQ Transactions
dao.factsAndFigures.dashboard.marketPrice=ข้อมูลทางการตลาด
dao.factsAndFigures.dashboard.price=ราคาเทรด BSQ/BTC ล่าสุด (in Bisq)
+dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price
+dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price
dao.factsAndFigures.dashboard.marketCap=โครงสร้างเงินทุนในตลาด (ขึ้นอยู่กับราคาเทรด)
dao.factsAndFigures.dashboard.availableAmount=BSQ ที่ใช้งานได้ทั้งหมด
@@ -1769,10 +1848,6 @@ displayUpdateDownloadWindow.download.openDir=เปิดสารบบดา
disputeSummaryWindow.title=สรุป
disputeSummaryWindow.openDate=วันที่ยื่นการเปิดคำขอและความช่วยเหลือ
disputeSummaryWindow.role=บทบาทของผู้ค้า
-disputeSummaryWindow.evidence=หลักฐาน
-disputeSummaryWindow.evidence.tamperProof=การป้องกันการปลอมแปลงหลักฐาน
-disputeSummaryWindow.evidence.id=การยืนยัน ID
-disputeSummaryWindow.evidence.video=วีดีโอ / Screencast (การจับความเคลื่อนไหวต่างๆ บนจอภาพขณะใช้)
disputeSummaryWindow.payout=การจ่ายเงินของจำนวนการซื้อขาย
disputeSummaryWindow.payout.getsTradeAmount=BTC {0} รับการจ่ายเงินของปริมาณการซื้อขาย:
disputeSummaryWindow.payout.getsAll=BTC {0} รับทั้งหมด
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=ธนาคาร
disputeSummaryWindow.summaryNotes=สรุปบันทึกย่อ
disputeSummaryWindow.addSummaryNotes=เพิ่มสรุปบันทึกย่อ:
disputeSummaryWindow.close.button=ปิดการยื่นคำขอและความช่วยเหลือ
-disputeSummaryWindow.close.msg=ปิดคำขอและการช่วยเหลือ {0} \n\nสรุป: \n{1} ส่งหลักฐานที่ป้องกันการปลอมแปลง: {2} \n{3} ยืนยันรหัส: {4} \n{5} screencast หรือวิดีโอ: {6} \nจำนวนเงินที่จ่ายสำหรับผู้ซื้อ BTC: {7} \nจำนวนเงินที่จ่ายสำหรับผู้ขาย BTC: {8} \n\nบันทึกสรุป: \n{9}
+disputeSummaryWindow.close.msg=Ticket closed on {0}\n\nSummary:\nPayout amount for BTC buyer: {1}\nPayout amount for BTC seller: {2}\n\nSummary notes:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\nNext steps:\nOpen ongoing trade and accept or reject the suggested mediation
disputeSummaryWindow.close.closePeer=คุณจำเป็นต้องยุติคำขอความช่วยเหลือคู่ค้าด้วย !
+disputeSummaryWindow.close.txDetails.headline=Publish refund transaction
+disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction?
emptyWalletWindow.headline={0} กระเป๋าสตางค์ฉุกเฉิน
emptyWalletWindow.info=โปรดใช้ในกรณีฉุกเฉินเท่านั้นหากคุณไม่สามารถเข้าถึงเงินจาก UI ได้\n\nโปรดทราบว่าข้อเสนอแบบเปิดทั้งหมดจะถูกปิดโดยอัตโนมัติเมื่อใช้เครื่องมือนี้\n\nก่อนที่คุณจะใช้เครื่องมือนี้โปรดสำรองข้อมูลในสารบบข้อมูลของคุณ คุณสามารถดำเนินการได้ที่ \"บัญชี / การสำรองข้อมูล \" \n\nโปรดรายงานปัญหาของคุณและส่งรายงานข้อบกพร่องเกี่ยวกับ GitHub หรือที่ฟอรัม Bisq เพื่อให้เราสามารถตรวจสอบสิ่งที่เป็นสาเหตุของปัญหาได้
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=คุณมีข้อเสนอแบบ
emptyWalletWindow.openOffers.yes=ใช่ ฉันแน่ใจ
emptyWalletWindow.sent.success=ยอดคงเหลือในกระเป๋าสตางค์ของคุณได้รับการโอนเรียบร้อยแล้ว
-enterPrivKeyWindow.headline=การลงทะเบียนเปิดสำหรับผู้ไกล่เกลี่ยที่ได้รับเชิญเท่านั้น
+enterPrivKeyWindow.headline=Enter private key for registration
filterWindow.headline=แก้ไขรายการตัวกรอง
filterWindow.offers=ข้อเสนอที่ได้รับการกรอง (คั่นด้วยเครื่องหมายจุลภาค)
@@ -1815,6 +1895,8 @@ filterWindow.accounts=ข้อมูลบัญชีการซื้อข
filterWindow.bannedCurrencies=รหัสโค้ดสกุลเงินที่ได้รับการกรอง (คั่นด้วยเครื่องหมายจุลภาค)
filterWindow.bannedPaymentMethods=รหัส ID วิธีการชำระเงินที่ได้รับการกรอง (คั่นด้วยเครื่องหมายจุลภาค)
filterWindow.arbitrators=ผู้ไกล่เกลี่ยที่ได้รับการคัดกรอง (คั่นด้วยเครื่องหมายจุลภาค ที่อยู่ onion)
+filterWindow.mediators=Filtered mediators (comma sep. onion addresses)
+filterWindow.refundAgents=Filtered refund agents (comma sep. onion addresses)
filterWindow.seedNode=แหล่งข้อมูลในโหนดเครือข่ายที่ได้รับการกรอง (คั่นด้วยเครื่องหมายจุลภาค ที่อยู่ onion)
filterWindow.priceRelayNode=โหนดผลัดเปลี่ยนราคาที่ได้รับการกรอง (คั่นด้วยเครื่องหมายจุลภาค ที่อยู่ onion)
filterWindow.btcNode=โหนด Bitcoin ที่ได้รับการกรองแล้ว (คั่นด้วยเครื่องหมายจุลภาค ที่อยู่ + พอร์ต)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(รหัส ID ธนาคารของผ
offerDetailsWindow.offerersBankName=(ชื่อธนาคารของผู้สร้าง)
offerDetailsWindow.bankId=รหัส ID ธนาคาร (เช่น BIC หรือ SWIFT)
offerDetailsWindow.countryBank=ประเทศของธนาคารของผู้สร้าง
-offerDetailsWindow.acceptedArbitrators=ผู้ไกล่เกลี่ยที่ได้รับการอนุมัติ
offerDetailsWindow.commitment=ข้อผูกมัด
offerDetailsWindow.agree=ฉันเห็นด้วย
offerDetailsWindow.tac=ข้อตกลงและเงื่อนไข
@@ -1883,6 +1964,7 @@ tradeDetailsWindow.tradeDate=วันที่ซื้อขาย
tradeDetailsWindow.txFee=ค่าธรรมเนียมการขุด
tradeDetailsWindow.tradingPeersOnion=ที่อยู่ของ onion คู่ค้า
tradeDetailsWindow.tradeState=สถานะการค้า
+tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
walletPasswordWindow.headline=ป้อนรหัสผ่านเพื่อปลดล็อก
@@ -1945,10 +2027,11 @@ popup.warning.incompatibleDB=เราตรวจพบไฟล์ฐานข
popup.warning.startupFailed.twoInstances=Bisq กำลังทำงานอยู่ คุณไม่สามารถเรียกใช้ Bisq พร้อมกันได้
popup.warning.cryptoTestFailed=ดูเหมือนว่าคุณใช้เรียบเรียงเลขฐานสองด้วยตนเองและไม่ได้ทำตามคำแนะนำใน Build ใน https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for- cryptographic-keys.\n\nหากไม่ใช่กรณีนี้และคุณใช้เลขฐานสอง Bisq อย่างเป็นทางการโปรดยื่นรายงานข้อบกพร่องไปที่หน้า GitHub\nข้อผิดพลาด = {0}
popup.warning.tradePeriod.halfReached=การซื้อขายของคุณที่มีรหัส ID {0} ได้ถึงครึ่งหนึ่งของจำนวนสูงสุดแล้ว อนุญาตให้ซื้อขายได้และยังไม่สมบูรณ์\n\nช่วงเวลาการซื้อขายสิ้นสุดวันที่ {1} \n\nโปรดตรวจสอบสถานะการค้าของคุณที่ \"Portfolio (แฟ้มผลงาน) / เปิดการซื้อขาย \" สำหรับข้อมูลเพิ่มเติม
-popup.warning.tradePeriod.ended=การซื้อขายของคุณที่มีรหัส ID {0} มีค่าสูงสุดแล้ว อนุญาตให้ซื้อขายได้และยังไม่สมบูรณ์\n\nช่วงเวลาการซื้อขายสิ้นสุดวันที่ {1}\n\nโปรดตรวจสอบการค้าของคุณที่ \"Portfolio (แฟ้มผลงาน) / เปิดการซื้อขาย \" เพื่อติดต่อกับผู้ไกล่เกลี่ย
+popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
popup.warning.noTradingAccountSetup.headline=คุณยังไม่ได้ตั้งค่าบัญชีการซื้อขาย
popup.warning.noTradingAccountSetup.msg=คุณต้องตั้งค่าสกุลเงินประจำชาติหรือบัญชี altcoin (เหรียญทางเลือก) ก่อนจึงจะสามารถสร้างข้อเสนอได้\nคุณต้องการตั้งค่าบัญชีหรือไม่
popup.warning.noArbitratorsAvailable=ไม่มีผู้ไกล่เกลี่ยสำหรับทำการ
+popup.warning.noMediatorsAvailable=There are no mediators available.
popup.warning.notFullyConnected=คุณต้องรอจนกว่าคุณจะเชื่อมต่อกับเครือข่ายอย่างสมบูรณ์\nอาจใช้เวลาประมาณ 2 นาทีเมื่อเริ่มต้น
popup.warning.notSufficientConnectionsToBtcNetwork=คุณต้องรอจนกว่าจะมีการเชื่อมต่อกับเครือข่าย Bitcoin อย่างน้อย {0} รายการ
popup.warning.downloadNotComplete=คุณต้องรอจนกว่าการดาวน์โหลดบล็อค Bitcoin ที่ขาดหายไปจะเสร็จสมบูรณ์
@@ -1958,13 +2041,13 @@ popup.warning.examplePercentageValue=โปรดป้อนตัวเลข
popup.warning.noPriceFeedAvailable=ไม่มีฟีดราคาสำหรับสกุลเงินดังกล่าว คุณไม่สามารถใช้ราคาตามเปอร์เซ็นต์ได้\nโปรดเลือกราคาที่ถูกกำหนดไว้แแล้ว
popup.warning.sendMsgFailed=การส่งข้อความไปยังคู่ค้าของคุณล้มเหลว\nโปรดลองอีกครั้งและหากยังคงเกิดขึ้นขึ้นเนื่อง โปรดรายงานข้อผิดพลาดต่อไป
popup.warning.insufficientBtcFundsForBsqTx=คุณไม่มีเงินทุน BTC เพียงพอสำหรับการจ่ายค่าธรรมเนียมขุดสำหรับการทำธุรกรรมดังกล่าว\nกรุณาใส่เงินในกระเป๋าสตางค์ BTC ของคุณ\nเงินขาดไป: {0}
-popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
-popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the Bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the Bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
popup.warning.insufficientBsqFundsForBtcFeePayment=คุณไม่มีเงินทุน BSQ เพียงพอสำหรับการจ่ายค่าธรรมเนียมการเทรดใน BSQ คุณสามารถชำระได้ใน BTC หรือคุณสามารถใช้เงินทุนจากกระเป๋าสตางค์ BSQ ของคุณ คุณสามารถซื้อ BSQ ใน Bisq ได้ \n\nกองทุน BSQ ที่หายไป: {0}
popup.warning.noBsqFundsForBtcFeePayment=กระเป๋าสตางค์ BSQ ของคุณไม่มีจำนวนเงินทุนที่มากพอสำหรับการชำระการเทรดใน BSQ
popup.warning.messageTooLong=ข้อความของคุณเกินขีดจำกัดสูงสุดที่อนุญาต โปรดแบ่งส่งเป็นหลายส่วนหรืออัปโหลดไปยังบริการเช่น https://pastebin.com
-popup.warning.lockedUpFunds=คุณล็อคเงินจากการซื้อขายที่ล้มเหลวแล้ว\nล็อคยอดคงเหลือ: {0} \nที่อยู่ฝากเงิน tx: {1} \nรหัส ID การซื้อขาย: {2} .\n\nโปรดเปิดศูนย์ช่วยเหลือสนับสนุนโดยการเลือกการซื้อขายในหน้าจอการซื้อขายที่ค้างอยู่และคลิก \"alt + o \" หรือ \"option + o \"
+popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"."
popup.warning.nodeBanned=หนึ่งใน {0} โหนดถูกแบน โปรดรีสตาร์ทแอ็พพลิเคชั่นเพื่อให้แน่ใจว่าไม่ได้เชื่อมต่อกับโหนดที่ถูกแบน
popup.warning.priceRelay=ราคาผลัดเปลี่ยน
@@ -1993,19 +2076,36 @@ popup.shutDownInProgress.msg=การปิดแอพพลิเคชั่
popup.attention.forTradeWithId=ต้องให้ความสำคัญสำหรับการซื้อขายด้วย ID {0}
-popup.roundedFiatValues.headline=คุณลักษณะความเป็นส่วนตัวใหม่: ค่าที่ได้รับการปัดเศษ
-popup.roundedFiatValues.msg=เพื่อเพิ่มความเป็นส่วนตัวของการค้าของคุณ {0} จำนวนถูกปัดเศษ\n\nขึ้นอยู่กับเวอร์ชั่นของลูกค้า คุณจะต้องจ่ายหรือรับค่าด้วยทศนิยมหรือแบบกลม\n\nทั้งสองค่าทำตามจากโปรโตคอลการค้า\n\nนอกจากนี้โปรดทราบว่าค่า BTC จะเปลี่ยนไปโดยอัตโนมัติเพื่อให้ตรงกับจำนวนเงินที่ปัดเศษให้ใกล้เคียงที่สุด
-
popup.info.multiplePaymentAccounts.headline=Multiple payment accounts available
popup.info.multiplePaymentAccounts.msg=You have multiple payment accounts available for this offer. Please make sure you've picked the right one.
-popup.dao.launch.headline=The complete vision, realized
-popup.dao.launch.governance.title=การกำกับดูแลกิจการ
-popup.dao.launch.governance=Bisq’s trading network was already decentralized. \nWith the Bisq DAO, Bisq’s leadership is now decentralized too, making Bisq exceptionally resistant to censorship.
-popup.dao.launch.trading.title=ซื้อขาย
-popup.dao.launch.trading=Trade BSQ (colored bitcoin) to participate in Bisq governance. You can buy and sell BSQ just like any other asset on Bisq.
-popup.dao.launch.cheaperFees.title=Cheaper fees
-popup.dao.launch.cheaperFees=Get a 90% discount on trading fees when you use BSQ. Save money and support the project at the same time!\n\n
+popup.news.launch.headline=Two Major Updates
+popup.news.launch.accountSigning.headline=ACCOUNT SIGNING
+popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer.
+popup.news.launch.ntp.headline=NEW TRADE PROTOCOL
+popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant.
+
+popup.accountSigning.selectAccounts.headline=Select payment accounts
+popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign.
+popup.accountSigning.selectAccounts.signAll=Sign all payment methods
+popup.accountSigning.selectAccounts.datePicker=Select point of time until which accounts will be signed
+
+popup.accountSigning.confirmSelectedAccounts.headline=Confirm selected payment accounts
+popup.accountSigning.confirmSelectedAccounts.description=Based on your input, {0} payment accounts will be selected.
+popup.accountSigning.confirmSelectedAccounts.button=Confirm payment accounts
+popup.accountSigning.signAccounts.headline=Confirm signing of payment accounts
+popup.accountSigning.signAccounts.description=Based on your selection, {0} payment accounts will be signed.
+popup.accountSigning.signAccounts.button=Sign payment accounts
+popup.accountSigning.signAccounts.ECKey=Enter private arbitrator key
+popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey
+
+popup.accountSigning.success.headline=Congratulations
+popup.accountSigning.success.description=All {0} payment accounts were successfully signed!
+popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0}
+popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1}
+popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0}
+popup.accountSigning.peerSigner=One of your accounts is mature enough to sign other payment accounts and the initial limit for one of your accounts has been lifted.\n\n{0}
####################################################################
# Notifications
@@ -2071,6 +2171,7 @@ list.currency.editList=แก้ไขรายการสกุลเงิน
table.placeholder.noItems=ขณะนี้ไม่มี {0} พร้อมใช้งาน
table.placeholder.noData=ขณะนี้ไม่มีข้อมูลที่พร้อมใช้งาน
+table.placeholder.processingData=Processing data...
peerInfoIcon.tooltip.tradePeer=การซื้อขายของระบบเน็ตเวิร์ก peer
@@ -2093,7 +2194,8 @@ peerInfo.title=ข้อมูล Peer
peerInfo.nrOfTrades=จำนวนการซื้อขายที่เสร็จสิ้นแล้ว
peerInfo.notTradedYet=คุณยังไม่เคยซื้อขายกับผู้ใช้รายนั้น
peerInfo.setTag=ตั้งค่าแท็กสำหรับ peer นั้น
-peerInfo.age=อายุบัญชีการชำระเงิน
+peerInfo.age.noRisk=อายุบัญชีการชำระเงิน
+peerInfo.age.chargeBackRisk=Time since signing
peerInfo.unknownAge=อายุ ที่ไม่ที่รู้จัก
addressTextField.openWallet=เปิดกระเป๋าสตางค์ Bitcoin เริ่มต้นของคุณ
@@ -2154,7 +2256,7 @@ BTC_REGTEST=Bitcoin Regtest
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=Bitcoin DAO Testnet (deprecated)
# suppress inspection "UnusedProperty"
-BTC_DAO_BETANET=Bitcoin DAO Betanet (Bitcoin Mainnet)
+BTC_DAO_BETANET=Bisq DAO Betanet (Bitcoin Mainnet)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=Bitcoin DAO Regtest
@@ -2253,6 +2355,7 @@ payment.accepted.banks=ธนาคารที่ยอมรับ (ID)
payment.mobile=เบอร์มือถือ
payment.postal.address=รหัสไปรษณีย์
payment.national.account.id.AR=หมายเลข CBU
+shared.accountSigningState=Account signing status
#new
payment.altcoin.address.dyn={0} ที่อยู่
@@ -2261,7 +2364,7 @@ payment.accountNr=หมายเลขบัญชี
payment.emailOrMobile=หมายเลขโทรศัพท์มือถือหรืออีเมล
payment.useCustomAccountName=ใช้ชื่อบัญชีที่กำหนดเอง
payment.maxPeriod=ระยะเวลาสูงสุดการค้าที่อนุญาต
-payment.maxPeriodAndLimit=ระยะเวลาสูงสุดทางการค้า: {0} / ขีดจำกัดสูงสุดทางการค้า: {1} / อายุบัญชี: {2}
+payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3}
payment.maxPeriodAndLimitCrypto=ระยะเวลาสูงสุดทางการค้า: {0} / ขีดจำกัดสูงสุดทางการค้า: {1}
payment.currencyWithSymbol=สกุลเงิน: {0}
payment.nameOfAcceptedBank=ชื่อธนาคารที่ได้รับการยอมรับ
@@ -2284,12 +2387,13 @@ payment.moneyGram.info=เมื่อใช้ MoneyGram ผู้ซื้อ
payment.westernUnion.info=เมื่อใช้ Western Union ผู้ซื้อ BTC จะต้องส่ง MTCN (หมายเลขติดตาม) และรูปใบเสร็จรับเงินทางอีเมลไปยังผู้ขาย BTC ใบเสร็จรับเงินต้องแสดงชื่อเต็ม ประเทศ เมืองและจำนวนเงินทั้งหมดของผู้ขาย ผู้ซื้อจะได้รับอีเมลของผู้ขายในขั้นตอนการค้า
payment.halCash.info=เมื่อมีการใช้งาน HalCash ผู้ซื้อ BTC จำเป็นต้องส่งรหัส Halcash ให้กับผู้ขายทางข้อความโทรศัพท์มือถือ\n\nโปรดตรวจสอบว่าไม่เกินจำนวนเงินสูงสุดที่ธนาคารของคุณอนุญาตให้คุณส่งด้วย HalCash จำนวนเงินขั้นต่ำในการเบิกถอนคือ 10 EUR และสูงสุดในจำนวนเงิน 600 EUR สำหรับการถอนซ้ำเป็น 3000 EUR ต่อผู้รับและต่อวัน และ 6000 EUR ต่อผู้รับและต่อเดือน โปรดตรวจสอบข้อจำกัดจากทางธนาคารคุณเพื่อให้มั่นใจได้ว่าทางธนาคารได้มีการใช้มาตรฐานข้อกำหนดเดียวกันกับดังที่ระบุไว้ ณ ที่นี่\n\nจำนวนเงินที่ถอนจะต้องเป็นจำนวนเงินหลาย 10 EUR เนื่องจากคุณไม่สามารถถอนเงินอื่น ๆ ออกจากตู้เอทีเอ็มได้ UI ในหน้าจอสร้างข้อเสนอและรับข้อเสนอจะปรับจำนวนเงิน BTC เพื่อให้จำนวนเงิน EUR ถูกต้อง คุณไม่สามารถใช้ราคาตลาดเป็นจำนวนเงิน EUR ซึ่งจะเปลี่ยนแปลงไปตามราคาที่มีการปรับเปลี่ยน\n\nในกรณีที่มีข้อพิพาทผู้ซื้อ BTC ต้องแสดงหลักฐานว่าได้ส่ง EUR แล้ว
payment.limits.info=โปรดทราบว่าการโอนเงินผ่านธนาคารทั้งหมดมีความเสี่ยงจากการเรียกเก็บเงินคืน\n\nเพื่อลดความเสี่ยงนี้ Bisq ตั้งค่าขีดจำกัดต่อการซื้อขายขึ้นอยู่กับสองปัจจัยคือ\n\n1. ระดับความเสี่ยงจากการเรียกเก็บเงินคืนโดยประเมินจากวิธีการชำระเงินที่ใช้\n2. อายุของบัญชีสำหรับวิธีการชำระเงินนั้น\n\nขณะนี้บัญชีที่คุณกำลังสร้างใหม่และยังไม่ได้เริ่มอายุการใช้งาน เนื่องจากบัญชีของคุณเติบโตขึ้นเมื่ออายุเกินกว่าระยะเวลาสองเดือน ขีดจำกัดต่อการซื้อขายของคุณจะเติบโตไปพร้อมเช่นกัน: \n\n●ในช่วง 1 เดือนขีดจำกัดต่อการซื้อขายของคุณจะเป็น {0} \n●ในช่วงเดือนที่ 2 ขีดจำกัดต่อการซื้อขายของคุณจะเป็น {1} \n●หลังจากเดือนที่ 2 ขีดจำกัดต่อการซื้อขายของคุณจะเป็น {2} \n\nโปรดทราบว่าไม่มีข้อจำกัดเกี่ยวกับจำนวนครั้งที่คุณสามารถซื้อขายได้
+payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade buy limits based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account you just created carries some chargeback risk and is not yet signed by an arbitrator or trusted peer, so it is limited to buying {0} per trade. After it is signed, buy limits will increase as follows:\n\n● Before signing, and up to 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase merely as account age increases. More information is at https://docs.bisq.network/payment-methods#account-signing.\n\nThere are no limits on the number of trades you can make.
payment.cashDeposit.info=โปรดยืนยันว่าธนาคารของคุณได้อนุมัติให้คุณสามารถส่งเงินสดให้กับบัญชีบุคคลอื่นได้ ตัวอย่างเช่น บางธนาคารที่ไม่ได้มีการบริการถ่ายโอนเงินสดอย่าง Bank of America และ Wells Fargo
payment.revolut.info=Please be sure that the phone number you used for your Revolut account is registered at Revolut otherwise the BTC buyer cannot send you the funds.
-payment.usPostalMoneyOrder.info=Money orders are one of the more private fiat purchase methods available on Bisq.\n\nHowever, please be aware of potentially increased risks associated with their use. Bisq will not bear any responsibility in case a sent money order is stolen, and the arbitrators will in such cases award the BTC to the sender of the money order, provided they can produce tracking information and receipts. It may be advisable for the sender to write the BTC seller's name on the money order, in order to minimize the risk that the money order is cashed by someone else.
+payment.usPostalMoneyOrder.info=Money orders are one of the more private fiat purchase methods available on Bisq.\n\nHowever, please be aware of potentially increased risks associated with their use. Bisq will not bear any responsibility in case a sent money order is stolen, and the mediator or arbitrator will in such cases award the BTC to the sender of the money order, provided they can produce tracking information and receipts. It may be advisable for the sender to write the BTC seller's name on the money order, in order to minimize the risk that the money order is cashed by someone else.
payment.f2f.contact=ข้อมูลติดต่อ
payment.f2f.contact.prompt=วิธีการที่คุณต้องการได้รับการติดต่อจากการค้าจากระบบ peer (ที่อยู่อีเมล , หมายเลขโทรศัพท์ ... )
@@ -2299,11 +2403,15 @@ payment.f2f.optionalExtra=ข้อมูลตัวเลือกเพิ่
payment.f2f.extra=ข้อมูลเพิ่มเติม
payment.f2f.extra.prompt=ผู้สร้างสามารถกำหนด 'ข้อกำหนดในการให้บริการ' หรือเพิ่มข้อมูลการติดต่อสาธารณะได้ สิ่งเหล่านี้จะปรากฏพร้อมกับข้อเสนอ
-payment.f2f.info=การซื้อขายแบบตัวต่อตัวมีกฎระเบียบที่แตกต่างจากระบบออนไลน์ และมาพร้อมกับความเสี่ยงมากกว่าการธุรกรรมทางออนไลน์\n\nข้อแตกต่างคือ:\n● ผู้ที่กระทำการซื้อขายจำเป็นต้องมีการแลกเปลี่ยนข้อมูลเกี่ยวกับสถานที่นัดพบ และเวลาโดยการใช้ข้อมูลการติดต่อของพวกเขา\n● ผู้ที่กระทำการซื้อขายจำเป็นต้องนำคอมพิวเตอร์แล็ปท๊อป และทำการยืนยันข้อมูลของการ 'เงินโอนชำระ' และ 'เงินรับชำระ' ณ สถานที่นัดพบ\n● หากผู้สร้างมี 'ข้อกำหนดและเงื่อนไขอื่น' เพิ่มเติม จะต้องมีการแจ้งข้อมูลเพิ่มเติมส่วนนี้ใน 'ข้อมูลเพิ่มเติม' ในพื้นที่เพิ่มข้อความในแอคเคาวน์\n● ในการรับข้อเสนอ ผู้รับข้อเสนอยินยอมต่อผู้สร้างที่มีการกำหนดเงื่อนไขใน ''ข้อกำหนดและเงื่อนไขอื่น''\n● ในกรณีการพิพาท ผู้ไกล่เกลี่ยอาจสามารถช่วยเหลือในการเจรจาข้อพิพาทในบางส่วน เนื่องจากผู้ไกล่เกลี่ยไม่สามารถเป็นพยานชี้ชัดหลักฐานใดๆ ที่เกิดขึ้น ณ สถานที่จุดนัดพบของผู้ที่กระทำการซื้อขาย กรณีเช่นนี้การระดมทุน BTC อาจจะถูกล็อคโดยไม่มีข้อกำหนด หรือจนกว่าผู้กระทำการซื้อขายมีการตกลงยินยอมกัน\n\nเพื่อให้มั่นใจว่าคุณเข้าใจข้อแตกต่างในการซื้อขายแบบตัวต่อตัว โปรดอ่านวิธีการใช้งานและคำแนะนำได้ที่: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
+payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
payment.f2f.info.openURL=เปิดหน้าเว็บ
-payment.f2f.offerbook.tooltip.countryAndCity=ประเทศและเมือง: {0} / {1}
+payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
payment.f2f.offerbook.tooltip.extra=ข้อมูลเพิ่มเติม: {0}
+payment.japan.bank=ธนาคาร
+payment.japan.branch=Branch
+payment.japan.account=บัญชี
+payment.japan.recipient=ชื่อ
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -2317,6 +2425,7 @@ CASH_DEPOSIT=ฝากเงินสด
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=เห็นหน้ากัน (แบบตัวต่อตัว)
+JAPAN_BANK=Japan Bank Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=ธนาคารแห่งชาติ
@@ -2334,6 +2443,8 @@ MONEY_GRAM_SHORT=MoneyGram
WESTERN_UNION_SHORT=Western Union
# suppress inspection "UnusedProperty"
F2F_SHORT=F2F
+# suppress inspection "UnusedProperty"
+JAPAN_BANK_SHORT=Japan Furikomi
# Do not translate brand names
# suppress inspection "UnusedProperty"
@@ -2495,7 +2606,12 @@ validation.pattern=การป้อนเข้าจะต้องเป็
validation.noHexString=การป้อนเข้านั้นคือไม่ใช่รูปแบบของ HEX
validation.advancedCash.invalidFormat=จะต้องเป็นอีเมลหรือรหัสกระเป๋าสตางค์ที่ใช้งานได้: X000000000000
validation.invalidUrl=This is not a valid URL
-validation.mustBeDifferent=Your input must be different to the current value
+validation.mustBeDifferent=Your input must be different from the current value
validation.cannotBeChanged=Parameter cannot be changed
validation.numberFormatException=Number format exception {0}
validation.mustNotBeNegative=Input must not be negative
+validation.phone.missingCountryCode=Need two letter country code to validate phone number
+validation.phone.invalidCharacters=Phone number {0} contains invalid characters
+validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number
+validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number
+validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}.
diff --git a/core/src/main/resources/i18n/displayStrings_vi.properties b/core/src/main/resources/i18n/displayStrings_vi.properties
index e5e159553f..381e76ecdc 100644
--- a/core/src/main/resources/i18n/displayStrings_vi.properties
+++ b/core/src/main/resources/i18n/displayStrings_vi.properties
@@ -62,6 +62,10 @@ shared.priceWithCur=Giá bằng {0}
shared.priceInCurForCur=Giá bằng {0} với 1 {1}
shared.fixedPriceInCurForCur=Giá cố định bằng {0} với 1 {1}
shared.amount=Số tiền
+shared.txFee=Transaction Fee
+shared.makerFee=Maker Fee
+shared.buyerSecurityDeposit=Buyer Deposit
+shared.sellerSecurityDeposit=Seller Deposit
shared.amountWithCur=Thành tiền bằng {0}
shared.volumeWithCur=Khối lượng bằng {0}
shared.currency=Tiền tệ
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=Hãy gửi lại xác nhận
shared.exportCSV=Truy xuất ra csv
shared.exportJSON=Truy xuất ra JSON
shared.noDateAvailable=Ngày tháng không hiển thị
-shared.arbitratorsFee=Phí trọng tài
shared.noDetailsAvailable=Không có thông tin
shared.notUsedYet=Chưa được sử dụng
shared.date=Ngày
@@ -149,11 +152,11 @@ shared.save=Lưu
shared.onionAddress=Địa chỉ Onion
shared.supportTicket=vé hỗ trợ
shared.dispute=tranh chấp
+shared.mediationCase=mediation case
shared.seller=người bán
shared.buyer=người mua
shared.allEuroCountries=Tất cả các nước Châu ÂU
shared.acceptedTakerCountries=Các quốc gia tiếp nhận được chấp nhận
-shared.arbitrator=Trọng tài được chọn
shared.tradePrice=Giá giao dịch
shared.tradeAmount=Khoản tiền giao dịch
shared.tradeVolume=Khối lượng giao dịch
@@ -203,6 +206,15 @@ shared.proposal=Đề xuất
shared.votes=Các phiếu bầu
shared.learnMore=Tìm hiểu thêm
shared.dismiss=Hủy
+shared.selectedArbitrator=Trọng tài được chọn
+shared.selectedMediator=Selected mediator
+shared.selectedRefundAgent=Trọng tài được chọn
+shared.mediator=Người hòa giải
+shared.arbitrator=Trọng tài
+shared.refundAgent=Trọng tài
+shared.refundAgentForSupportStaff=Refund agent
+shared.delayedPayoutTxId=Refund collateral transaction ID
+
####################################################################
# UI views
@@ -244,7 +256,7 @@ mainView.footer.btcInfo.synchronizingWith=Synchronizing with
mainView.footer.btcInfo.synchronizedWith=Đã đồng bộ hóa với
mainView.footer.btcInfo.connectingTo=Đang kết nối với
mainView.footer.btcInfo.connectionFailed=không kết nối được
-mainView.footer.p2pInfo=Các mạng P2P ngang hàng: {0}
+mainView.footer.p2pInfo=Bisq network peers: {0}
mainView.footer.daoFullNode=Full node DAO
mainView.bootstrapState.connectionToTorNetwork=(1/4) Kết nối với mạng ...
@@ -254,10 +266,10 @@ mainView.bootstrapState.initialDataReceived=(4/4) Nhận dữ liệu ban đầu
mainView.bootstrapWarning.noSeedNodesAvailable=Không có seed nodes khả dụng
mainView.bootstrapWarning.noNodesAvailable=Không có seed nodes và đối tác ngang hàng khả dụng
-mainView.bootstrapWarning.bootstrappingToP2PFailed=Khởi động đến mạng P2P không thành công
+mainView.bootstrapWarning.bootstrappingToP2PFailed=Bootstrapping to Bisq network failed
mainView.p2pNetworkWarnMsg.noNodesAvailable=Không có seed nodes hay đối tác ngang hàng để yêu cầu dữ liệu.\nVui lòng kiểm tra kết nối internet hoặc thử khởi động lại ứng dụng.
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Kết nối tới mạng P2P không thành công (lỗi báo cáo: {0}).\nVui lòng kiểm tra kết nối internet hoặc thử khởi động lại ứng dụng.
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Connecting to the Bisq network failed (reported error: {0}).\nPlease check your internet connection or try to restart the application.
mainView.walletServiceErrorMsg.timeout=Kết nối tới mạng Bitcoin không thành công do hết thời gian chờ.
mainView.walletServiceErrorMsg.connectionError=Kết nối tới mạng Bitcoin không thành công do lỗi: {0}
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=Đóng:
market.trades.tooltip.candle.high=Cao:
market.trades.tooltip.candle.low=Thấp:
market.trades.tooltip.candle.average=Trung bình:
+market.trades.tooltip.candle.median=Median:
market.trades.tooltip.candle.date=Ngày:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=Các quốc gia có ngân hàng được ch
offerbook.availableOffers=Các chào giá hiện có
offerbook.filterByCurrency=Lọc theo tiền tệ
offerbook.filterByPaymentMethod=Lọc theo phương thức thanh toán
+offerbook.timeSinceSigning=Time since signing
+offerbook.timeSinceSigning.info=This account was verified and {0}
+offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
+offerbook.timeSinceSigning.info.peer=signed by a peer, waiting for limits to be lifted
+offerbook.timeSinceSigning.info.peerLimitLifted=signed by a peer and limits were lifted
+offerbook.timeSinceSigning.info.signer=signed by peer and can sign peer accounts (limits lifted)
+offerbook.timeSinceSigning.daysSinceSigning={0} ngày
+offerbook.timeSinceSigning.daysSinceSigning.long={0} since signing
+
+offerbook.timeSinceSigning.help=When you successfully complete a trade with a peer who has a signed payment account, your payment account is signed.\n{0} days later, the initial limit of {1} is lifted and your account can sign other peers'' payment accounts.
+offerbook.timeSinceSigning.notSigned=Not signed yet
+offerbook.timeSinceSigning.notSigned.noNeed=Không áp dụng
+shared.notSigned=This account hasn't been signed yet
+shared.notSigned.noNeed=This account type doesn't use signing
offerbook.nrOffers=Số chào giá: {0}
offerbook.volume={0} (min - max)
@@ -345,14 +372,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=Bạn không có tài khoản
offerbook.warning.noMatchingAccount.headline=Không có tài khoản giao dịch phù hợp.
offerbook.warning.noMatchingAccount.msg=To take this offer, you will need to set up a payment account using this payment method.\n\nWould you like to do this now?
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=This offer cannot be taken because of security restrictions based on the following criteria:\n- The maker''s payment account was created after March 1st 2019\n- The minimum trade amount is above 0.01 BTC\n- The payment method for the offer is considered risky for bank chargebacks\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=This offer cannot be taken because of security restrictions based on the following criteria:\n- Your payment account was created after March 1st 2019\n- The minimum trade amount is above 0.01 BTC\n- The payment method for this offer is considered risky for bank chargebacks\n\n{0}
+offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing.
-offerbook.warning.newVersionAnnouncement=We needed to deploy this restriction as a short-term measure for enhanced security.\n\nThe next software release will provide more robust protection tools so that offers with this risk profile can be traded again.
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to 0.01 BTC because of security restrictions based on the following criteria:\n- The buyers account was created after March 1st 2019\n- The payment method for this offer is considered risky for bank chargebacks\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to 0.01 BTC because of security restrictions based on the following criteria:\n- Your payment account was created after March 1st 2019\n- The payment method for this offer is considered risky for bank chargebacks\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1}
offerbook.warning.wrongTradeProtocol=Lệnh này cần phiên bản giao thức khác với được sử dụng trong phiên bản phần mềm của bạn.\n\nHãy kiểm tra xem bạn đã cài đặt phiên bản mới nhất chưa, nếu không người dùng đã tạo lệnh đã sử dụng phiên bản cũ.\n\nNgười dùng không thể giao dịch với phiên bản giao thức giao dịch không tương thích.
offerbook.warning.userIgnored=Bạn đã thêm địa chỉ onion của người dùng vào danh sách bỏ qua.
@@ -478,7 +503,7 @@ takeOffer.failed.offerTaken=Bạn không thể nhận chào giá này vì đã
takeOffer.failed.offerRemoved=Bạn không thể nhận chào giá này vì trong lúc chời đợi, chào giá này đã bị gỡ bỏ.
takeOffer.failed.offererNotOnline=Nhận báo giá không thành công vì người tạo không còn online.
takeOffer.failed.offererOffline=Bạn không thể nhận báo giá vì người tạo đã offline.
-takeOffer.warning.connectionToPeerLost=Bạn mất kết nối với người tạo.\nNgười tạo có thể đã offline và ngắt kết nối với bạn do có quá nhiều kết nối mở.\n\nNếu bạn vẫn nhìn thấy chào giá của người tạo này trong danh mục chào giá, bạn có thể thử nhận chào giá lần nữa.
+takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again.
takeOffer.error.noFundsLost=\n\nVí của bạn không còn tiền.\nHãy khởi động lại ứng dụng và kiểm tra kết nối mạng để xem bạn có thể xử lý vấn đề này hay không.
takeOffer.error.feePaid=\n\nPlease try to restart your application and check your network connection to see if you can resolve the issue.
@@ -516,8 +541,8 @@ portfolio.pending.step3_seller.confirmPaymentReceived=Xác nhận đã nhận đ
portfolio.pending.step5.completed=Hoàn thành
portfolio.pending.step1.info=Giao dịch đặt cọc đã được công bố.\n{0} Bạn cần đợi ít nhất một xác nhận blockchain trước khi bắt đầu thanh toán.
-portfolio.pending.step1.warn=Giao dịch đặt cọc vẫn chưa được xác nhận.\nĐiều này có thể xảy ra do phí nộp của một Thương gia từ ví ngoài quá thấp.
-portfolio.pending.step1.openForDispute=Giao dịch đặt cọc vẫn chưa được xác nhận.\nĐiều này có thể xảy ra do phí nộp của một Thương gia từ ví ngoài quá thấp.\nThời gian tối đa cho giao dịch đã hết.\n\nBạn có thể đợi thêm hoặc liên hệ trọng tài để mở tranh chấp.
+portfolio.pending.step1.warn=The deposit transaction is still not confirmed. This sometimes happens in rare cases when the funding fee of one trader from an external wallet was too low.
+portfolio.pending.step1.openForDispute=The deposit transaction is still not confirmed. You can wait longer or contact the mediator for assistance.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=giao dịch của bạn đã có ít nhất một xác nhận blockchain.\n(Bạn có thể đợi thêm xác nhận khác nếu bạn muốn - 6 xác nhận được xem là rất an toàn.)\n\n
@@ -535,8 +560,10 @@ portfolio.pending.step2_buyer.altcoin=Hãy chuyển từ ví ngoài {0} của b
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=Hãy đến ngân hàng và thanh toán {0} cho người bán BTC.\n\n
portfolio.pending.step2_buyer.cash.extra=YÊU CẦU QUAN TRỌNG:\nSau khi bạn đã thanh toán xong hãy viết lên giấy biên nhận: KHÔNG HOÀN TRẢ.\nSau đó xé thành 2 phần, chụp ảnh và gửi tới email của người bán BTC.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=Vui lòng trả {0} cho người bán BTC qua MoneyGram.\n\n
portfolio.pending.step2_buyer.moneyGram.extra=Yêu cầu quan trọng:\nSau khi bạn hoàn thành chi trả hãy gửi Số xác thực và hình chụp hoá đơn qua email cho người bán BTC.\nHoá đơn phải chỉ rõ họ tên đầy đủ, quốc gia, tiểu bang và số tiền. Email người bán là: {0}.
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=Hãy thanh toán {0} cho người bán BTC bằng cách sử dụng Western Union.\n\n
portfolio.pending.step2_buyer.westernUnion.extra=YÊU CẦU QUAN TRỌNG:\nSau khi bạn đã thanh toán xong hãy gửi MTCN (số theo dõi) và ảnh giấy biên nhận bằng email cho người bán BTC.\nGiấy biên nhận phải ghi rõ họ tên của người bán, thành phố, quốc gia và số tiền. Địa chỉ email của người bán là: {0}.
@@ -544,14 +571,15 @@ portfolio.pending.step2_buyer.westernUnion.extra=YÊU CẦU QUAN TRỌNG:\nSau k
portfolio.pending.step2_buyer.postal=Hãy gửi {0} bằng \"Phiếu chuyển tiền US\" cho người bán BTC.\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.bank=Hãy truy cập trang web ngân hàng và thanh toán {0} cho người bán BTC.\n\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=Vui lòng liên hệ người bán BTC và cung cấp số liên hệ và sắp xếp cuộc hẹn để thanh toán {0}.\n\n
portfolio.pending.step2_buyer.startPaymentUsing=Thanh toán bắt đầu sử dụng {0}
portfolio.pending.step2_buyer.amountToTransfer=Số tiền chuyển
portfolio.pending.step2_buyer.sellersAddress=Địa chỉ của người bán {0}
portfolio.pending.step2_buyer.buyerAccount=Tài khoản thanh toán sẽ sử dụng
portfolio.pending.step2_buyer.paymentStarted=Bắt đầu thanh toán
-portfolio.pending.step2_buyer.warn=Bạn vẫn chưa thanh toán {0}!\nHãy lưu ý rằng giao dịch phải được hoàn thành trước {1} nếu không giao dịch sẽ bị điều tra bởi trọng tài.
-portfolio.pending.step2_buyer.openForDispute=Bạn vẫn chưa thanh toán xong!\nThời gian tối đa cho giao dịch đã hết.\n\nHãy liên hệ trọng tài để mở tranh chấp.
+portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
+portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.Please contact the mediator for assistance.
portfolio.pending.step2_buyer.paperReceipt.headline=Bạn đã gửi giấy biên nhận cho người bán BTC chưa?
portfolio.pending.step2_buyer.paperReceipt.msg=Remember:\nBạn cần phải viết trên giấy biên nhận: KHÔNG HOÀN TRẢ.\nSau đó xé thành 2 phần, chụp ảnh và gửi đến email của người bán BTC.
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=Gửi số xác nhận và hoá đơn
@@ -569,7 +597,11 @@ portfolio.pending.step2_seller.waitPayment.headline=Đợi thanh toán
portfolio.pending.step2_seller.f2fInfo.headline=Thông tin liên lạc của người mua
portfolio.pending.step2_seller.waitPayment.msg=Giao dịch đặt cọc có ít nhất một xác nhận blockchain.\nBạn cần phải đợi cho đến khi người mua BTC bắt đầu thanh toán {0}.
portfolio.pending.step2_seller.warn=Người mua BTC vẫn chưa thanh toán {0}.\nBạn cần phải đợi cho đến khi người mua bắt đầu thanh toán.\nNếu giao dịch không được hoàn thành vào {1} trọng tài sẽ điều tra.
-portfolio.pending.step2_seller.openForDispute=Người mua BTC chưa bắt đầu thanh toán!\nThời gian cho phép tối đa cho giao dịch đã hết.\nBạn có thể đợi lâu hơn và cho Đối tác giao dịch thêm thời gian hoặc liên hệ trọng tài để mở khiếu nại.
+portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance.
+
+tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}''
+tradeChat.openChat=Open chat window
+tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=Không xác định
@@ -578,7 +610,7 @@ message.state.SENT=Tin nhắn được gửi
# suppress inspection "UnusedProperty"
message.state.ARRIVED=Tin nhắn đã nhận
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=Tin nhắn được lưu trong hộp thư
+message.state.STORED_IN_MAILBOX=Message of payment sent but not yet received by peer
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=Người nhận xác nhận tin nhắn
# suppress inspection "UnusedProperty"
@@ -589,22 +621,23 @@ portfolio.pending.step3_buyer.wait.info=Đợi người bán BTC xác nhận đ
portfolio.pending.step3_buyer.wait.msgStateInfo.label=Thông báo trạng thái thanh toán đã bắt đầu
portfolio.pending.step3_buyer.warn.part1a=trên blockchain {0}
portfolio.pending.step3_buyer.warn.part1b=tại nhà cung cấp thanh toán của bạn (VD: ngân hàng)
-portfolio.pending.step3_buyer.warn.part2=Người bán BTC vẫn chưa xác nhận thanh toán của bạn!\nHãy kiểm tra xem {0} việc gửi thanh toán đi đã thành công chưa.\nNếu người bán BTC không xác nhận là đã nhận thanh toán của bạn trước {1} giao dịch sẽ bị điều tra bởi trọng tài.
-portfolio.pending.step3_buyer.openForDispute=Người bán BTC vẫn chưa xác nhận thanh toán của bạn!\nThời gian tối đa cho giao dịch đã hết.\nBạn có thể đợi lâu hơn và cho đối tác giao dịch thêm thời gian hoặc liên hệ trọng tài để mở khiếu nại.
+portfolio.pending.step3_buyer.warn.part2=The BTC seller still has not confirmed your payment. Please check {0} if the payment sending was successful.
+portfolio.pending.step3_buyer.openForDispute=The BTC seller has not confirmed your payment! The max. period for the trade has elapsed. You can wait longer and give the trading peer more time or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=Đối tác giao dịch của bạn đã xác nhận rằng họ đã kích hoạt thanh toán {0}.\n\n
portfolio.pending.step3_seller.altcoin.explorer=Trên trình duyệt blockchain explorer {0} ưa thích của bạn
portfolio.pending.step3_seller.altcoin.wallet=Trên ví {0} của bạn
portfolio.pending.step3_seller.altcoin={0}Vui lòng kiểm tra {1} xem giao dịch tới địa chỉ nhận của bạn \n{2}\nđã nhận được đủ xác nhận blockchain hay chưa.\nSố tiền thanh toán phải là {3}\n\nBạn có thể copy & paste địa chỉ {4} của bạn từ màn hình chính sau khi đóng cửa sổ này.
portfolio.pending.step3_seller.postal={0}Hãy kiểm tra xem bạn đã nhận được {1} \"Thư chuyển tiền US\" từ người mua BTC chưa.\n\nID giao dịch (nội dung \"lý do thanh toán\") của giao dịch là: \"{2}\"
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=Đối tác giao dịch của bạn đã xác nhận rằng họ đã kích hoạt thanh toán {0}.\n\nHãy truy cập trang web ngân hàng online và kiểm tra xem bạn đã nhận được {1} từ người mua BTC chưa.\n\nID giao dịch (\"lý do thanh toán\" text) của giao dịch là: \"{2}\"\n\n
portfolio.pending.step3_seller.cash=Vì thanh toán được thực hiện qua Tiền gửi tiền mặt nên người mua BTC phải viết rõ \"KHÔNG HOÀN LẠI\" trên giấy biên nhận, xé làm 2 phần và gửi ảnh cho bạn qua email.\n\nĐể tránh bị đòi tiền lại, chỉ xác nhận bạn đã nhận được email và bạn chắc chắn giấy biên nhận là có hiệu lực.\nNếu bạn không chắc chắn, {0}
portfolio.pending.step3_seller.moneyGram=Người mua phải gửi mã số xác nhận và ảnh chụp của hoá đơn qua email.\nHoá đơn cần ghi rõ họ tên đầy đủ, quốc gia, tiêu bang và số lượng. Vui lòng kiểm tra email nếu bạn nhận được số xác thực.\n\nSau khi popup đóng, bạn sẽ thấy tên người mua BTC và địa chỉ để nhận tiền từ MoneyGram.\n\nChỉ xác nhận hoá đơn sau khi bạn hoàn thành việc nhận tiền.
portfolio.pending.step3_seller.westernUnion=Người mua phải gửi cho bạn MTCN (số theo dõi) và ảnh giấy biên nhận qua email.\nGiấy biên nhận phải ghi rõ họ tên của bạn, thành phố, quốc gia và số tiền. Hãy kiểm tra email xem bạn đã nhận được MTCN chưa.\n\nSau khi đóng cửa sổ này, bạn sẽ thấy tên và địa chỉ của người mua BTC để nhận tiền từ Western Union.\n\nChỉ xác nhận giấy biên nhận sau khi bạn đã nhận tiền thành công!
portfolio.pending.step3_seller.halCash=Người mua phải gửi mã HalCash cho bạn bằng tin nhắn. Ngoài ra, bạn sẽ nhận được một tin nhắn từ HalCash với thông tin cần thiết để rút EUR từ một máy ATM có hỗ trợ HalCash. \n\nSau khi nhận được tiền từ ATM vui lòng xác nhận lại biên lai thanh toán tại đây!
-portfolio.pending.step3_seller.bankCheck=\n\nVui lòng kiểm tra tên người gửi trong sao kê của ngân hàng có trùng với tên trong Hợp đồng giao dịch không:\nTên người gửi: {0}\n\nNếu tên không trùng với tên hiển thị ở đây, {1}
-portfolio.pending.step3_seller.openDispute=vui lòng không xác nhận mà mở khiếu nại bằng cách nhập \"alt + o\" hoặc \"option + o\".
+portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1}
+portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=Xác nhận đã nhận được thanh toán
portfolio.pending.step3_seller.amountToReceive=Số tiền nhận được
portfolio.pending.step3_seller.yourAddress=Địa chỉ {0} của bạn
@@ -617,17 +650,18 @@ portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Kiểm tra xác nhậ
portfolio.pending.step3_seller.buyerStartedPayment.fiat=Kiểm tra tại tài khoản giao dịch của bạn (VD: Tài khoản ngân hàng) và xác nhận khi bạn đã nhận được thanh toán.
portfolio.pending.step3_seller.warn.part1a=trên {0} blockchain
portfolio.pending.step3_seller.warn.part1b=tại nhà cung cấp thanh toán của bạn (VD: ngân hàng)
-portfolio.pending.step3_seller.warn.part2=Bạn vẫn chưa xác nhận đã nhận được thanh toán!\nVui lòng kiểm tra {0} xem bạn đã nhận được thanh toán chưa.\nNếu bạn không xác nhận đã nhận trước {1} giao dịch sẽ bị điều tra bởi trọng tài.
-portfolio.pending.step3_seller.openForDispute=Bạn vẫn chưa xác nhận đã nhận được thanh toán!\nThời gian tối đa cho giao dịch đã hết.\nHãy xác nhận hoặc liên hệ trọng tài để mở khiếu nại.
+portfolio.pending.step3_seller.warn.part2=You still have not confirmed the receipt of the payment. Please check {0} if you have received the payment.
+portfolio.pending.step3_seller.openForDispute=You have not confirmed the receipt of the payment!\nThe max. period for the trade has elapsed.\nPlease confirm or request assistance from the mediator.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=Bạn đã nhận được thanh toán {0} từ Đối tác giao dịch của bạn?\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=ID giao dịch (nội dung \"lý do thanh toán\") của giao dịch là: \"{0}\"\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=Vui lòng kiểm tra tên người gửi trong sao kê của ngân hàng có trùng với tên trong Hợp đồng giao dịch không:\nTên người gửi: {0}\n\nNếu tên không trùng với tên hiển thị ở đây, vui lòng không xác nhận và mở khiếu nại bằng cách nhập \"alt + o\" hoặc \"option + o\".\n\n
-portfolio.pending.step3_seller.onPaymentReceived.note=Lưu ý rằng ngay khi bạn xác nhận đã nhận thanh toán, khoản tiền giao dịch bị khóa sẽ được chuyển cho người mua BTC và tiền gửi đại lý sẽ được hoàn trả.
+portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n
+portfolio.pending.step3_seller.onPaymentReceived.note=Please note, that as soon you have confirmed the receipt, the locked trade amount will be released to the BTC buyer and the security deposit will be refunded.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Xác nhận rằng bạn đã nhận được thanh toán
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Vâng, tôi đã nhận được thanh toán
+portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANT: By confirming receipt of payment, you are also verifying the account of the counterparty and signing it accordingly. Since the account of the counterparty hasn't been signed yet, you should delay confirmation of the payment as long as possible to reduce the risk of a chargeback.
portfolio.pending.step5_buyer.groupTitle=Tóm tắt giao dịch đã hoàn thành
portfolio.pending.step5_buyer.tradeFee=Phí giao dịch
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=Tổng phí đào
portfolio.pending.step5_buyer.refunded=tiền gửi đặt cọc được hoàn lại
portfolio.pending.step5_buyer.withdrawBTC=Rút bitcoin của bạn
portfolio.pending.step5_buyer.amount=Số tiền được rút
+portfolio.pending.step5_buyer.signer=By withdrawing your bitcoins, you verify that the counterparty has acted according to the trade protocol.
portfolio.pending.step5_buyer.withdrawToAddress=rút tới địa chỉ
portfolio.pending.step5_buyer.moveToBisqWallet=Chuyển tiền tới ví Bisq
portfolio.pending.step5_buyer.withdrawExternal=rút tới ví ngoài
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=Sau xác nhận blockchain đầu tiên, thờ
portfolio.pending.tradePeriodWarning=Nếu quá thời gian giao dịch, cả hai Thương gia đều có thể mở khiếu nại.
portfolio.pending.tradeNotCompleted=giao dịch không được hoàn thành đúng thời gian (cho đến khi {0})
portfolio.pending.tradeProcess=Quá trình giao dịch
-portfolio.pending.openAgainDispute.msg=Nếu bạn không chắc chắn rằng tin nhắn cho trọng tài đã đến hay chưa (VD: nếu sau một ngày bạn không nhận được phản hồi) hãy mở khiếu nại lần nữa.
+portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community.
portfolio.pending.openAgainDispute.button=Mở khiếu nại lần nữa
portfolio.pending.openSupportTicket.headline=Mở vé hỗ trợ
-portfolio.pending.openSupportTicket.msg=Vui lòng chỉ sử dụng trong trường hợp khẩn cấp nếu bạn không hiển thị Node \"Mở hỗ trợ\" hoặc \"Mở khiếu nại\".\n\nKhi bạn mở Đơn hỗ trợ, giao dịch sẽ bị gián đoạn và xử lý bởi trọng tài
+portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator.
+
+portfolio.pending.timeLockNotOver=You have to wait until ≈{0} ({1} more blocks) before you can open an arbitration dispute.
+
portfolio.pending.notification=Thông báo
-portfolio.pending.openDispute=Mở khiếu nại
-portfolio.pending.arbitrationRequested=Khiếu nại đã mở
+
+portfolio.pending.support.headline.getHelp=Need help?
+portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator.
+portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator.
+portfolio.pending.support.button.getHelp=Get support
+portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket?
+portfolio.pending.support.popup.button=Mở đơn hỗ trợ
+portfolio.pending.support.headline.halfPeriodOver=Check payment
+portfolio.pending.support.headline.periodOver=Trade period is over
+
+portfolio.pending.mediationRequested=Mediation requested
+portfolio.pending.refundRequested=Refund requested
portfolio.pending.openSupport=Mở đơn hỗ trợ
portfolio.pending.supportTicketOpened=Đơn hỗ trợ đã mở
portfolio.pending.requestSupport=Yêu cầu hỗ trợ
-portfolio.pending.error.requestSupport=Vui lòng báo cáo vấn đề với trọng tài của bạn.\n\nTrọng tài sẽ chuyển tiếp thông tin tới lập trình viên để điều tra vấn đề.\nSau khi vấn đề đã được phân tích, bạn sẽ nhận được tất cả số vốn đã bị khóa.
+portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds.
portfolio.pending.communicateWithArbitrator=Vui lòng liên lạc với trong tài qua màn hình \"Hỗ trợ\".
+portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator.
portfolio.pending.supportTicketOpenedMyUser=Bạn đã mở một đơn hỗ trợ.\n{0}
portfolio.pending.disputeOpenedMyUser=Bạn đã mở một khiếu nại.\n{0}
portfolio.pending.disputeOpenedByPeer=Đối tác giao dịch của bạn đã mở một khiếu nại\n{0}
portfolio.pending.supportTicketOpenedByPeer=Đối tác giao dịch của bạn đã mở một đơn hỗ trợ.\n{0}
portfolio.pending.noReceiverAddressDefined=Không có địa chỉ người nhận
-portfolio.pending.removeFailedTrade=Nếu trọng tài không thể đóng giao dịch này, bạn có thể tự chuyển sang màn hình giao dịch không thành công.\nBạn có muốn chuyển giao dịch không thành công từ màn hình giao dịch chờ xử lý không??
+portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade?
+
+portfolio.pending.mediationResult.headline=Suggested payout from mediation
+portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout.
+portfolio.pending.mediationResult.info.selfAccepted=You have accepted the mediator's suggestion. Waiting for peer to accept as well.
+portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted the mediator's suggestion. Do you accept as well?
+portfolio.pending.mediationResult.button=View proposed resolution
+portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0}
+portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0}
+portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=Hoàn thành
-portfolio.closed.ticketClosed=Đơn đã đóng
+portfolio.closed.ticketClosed=Arbitrated
+portfolio.closed.mediationTicketClosed=Mediated
portfolio.closed.canceled=Đã hủy
portfolio.failed.Failed=Không thành công
@@ -745,6 +807,9 @@ funds.tx.multiSigDeposit=Tiền gửi Multisig: {0}
funds.tx.multiSigPayout=Tiền trả Multisig: {0}
funds.tx.disputePayout=Tiền trả khiếu nại: {0}
funds.tx.disputeLost=Vụ khiếu nại bị thua: {0}
+funds.tx.collateralForRefund=Refund collateral: {0}
+funds.tx.timeLockedPayoutTx=Time locked payout tx: {0}
+funds.tx.refund=Refund from arbitration: {0}
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
@@ -765,14 +830,15 @@ funds.tx.dustAttackTx.popup=Giao dịch này đang gửi một lượng BTC rấ
# Support
####################################################################
-support.tab.mediation.support=Đơn hỗ trợ
-support.tab.ArbitratorsSupportTickets=Đơn hỗ trợ của trọng tài
-support.tab.TradersSupportTickets=Đơn hỗ trợ của Thương gia
+support.tab.mediation.support=Mediation
+support.tab.arbitration.support=Arbitration
+support.tab.legacyArbitration.support=Legacy Arbitration
+support.tab.ArbitratorsSupportTickets={0}'s tickets
support.filter=Danh sách lọc
support.filter.prompt=Nhập ID giao dịch, ngày tháng, địa chỉ onion hoặc dữ liệu tài khoản
support.noTickets=Không có đơn hỗ trợ được mở
support.sendingMessage=Đang gửi tin nhắn...
-support.receiverNotOnline=Người nhận không online. Tin nhắn sẽ được lưu trong hộp thư của người nhận.
+support.receiverNotOnline=Receiver is not online. Message is saved to their mailbox.
support.sendMessageError=Gửi tin nhắn thất bại. Lỗi: {0}
support.wrongVersion=Báo giá trong khiếu nại này được tạo với phiên bản Bisq cũ.\nBạn không thể đóng khiếu nại với phiên bản ứng dụng của bạn.\n\nVui lòng sử dụng phiên bản giao thức cũ hơn {0}
support.openFile=Mở file để đính kèm (dung lượng file tối đa: {0} kb)
@@ -782,7 +848,7 @@ support.attachment=File đính kèm
support.tooManyAttachments=Bạn không thể gửi quá 3 file đính kèm trong một tin.
support.save=Lưu file vào đĩa
support.messages=Tin nhắn
-support.input.prompt=Vui lòng nhập tin nhắn của bạn cho trọng tài vào đây
+support.input.prompt=Enter message...
support.send=Gửi
support.addAttachments=Thêm file đính kèm
support.closeTicket=Đóng đơn hỗ trợ
@@ -801,14 +867,18 @@ support.buyerOfferer=Người mua BTC/Người tạo
support.sellerOfferer=Người bán BTC/Người tạo
support.buyerTaker=Người mua BTC/Người nhận
support.sellerTaker=Người bán BTC/Người nhận
-support.backgroundInfo=Bisq không phải là một công ty, vậy nên chúng tôi giải quyết khiếu nại một cách khác biệt.\n\nNếu có khiếu nại trong quá trình giao dịch (VD: một người tham gia giao dịch không tuân thủ giao thức giao dịch) ứng dụng sẽ hiển thị nút \"Mở khiếu nại\" sau khi hết thời gian giao dịch để liên hệ với trọng tài.\n\nTrong trường hợp có sự cố với ứng dụng, phầm mềm sẽ tìm cách phát hiện và, nếu có thể, sẽ hiển thị nút \"Mở vé hỗ trợ\" để liên hệ với trọng tài nhằm chuyển tiếp vấn đề cho lập trình viên.\n\nTrong trường hợp người dùng gặp sự cố nhưng nút \"Mở vé hỗ trợ\" không hiển thị, bạn có thể mở vé hỗ trợ thủ công bằng cách chọn giao dịch gây ra vấn đề thông qua \"Danh mục/Các giao dịch mở\" và gõ tổ hợp phím \"alt + o\" hoặc \"option + o\". Vui lòng chỉ sử dụng khi bạn chắc chắn phần mềm không làm việc như bình thường. Nếu bạn gặp vấn đề khi sử dụng Bisq hoặc có bất cứ thắc mắc nào, vui lòng xem lại FAQ tại trang web bisq.network hoặc đăng lên diễn đàn Bisq ở phần hỗ trợ.
-support.initialInfo=Vui lòng nhập phần mô tả vấn đề của bạn trong hộp văn bản dưới đây. Bao gồm càng nhiều thông tin càng tốt để đẩy nhanh thời gian giải quyết tranh chấp. \n\nĐây là danh sách kiểm tra các thông tin mà bạn nên cung cấp:\n\t● Nếu như bạn là người mua BTC: Bạn đã thực hiện giao dịch chuyển tiền pháp định hay là Altcoin chưa? Nếu rồi, bạn đã nhấp chuột vào nút 'đã gửi tiền' trong ứng dụng hay chưa? \n\t● Nếu bạn là người bán BTC: Bạn đã nhận tiền pháp định hay Altcoin hay chưa? Nếu rồi, bạn đã nhấp chuột vào nút 'đã nhận tiền' trong ứng dụng hay chưa? \n\t● Bạn đang sử dụng phiên bản nào của Bisq?\n\t● Nếu như bạn gặp vấn đề với giao dịch thất bại, xin vui lòng chuyển qua danh mục dữ liệu mới.\n\t Đôi khi danh mục dữ liệu bị hỏng và dẫn tới các lỗi lạ. \n\tXem tại: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nVui lòng tham khảo các quy định cơ bản trong quá trình tranh chấp:\n\t● Bạn cần trả lời yêu cầu của trọng tài trong vòng 2 ngày.\n\t● Thời gian tối đa cho một lần tranh chấp là 14 ngày. \n\t● Bạn cần phải hợp tác với trọng tài và cung cấp thông tin họ yêu cầu để giải quyết trường hợp của bạn. \n\t● Khi bạn khởi động ứng dụng lần đầu tiên là bạn đã chấp nhận các quy định được nêu ra trong tài liệu về giải quyết tranh chấp trong thỏa thuận người dùng. \n\nBạn có thể tham khảo thêm về quy trình giải quyết tranh chấp tại: https://bisq.network/docs/exchange/arbitration-system
+support.backgroundInfo=Bisq is not a company, so it handles disputes differently.\n\nTraders can communicate within the application via a secure chat on the open trades screen to attempt solving a dispute on their own. If that is not sufficient, a mediator can step in to help. The mediator will evaluate the situation and give a recommendation for the payout of the trade funds. If both traders accept this suggestion, the payout transaction is completed and the trade is closed. If one or both traders do not agree to the mediator's recommended payout, they can request arbitration.The arbitrator has the third key of the deposit transaction and will make the payout based on their findings.
+support.initialInfo=Please enter a description of your problem in the text field below. Add as much information as possible to speed up dispute resolution time.\n\nHere is a check list for information you should provide:\n\t● If you are the BTC buyer: Did you make the Fiat or Altcoin transfer? If so, did you click the 'payment started' button in the application?\n\t● If you are the BTC seller: Did you receive the Fiat or Altcoin payment? If so, did you click the 'payment received' button in the application?\n\t● Which version of Bisq are you using?\n\t● Which operating system are you using?\n\t● If you encountered an issue with failed transactions please consider switching to a new data directory.\n\t Sometimes the data directory gets corrupted and leads to strange bugs. \n\t See: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPlease make yourself familiar with the basic rules for the dispute process:\n\t● You need to respond to the {0}''s requests within 2 days.\n\t● Mediators respond in between 2 days. Arbitrators respond in between 5 business days.\n\t● The maximum period for a dispute is 14 days.\n\t● You need to cooperate with the {1} and provide the information they request to make your case.\n\t● You accepted the rules outlined in the dispute document in the user agreement when you first started the application.\n\nYou can read more about the dispute process at: {2}
support.systemMsg=Tin nhắn hệ thống: {0}
support.youOpenedTicket=Bạn đã mở yêu cầu hỗ trợ.\n\n{0}\n\nPhiên bản Bisq: {1}
support.youOpenedDispute=Bạn đã mở yêu cầu giải quyết tranh chấp.\n\n{0}\n\nPhiên bản Bisq: {1}
-support.peerOpenedTicket=Đối tác giao dịch của bạn đã yêu cầu hỗ trợ vì vấn đề kỹ thuật.\n\n{0}
-support.peerOpenedDispute=Đối tác giao dịch của bạn đã yêu cầu khiếu nại.\n\n{0}
+support.youOpenedDisputeForMediation=You requested mediation.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedTicket=Your trading peer has requested support due to technical problems.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDispute=Your trading peer has requested a dispute.\n\n{0}\n\nBisq version: {1}
+support.peerOpenedDisputeForMediation=Your trading peer has requested mediation.\n\n{0}\n\nBisq version: {1}
+support.mediatorsDisputeSummary=System message:\nMediator''s dispute summary:\n{0}
+support.mediatorsAddress=Mediator''s node address: {0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=Bổ sung altcoin
setting.preferences.displayOptions=Hiển thị các phương án
setting.preferences.showOwnOffers=Hiển thị Báo giá của tôi trong danh mục Báo giá
setting.preferences.useAnimations=Sử dụng hoạt ảnh
+setting.preferences.useDarkMode=Use dark mode (beta)
setting.preferences.sortWithNumOffers=Sắp xếp danh sách thị trường với số chào giá/giao dịch
setting.preferences.resetAllFlags=Cài đặt lại tất cả nhãn \"Không hiển thị lại\"
setting.preferences.reset=Cài đặt lại
@@ -852,7 +923,7 @@ settings.preferences.selectCurrencyNetwork=Chọn mạng
setting.preferences.daoOptions=Tùy chọn DAO
setting.preferences.dao.resync.label=Tái dựng trạng thái DAO từ giao dịch genesis
setting.preferences.dao.resync.button=Đồng bộ lại
-setting.preferences.dao.resync.popup=Sau khi khởi động lại ứng dụng, dữ liệu quản trị mạng P2P sẽ được tải lại từ seed nodes và trạng thái đồng bộ của BSQ sẽ được thành lập lại từ giao dịch genesis.
+setting.preferences.dao.resync.popup=After an application restart the Bisq 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=Chạy ứng dụng Bisq như một full node DAO
setting.preferences.dao.rpcUser=Tên người dùng RPC
setting.preferences.dao.rpcPw=Mật khẩu RPC
@@ -862,7 +933,7 @@ setting.preferences.dao.fullNodeInfo.ok=Mở trang docs
setting.preferences.dao.fullNodeInfo.cancel=Không, tôi sẽ tiếp tục dùng chế độ lite node
settings.net.btcHeader=Mạng Bitcoin
-settings.net.p2pHeader=Mạng P2P
+settings.net.p2pHeader=Bisq network
settings.net.onionAddressLabel=Địa chỉ onion của tôi
settings.net.btcNodesLabel=Sử dụng nút Bitcoin Core thông dụng
settings.net.bitcoinPeersLabel=Các đối tác được kết nối
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=Đã nhận
settings.net.peerTypeColumn=Kiểu đối tác
settings.net.openTorSettingsButton=Mở cài đặt Tor
+settings.net.versionColumn=Version
+settings.net.subVersionColumn=Subversion
+settings.net.heightColumn=Height
+
settings.net.needRestart=Bạn cần khởi động lại ứng dụng để thay đổi.\nBạn có muốn khởi động bây giờ không?
settings.net.notKnownYet=Chưa biết...
settings.net.sentReceived=Đã gửi: {0}, đã nhận: {1}
@@ -928,9 +1003,11 @@ setting.about.subsystems.val=Phiên bản mạng: {0}; Phiên bản tin nhắn P
####################################################################
account.tab.arbitratorRegistration=Đăng ký trọng tài
+account.tab.mediatorRegistration=Mediator registration
+account.tab.refundAgentRegistration=Refund agent registration
account.tab.account=Tài khoản
account.info.headline=Chào mừng đến với tài khoản Bisq của bạn
-account.info.msg=Ở đây bạn có thể thiết lập tài khoản giao dịch cho tiền tệ quốc gia & altcoin, lựa chọn trọng tài và sao lưu dữ liệu ví & tài khoản của bạn.\n\nMột ví Bitcoin mới được tạo khi bạn khởi động Bisq lần đầu tiên.\nChúng tôi khuyến khích bạn viết lại các từ khóa khởi tạo ví Bitcoin của bạn (xem thẻ bên trên) và cân nhắc để thêm mật khẩu trước khi nộp tiền. Tiền gửi và rút Bitcoin được quản lý trong phần \"Số tiền\".\n\nGhi chú về Quyền riêng tư & Bảo mật:\nBởi vì Bisq là một sàn giao dịch phi tập trung, tất cả dữ liệu của bạn được lưu trữ trong máy tính. Không có máy chủ vì vậy chúng tôi không có quyền truy cập thông tin cá nhân, số tiền hay thậm chí địa chỉ IP của bạn. Các dữ liệu như số tài khoản ngân hàng, địa chỉ altcoin & Bitcoin, vv... chỉ được chia sẻ với Đối tác giao dịch của bạn để thực hiện giao dịch bạn khởi tạo (trong trường hợp có khiếu nại, trọng tài sẽ xem dữ liệu tương tự như Đối tác giao dịch của bạn).
+account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer).
account.menu.paymentAccount=Tài khoản tiền tệ quốc gia
account.menu.altCoinsAccountView=Tài khoản Altcoin
@@ -939,42 +1016,39 @@ account.menu.seedWords=Mã sao lưu dự phòng ví
account.menu.backup=Dự phòng
account.menu.notifications=Thông báo
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=Public key (địa chỉ ví)
-account.arbitratorRegistration.register=Đăng ký trọng tài
-account.arbitratorRegistration.revoke=Hủy bỏ đăng ký
-account.arbitratorRegistration.info.msg=Lưu ý rằng bạn cần phải luôn sẵn sàng trong 15 ngày sau khi hủy vì có thể có giao dịch mà bạn đóng vai trò là trọng tài. Thời gian cho phép tối đa cho giao dịch là 8 ngày và quá trình khiếu nại có thể mất 7 ngày.
+account.arbitratorRegistration.register=Register
+account.arbitratorRegistration.registration={0} registration
+account.arbitratorRegistration.revoke=Hủy
+account.arbitratorRegistration.info.msg=Please note that you need to stay available for 15 days after revoking as there might be trades which are using you as {0}. The max. allowed trade period is 8 days and the dispute process might take up to 7 days.
account.arbitratorRegistration.warn.min1Language=Bạn cần cài đặt ít nhất 1 ngôn ngữ.\nChúng tôi thêm ngôn ngữ mặc định cho bạn.
-account.arbitratorRegistration.removedSuccess=Bạn đã gỡ bỏ thành công trọng tài của bạn ra khỏi mạng P2P.
-account.arbitratorRegistration.removedFailed=Không thể gỡ bỏ trọng tài.{0}
-account.arbitratorRegistration.registerSuccess=Bạn đã đăng ký thành công trọng tài của bạn vào mạng P2P.
-account.arbitratorRegistration.registerFailed=Không thể đăng ký trọng tài.{0}
-
-account.arbitratorSelection.minOneArbitratorRequired=Bạn cần cài đặt ít nhất 1 ngôn ngữ.\nChúng tôi thêm ngôn ngữ mặc định cho bạn.
-account.arbitratorSelection.whichLanguages=Bạn nói ngôn ngữ nào?
-account.arbitratorSelection.whichDoYouAccept=Bạn chấp nhận trọng tài nào
-account.arbitratorSelection.autoSelect=Tự động chọn trọng tài với ngôn ngữ phù hợp
-account.arbitratorSelection.regDate=Ngày đăng ký
-account.arbitratorSelection.languages=Ngôn ngữ
-account.arbitratorSelection.cannotSelectHimself=Trọng tài không thể tự chọn mình để giao dịch.
-account.arbitratorSelection.noMatchingLang=Ngôn ngữ không phù hợp.
-account.arbitratorSelection.noLang=Bạn chỉ có thể chọn trọng tài nói ít nhất 1 ngôn ngữ chung.
-account.arbitratorSelection.minOne=Bạn cần có ít nhất một trọng tài được chọn.
+account.arbitratorRegistration.removedSuccess=You have successfully removed your registration from the Bisq network.
+account.arbitratorRegistration.removedFailed=Could not remove registration.{0}
+account.arbitratorRegistration.registerSuccess=You have successfully registered to the Bisq network.
+account.arbitratorRegistration.registerFailed=Could not complete registration.{0}
account.altcoin.yourAltcoinAccounts=Tài khoản altcoin của bạn
-account.altcoin.popup.wallet.msg=Hãy chắc chắn bạn tuân thủ các yêu cầu để sử dụng ví {0} như quy định tại trang web {1}.\nSử dụng ví từ tổng đài giao dịch phân quyền nơi bạn (a) không được kiểm soát khóa của bạn hoặc (b) những sàn không sử dụng phần mềm ví tương thích đều rất mạo hiểm: việc này có thể dẫn đến mất số tiền đã giao dịch!\nTrọng tài không phải là một chuyên gia {2} và không thể giúp bạn trong những trường hợp như thế này.
+account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases.
account.altcoin.popup.wallet.confirm=Tôi hiểu và xác nhận rằng tôi đã biết loại ví mình cần sử dụng.
-account.altcoin.popup.arq.msg=Để giao dịch ARQ trên Bisq, bạn phải hiểu và tuân thủ các yêu cầu sau:\n\nĐể gửi ARQ, bạn cần sử dụng hoặc là ví ArQmA GUI chính thức hoặc ví ArQmA CLI với nhãn luu-thongtin-tx được kích hoạt (mặc định trong phiên bản mới). Chắc chắn rằng bạn có thể truy cập khóa tx vì điều này là cần thiết trong trường hợp khiếu nại.\nví-arqma-cli (dùng lệnh get_tx_key) \nví-arqma-gui (đi đến tab lịch sử và nhấp vào nút (P) để lấy bằng chứng thanh toán)\n\nGiao dịch chuyển tiền không thể được xác minh trên các blockexplorer thông thường.\n\nTrong trường hợp tranh chấp bạn cần phải cung cấp cho trọng tài các thông tin sau: \n- Khóa tx riêng\n- Hash của giao dịch\n- Địa chỉ công cộng của người nhận\n\nNếu không cung cấp các dữ liệu trên hoặc nếu bạn sử dụng ví không thích hợp sẽ dẫn tới thua trong vụ khiếu nại. Người gửi ARQ chịu trách nhiệm xác minh chuyển khoản ARQ cho trọng tài trong trường hợp khiếu nại.\n\nKhông cần có ID thanh toán, chỉ cần địa chỉ công cộng thông thường.\nNếu bạn không chắc chắn về quy trình này, truy cập kênh discord của ArQmA (https://discord.gg/s9BQpJT) hoặc diễn đàn ArQmA (https://labs.arqma.com) để biết thêm thông tin.
-account.altcoin.popup.xmr.msg=Để giao dịch XMR trên Bisq, bạn phải hiểu và tuân thủ các yêu cầu sau:\n\nĐể gửi XMR, bạn cần sử dụng hoặc là ví Monero GUI chính thức hoặc ví Monero CLI với nhãn luu-thongtin-tx được kích hoạt (mặc định trong phiên bản mới). Chắc chắn rằng bạn có thể truy cập khóa tx vì điều này là cần thiết trong trường hợp khiếu nại.\nví-monero-cli (dùng lệnh get_tx_key) \nví-monero-gui (đi đến tab lịch sử và nhấp vào nút (P) để lấy bằng chứng thanh toán)\n\nNgoài công cụ kiểm tra giao dịch XMR (https://xmr.llcoins.net/checktx.html) việc xác minh cũng có thể được thực hiện ngay trên ví.\nví-monero-cli: dùng lệnh (check_tx_key).\nví-monero-gui: ở trên Nâng cao>trang Chứng minh/Kiểm tra.\nVới những block explorer thông thường, chuyển khoản không thể xác minh được.\n\nBạn cần cung cấp cho trọng tài các dữ liệu sau trong trường hợp khiếu nại:\n- Khóa tx riêng\n- Hash của giao dịch\n- Địa chỉ công cộng của người nhận\n\nNếu không cung cấp các dữ liệu trên hoặc nếu bạn sử dụng ví không thích hợp sẽ dẫn tới thua trong vụ khiếu nại. Người gửi XMR chịu trách nhiệm xác minh chuyển khoản XMR cho trọng tài trong trường hợp khiếu nại.\n\nKhông cần có ID thanh toán, chỉ cần địa chỉ công cộng thông thường.\nNếu bạn không chắc chắn về quy trình này, truy cập (https://www.getmonero.org/resources/user-guides/prove-payment.html) hoặc diễn đàn Monero (https://forum.getmonero.org) để tìm thêm thông tin.
-account.altcoin.popup.blur.msg=Để giao dịch BLUR trên Bisq, bạn phải hiểu và tuân thủ các yêu cầu sau:\n\nĐể gửi BLUR, bạn cần sử dụng ví CLI hoặc GUI của mạng BLUR. \n\nNếu bạn sử dụng ví CLI, sau khi chuyển tiền, ví sẽ hiển thị một mã giao dịch (tx ID). Bạn phải lưu thông tin này lại. Ngay sau khi chuyển tiền, bạn phải dùng lệnh 'get_tx_key' để lấy khóa riêng của giao dịch. Nếu bạn không thực hiện bước này, rất có thể sau này bạn sẽ không lấy được khóa giao dịch nữa. \n\nNếu bạn sử dụng ví GUI của mạng BLUR, khóa riêng giao dịch và tx ID sẽ được hiển thị ngay trên tab "Lịch sử". Ngay sau khi chuyển tiền, xác định vị trí của giao dịch mà bạn quan tâm. Nhấp chuột vào biểu tượng "?" ở góc phải bên dưới của hộp chứa giao dịch. Bạn cần phải lưu thông tin này lại. \n\nTrường hợp tranh chấp, bạn phải đưa ra cho trọng tài những thông tin sau:1.) mã giao dịch, 2.) khóa riêng của giao dịch, 3.) địa chỉ ví của người nhận. Trọng tài lúc đó sẽ sử dụng Blur Transaction Viewer (https://blur.cash/#tx-viewer) để xác minh giao dịch chuyển BLUR .\n\nNếu không cung cấp các thông tin yêu cầu, bạn sẽ thua trong lần tranh chấp này. Trong tất cả mọi trường hợp tranh chấp, người chuyển BLUR chịu 100% trách nhiệm xác minh giao dịch với trọng tài.\n\nNếu bạn vẫn chưa hiểu rõ về những yêu cầu này, vui lòng vào Discord của BLUR (https://discord.gg/dMWaqVW) để được hỗ trợ.
-account.altcoin.popup.cash2.msg=Để giao dịch CASH2 trên Bisq, bạn phải hiểu và tuân thủ các yêu cầu sau:\n\nĐể gửi CASH2, bạn cần sử dụng ví Cash2 phiên bản 3 hoặc cao hơn. \n\nSau khi giao dịch được chuyển đi, ví sẽ hiển thị một ID giao dịch. Bạn phải lưu thông tin này lại ngay sau khi chuyển tiền, bạn phải dùng lệnh 'getTxKey' trong simplewallet để lấy khóa riêng của giao dịch. \n\nTrường hợp tranh chấp, bạn phải đưa ra cho trọng tài những thông tin sau:1) ID giao dịch, 2) khóa riêng của giao dịch, 3) địa chỉ ví Cash2 của người nhận. Trọng tài lúc đó sẽ sử dụng Cash2 Block Explorer (https://blocks.cash2.org) để xác minh giao dịch chuyển CASH2.\n\nNếu không cung cấp các thông tin yêu cầu, bạn sẽ thua trong lần tranh chấp này. Trong tất cả mọi trường hợp tranh chấp, người chuyển CASH2 chịu 100% trách nhiệm xác minh giao dịch với trọng tài.\n\nNếu bạn vẫn chưa hiểu rõ về những yêu cầu này, vui lòng không giao dịch trên Bisq. Hãy tìm hỗ trợ trên Discord của Cash2 (https://discord.gg/FGfXAYN) trước.
-account.altcoin.popup.qwertycoin.msg=Để giao dịch Qwertycoin trên Bisq, bạn phải hiểu và tuân thủ các yêu cầu sau:\n\nĐể gửi QWC, bạn cần sử dụng ví QWC chính thức phiên bản 5.1.3 hoặc cao hơn. \n\nSau khi giao dịch được chuyển đi, ví sẽ hiển thị một ID giao dịch. Bạn phải lưu thông tin này lại ngay sau khi chuyển tiền, bạn phải dùng lệnh 'get_Tx_Key' trong simplewallet để lấy khóa riêng của giao dịch. \n\nTrường hợp tranh chấp, bạn phải đưa ra cho trọng tài những thông tin sau:1) ID giao dịch, 2) khóa riêng của giao dịch, 3) địa chỉ ví QWC của người nhận. Trọng tài lúc đó sẽ sử dụng QWC Block Explorer (https://explorer.qwertycoin.org) để xác minh giao dịch chuyển QWC.\n\nNếu không cung cấp các thông tin yêu cầu trên cho trọng tài, bạn sẽ thua trong lần tranh chấp này. Trong tất cả mọi trường hợp tranh chấp, người chuyển QWC chịu 100% trách nhiệm xác minh giao dịch với trọng tài.\n\nNếu bạn vẫn chưa hiểu rõ về những yêu cầu này, vui lòng không giao dịch trên Bisq. Hãy tìm hỗ trợ trên Discord của QWC (https://discord.gg/rUkfnpC) trước.
-account.altcoin.popup.drgl.msg=Để giao dịch Dragonglass trên Bisq, bạn cần phải hiểu và tuân thủ các yêu cầu sau:\n\nĐể đảm bảo tính riêng tư, những giao dịch do Dragonglass cung cấp không thể xác minh bằng blockchain công cộng. Nếu được yêu cầu, bạn có thể chứng minh giao dịch thanh toán của bạn bằng cách sử dụng khóa-riêng-TXN.\nKhóa riêng-TXN là khóa dùng một lần được tạo tự động cho mỗi giao dịch và chỉ có thể truy cập thông qua ví DRGL của bạn. \nDù là giao dịch được thực hiện trên ví DRGL GUI (trong hội thoại chi tiết giao dịch) hay bằng ví giản đơn Dragonglass CLI (dùng lệnh "get_tx_key"), thì đều cần phải có phiên bản Dragonglass 'Oathkeeper' hoặc cao hơn.\n\nTrường hợp tranh chấp, bạn cần phải cung cấp cho trọng tài những dữ liệu sau:\n- Khóa riêng-TXN\n- Mã giao dịch\n- Địa chỉ công cộng của người nhận\n\nViệc xác minh có thể được thực hiện bằng cách sử dụng những thông tin ở trên làm dữ liệu nhập tại (http://drgl.info/#check_txn).\n\nNếu không cung cấp các thông tin trên, hoặc nếu bạn sử dụng một ví không hợp lệ, có thể khiến bạn thua trong lần tranh chấp này. Người gửi Dragonglass chịu trách nhiệm xác minh giao dịch chuyển DRGL cho trọng tài trong trường hợp có tranh chấp. Việc sử dụng ID thanh toán không được yêu cầu. \n\nNếu như bạn vẫn chưa chắc chắn về bất cứ phần nào trong quá trình này,liên hệ Dragonglass trên Discord (http://discord.drgl.info) để được hỗ trợ.
-account.altcoin.popup.ZEC.msg=Khi sử dụng Zcash bạn chỉ có thể sử dụng địa chỉ rõ ràng (bắt đầu bằng t) không phải địa chỉ z (riêng tư), vì trọng tài sẽ không thể xác minh giao dịch với địa chỉ z.
-account.altcoin.popup.XZC.msg=Khi sử dụng Zcoin bạn chỉ có thể sử dụng địa chỉ rõ ràng (có thể theo dõi) chứ không phải địa chỉ không thể theo dõi, vì trọng tài không thể xác minh giao dịch với địa chỉ không thể theo dõi tại một block explorer.
+account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information.
+account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information.
+account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending XMR, you need to use either the official Monero GUI wallet or Monero CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nmonero-wallet-cli (use the command get_tx_key)\nmonero-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nIn addition to XMR checktx tool (https://xmr.llcoins.net/checktx.html) verification can also be accomplished in-wallet.\nmonero-wallet-cli : using command (check_tx_key).\nmonero-wallet-gui : on the Advanced > Prove/Check page.\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The XMR sender is responsible for providing verification of the XMR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit (https://www.getmonero.org/resources/user-guides/prove-payment.html) or the Monero forum (https://forum.getmonero.org) to find more information.
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs).
+account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW).
+account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/).
+account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN).
+account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC).
+account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help.
+account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses.
+account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer.
account.altcoin.popup.grin.msg=GRIN yêu cầu một quá trình tương tác giữa người gửi và người nhận để thực hiện một giao dịch. Vui lòng làm theo hướng dẫn từ trang web của dự án GRIN để gửi và nhận GRIN đúng cách. (người nhận cần phải trực tuyến hoặc ít nhất là trực tuyến trong một khung thời gian nhất định).\n\nBisq chỉ hỗ trợ ví Grinbox(wallet713) theo định dạng URL.\n\nNgười gửi GRIN phải cung cấp bằng chứng là họ đã gửi GRIN thành công. Nếu ví không thể cung cấp bằng chứng đó, nếu có tranh chấp thì sẽ được giải quyết theo hướng có lợi cho người nhận GRIN. Vui lòng đảm bảo rằng bạn sử dụng phần mềm Grinbox mới nhất có hỗ trợ bằng chứng giao dịch và bạn hiểu quy trình chuyển và nhận GRIN cũng như tạo bằng chứng. \n\nXem https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only để biết thêm thông tin về công cụ bằng chứng Grinbox.
account.altcoin.popup.beam.msg=BEAM yêu cầu một quá trình tương tác giữa người gửi và người nhận để thực hiện một giao dịch. \n\nVui lòng làm theo hướng dẫn từ trang web của dự án BEAM để gửi và nhận BEAM đúng cách. (người nhận cần phải trực tuyến hoặc ít nhất là trực tuyến trong một khung thời gian nhất định).\n\nNgười gửi BEAM phải cung cấp bằng chứng là họ đã gửi BEAM thành công. Vui lòng đảm bảo là bạn sử dụng phần mềm ví có thể tạo ra một bằng chứng như vậy. Nếu ví không thể cung cấp bằng chứng đó, nếu có tranh chấp thì sẽ được giải quyết theo hướng có lợi cho người nhận BEAM.
-account.altcoin.popup.pars.msg=Để giao dịch ParsiCoin trên Bisq, bạn phải hiểu và tuân thủ các yêu cầu sau:\n\nĐể gửi PARS, bạn cần sử dụng ví ParsiCoin chính thức phiên bản 3.0.0 hoặc cao hơn. \n\nBạn có thể kiểm tra Hash giao dịch và khóa giao dịch ở phần Các Giao Dịch trên ví GUI của bạn (ParsiPay). Bạn phải nhấp chuột phải vào Giao dịch rồi nhấp vào hiển thị chi tiết. \n\nTrường hợp tranh chấp, bạn phải đưa ra cho trọng tài những thông tin sau:1) Hash giao dịch, 2) khóa của giao dịch, 3) địa chỉ ví PARS của người nhận. Trọng tài lúc đó sẽ sử dụng ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment) để xác minh giao dịch chuyển PARS.\n\nNếu không cung cấp các thông tin yêu cầu trên cho trọng tài, bạn sẽ thua trong lần tranh chấp này. Trong tất cả mọi trường hợp tranh chấp, người chuyển ParsiCoin chịu 100% trách nhiệm xác minh giao dịch với trọng tài.\n\nNếu bạn vẫn chưa hiểu rõ về những yêu cầu này, vui lòng không giao dịch trên Bisq. Hãy tìm hỗ trợ trên Discord của ParsiCoin (https://discord.gg/c7qmFNh) trước.
+account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh).
+
+account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash.
account.fiat.yourFiatAccounts=Các tài khoản tiền tệ quốc gia của bạn
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=Yếu tố đơn vị của vai trò đảm bảo t
dao.param.ISSUANCE_LIMIT=Giới hạn phát hành trên mỗi vòng tính bằng BSQ
dao.param.currentValue=Giá trị hiện tại: {0}
+dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1})
dao.param.blocks={0} khối
dao.results.cycle.duration.label=Thời lượng {0}
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} (các) khối
dao.results.cycle.value.postFix.isDefaultValue=(giá trị mặc định)
dao.results.cycle.value.postFix.hasChanged=(đã được thay đổi qua bỏ phiếu)
-dao.results.invalidVotes=Chống tôi có các phiếu bầu không hợp lệ trong vòng bầu chọn đó. Điều này có thể xảy ra nếu phiếu bầu không được phân tán tốt trong mạng P2P.\n{0}
+dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=Không xác định
@@ -1503,7 +1578,7 @@ dao.proposal.create.publish=Công bố đề xuất
dao.proposal.create.publishing=Đang tiến hành công bố đề xuất...
dao.proposal=đề xuất
dao.proposal.display.type=Kiểu đề xuất
-dao.proposal.display.name=Tên/nickname
+dao.proposal.display.name=Exact GitHub username
dao.proposal.display.link=Link to detailed info
dao.proposal.display.link.prompt=Link to proposal
dao.proposal.display.requestedBsq=Số lượng yêu cầu tính theo BSQ
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=phiếu bầu hiện tại: ''{0}''.
dao.proposal.display.myVote.accepted=Chấp nhận
dao.proposal.display.myVote.rejected=Từ chối
dao.proposal.display.myVote.ignored=Bỏ qua
-dao.proposal.myVote.summary=Đã bầu: {0}; Sức nặng phiếu bầu: {1} (kiếm được: {2} + cược: {3});
+dao.proposal.display.myVote.unCounted=Vote was not included in result
+dao.proposal.myVote.summary=Voted: {0}; Vote weight: {1} (earned: {2} + stake: {3}) {4}
dao.proposal.myVote.invalid=Phiếu bầu không hợp lệ
dao.proposal.voteResult.success=Chấp nhận
@@ -1680,6 +1756,7 @@ dao.monitor.daoState.utxoConflicts=Xung đột đầu ra giao dịch chưa sử
dao.monitor.daoState.utxoConflicts.blockHeight=Chiều cao khối: {0}
dao.monitor.daoState.utxoConflicts.sumUtxo=Tỏng đầu ra giao dịch chưa sử dụng: {0} BSQ
dao.monitor.daoState.utxoConflicts.sumBsq=Tổng BSQ: {0} BSQ
+dao.monitor.daoState.checkpoint.popup=DAO state is not in sync with the network. After restart the DAO state will resync.
dao.monitor.proposal.headline=Trạng thái đề xuất
dao.monitor.proposal.table.headline=Chuỗi Hash trạng thái đề xuất
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=Giao dịch BSQ
dao.factsAndFigures.dashboard.marketPrice=Dữ liệu thị trường
dao.factsAndFigures.dashboard.price=Giá giao dịch BSQ/BTC gần nhất (tính bằng BSQ)
+dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price
+dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price
dao.factsAndFigures.dashboard.marketCap=Vốn hóa thị trường (dựa trên giá giao dịch)
dao.factsAndFigures.dashboard.availableAmount=Tổng lượng BSQ hiện có
@@ -1769,10 +1848,6 @@ displayUpdateDownloadWindow.download.openDir=Mở thư mục download
disputeSummaryWindow.title=Tóm tắt
disputeSummaryWindow.openDate=Ngày mở đơn
disputeSummaryWindow.role=Vai trò của người giao dịch
-disputeSummaryWindow.evidence=Bằng chứng
-disputeSummaryWindow.evidence.tamperProof=Bằng chứng chống giả mạo
-disputeSummaryWindow.evidence.id=Xác minh ID
-disputeSummaryWindow.evidence.video=Video/Phản chiếu hình ảnh
disputeSummaryWindow.payout=Khoản tiền giao dịch hoàn lại
disputeSummaryWindow.payout.getsTradeAmount=BTC {0} nhận được khoản tiền giao dịch hoàn lại
disputeSummaryWindow.payout.getsAll=BTC {0} nhận tất cả
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=Ngân hàng
disputeSummaryWindow.summaryNotes=Lưu ý tóm tắt
disputeSummaryWindow.addSummaryNotes=Thêm lưu ý tóm tắt
disputeSummaryWindow.close.button=Đóng đơn
-disputeSummaryWindow.close.msg=Vé đã đóng trên {0}\n\nTóm tắt:\n{1} bằng chứng chống làm giả đã được chuyển: {2}\n{3} xác minh ID: {4}\n{5} phản chiếu hình ảnh hoặc video: {6}\nSố tiền hoàn trả cho người mua BTC: {7}\nSố tiền hoàn trả cho người bán BTC: {8}\n\nChú ý tóm tắt:\n{9}
+disputeSummaryWindow.close.msg=Ticket closed on {0}\n\nSummary:\nPayout amount for BTC buyer: {1}\nPayout amount for BTC seller: {2}\n\nSummary notes:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\nNext steps:\nOpen ongoing trade and accept or reject the suggested mediation
disputeSummaryWindow.close.closePeer=Bạn cũng cần phải đóng Đơn Đối tác giao dịch!
+disputeSummaryWindow.close.txDetails.headline=Publish refund transaction
+disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n
+disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction?
emptyWalletWindow.headline=Công cụ ví khẩn cấp
emptyWalletWindow.info=Vui lòng chỉ sử dụng trong trường hợp khẩn cấp nếu bạn không thể truy cập vốn của bạn từ UI.\n\nLưu ý rằng tất cả Báo giá mở sẽ được tự động đóng khi sử dụng công cụ này.\n\nTrước khi sử dụng công cụ này, vui lòng sao lưu dự phòng thư mục dữ liệu của bạn. Bạn có thể sao lưu tại \"Tài khoản/Sao lưu dự phòng\".\n\nVui lòng báo với chúng tôi vấn đề của bạn và lập báo cáo sự cố trên GitHub hoặc diễn đàn Bisq để chúng tôi có thể điều tra điều gì gây nên vấn đề đó.
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=Bạn có chào giá mở sẽ được gỡ b
emptyWalletWindow.openOffers.yes=Vâng, tôi chắc chắn
emptyWalletWindow.sent.success=Số dư trong ví của bạn đã được chuyển thành công.
-enterPrivKeyWindow.headline=Đăng ký chỉ mở cho các trọng tài được mời
+enterPrivKeyWindow.headline=Enter private key for registration
filterWindow.headline=Chỉnh sửa danh sách lọc
filterWindow.offers=Chào giá đã lọc (cách nhau bằng dấu phẩy)
@@ -1815,6 +1895,8 @@ filterWindow.accounts=Dữ liệu tài khoản giao dịch đã lọc:\nĐịnh
filterWindow.bannedCurrencies=Mã tiền tệ đã lọc (cách nhau bằng dấu phẩy)
filterWindow.bannedPaymentMethods=ID phương thức thanh toán đã lọc (cách nhau bằng dấu phẩy)
filterWindow.arbitrators=Các trọng tài đã lọc (địa chỉ onion cách nhau bằng dấu phẩy)
+filterWindow.mediators=Filtered mediators (comma sep. onion addresses)
+filterWindow.refundAgents=Filtered refund agents (comma sep. onion addresses)
filterWindow.seedNode=Node cung cấp thông tin đã lọc (địa chỉ onion cách nhau bằng dấu phẩy)
filterWindow.priceRelayNode=nút rơle giá đã lọc (địa chỉ onion cách nhau bằng dấu phẩy)
filterWindow.btcNode=nút Bitcoin đã lọc (địa chỉ cách nhau bằng dấu phẩy + cửa)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(ID/BIC/SWIFT ngân hàng của người tạo)
offerDetailsWindow.offerersBankName=(tên ngân hàng của người tạo)
offerDetailsWindow.bankId=ID ngân hàng (VD: BIC hoặc SWIFT)
offerDetailsWindow.countryBank=Quốc gia ngân hàng của người tạo
-offerDetailsWindow.acceptedArbitrators=Các trọng tài được chấp nhận
offerDetailsWindow.commitment=Cam kết
offerDetailsWindow.agree=Tôi đồng ý
offerDetailsWindow.tac=Điều khoản và điều kiện
@@ -1883,6 +1964,7 @@ tradeDetailsWindow.tradeDate=Ngày giao dịch
tradeDetailsWindow.txFee=Phí đào
tradeDetailsWindow.tradingPeersOnion=Địa chỉ onion Đối tác giao dịch
tradeDetailsWindow.tradeState=Trạng thái giao dịch
+tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
walletPasswordWindow.headline=Nhập mật khẩu để mở khóa
@@ -1945,10 +2027,11 @@ popup.warning.incompatibleDB=Chúng tôi phát hiện ra file dữ liệu không
popup.warning.startupFailed.twoInstances=Bisq đã chạy. Bạn không thể chạy hai chương trình Bisq.
popup.warning.cryptoTestFailed=Có vẻ bạn sử dụng hệ nhị phân tự soạn và không tuân thủ hướng dẫn thiết kế tại https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nNếu không phải và bạn sử dụng hệ nhị phân Bisq chính thức, vui lòng lập báo cáo sự cố và gửi về trang GitHub.\nLỗi={0}
popup.warning.tradePeriod.halfReached=giao dịch của bạn với ID {0} đã qua một nửa thời gian giao dịch cho phép tối đa và vẫn chưa hoàn thành.\n\nThời gian giao dịch kết thúc vào {1}\n\nVui lòng kiểm tra trạng thái giao dịch của bạn tại \"Portfolio/Các giao dịch mở\" để biết thêm thông tin.
-popup.warning.tradePeriod.ended=giao dịch của bạn với ID {0} đã qua một nửa thời gian giao dịch cho phép tối đa và vẫn chưa hoàn thành.\n\nThời gian giao dịch đã kết thúc vào {1}\n\nVui lòng kiểm tra giao dịch của bạn tại \"Portfolio/Các giao dịch mở\" để liên hệ với trọng tài.
+popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
popup.warning.noTradingAccountSetup.headline=Bạn chưa thiết lập tài khoản giao dịch
popup.warning.noTradingAccountSetup.msg=Bạn cần thiết lập tiền tệ quốc gia hoặc tài khoản altcoin trước khi tạo Báo giá.\nDBạn có muốn thiết lập tài khoản?
popup.warning.noArbitratorsAvailable=Hiện không có trọng tài nào
+popup.warning.noMediatorsAvailable=There are no mediators available.
popup.warning.notFullyConnected=Bạn cần phải đợi cho đến khi kết nối hoàn toàn với mạng.\nĐiều này mất khoảng 2 phút khi khởi động.
popup.warning.notSufficientConnectionsToBtcNetwork=Bạn cần phải đợi cho đến khi bạn có ít nhất {0} kết nối với mạng Bitcoin.
popup.warning.downloadNotComplete=Bạn cần phải đợi cho đến khi download xong các block Bitcoin còn thiếu.
@@ -1958,13 +2041,13 @@ popup.warning.examplePercentageValue=Vui lòng nhập số phần trăm như \"5
popup.warning.noPriceFeedAvailable=Không có giá cung cấp cho tiền tệ này. Bạn không thể sử dụng giá dựa trên tỷ lệ.\nVui lòng chọn giá cố định.
popup.warning.sendMsgFailed=Gửi tin nhắn Đối tác giao dịch không thành công.\nVui lòng thử lại và nếu tiếp tục không thành công thì báo cáo sự cố.
popup.warning.insufficientBtcFundsForBsqTx=Bạn không có đủ vốn BTC để thanh toán phí đào cho giao dịch BSQ này.\nVui lòng nộp tiền vào ví BTC của bạn để có thể chuyển giao BSQ.\nSố tiền còn thiếu: {0}
-popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
-popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the Bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}.
+popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the Bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}.
popup.warning.insufficientBsqFundsForBtcFeePayment=Bạn không đủ BSQ để thanh toán phí giao dịch bằng BSQ. Bạn có thể thanh toán phí bằng BTC hoặc nạp tiền vào ví BSQ của bạn. Bạn có thể mua BSQ tại Bisq.\nSố BSQ còn thiếu: {0}
popup.warning.noBsqFundsForBtcFeePayment=Ví BSQ của bạn không đủ tiền để trả phí giao dịch bằng BSQ.
popup.warning.messageTooLong=Tin nhắn của bạn vượt quá kích cỡ tối đa cho phép. Vui lòng gửi thành nhiều lần hoặc tải lên mạng như https://pastebin.com.
-popup.warning.lockedUpFunds=Bạn đã khóa vốn của giao dịch không thành công.\nSố dư bị khóa: {0} \nĐịa chỉ tx tiền gửi: {1}\nID giao dịch: {2}.\n\nVui lòng mở vé hỗ trợ bằng cách mở giao dịch trong màn hình các giao dịch chưa xử lý và nhấn \"alt + o\" hoặc \"option + o\"."
+popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"."
popup.warning.nodeBanned=Một trong {0} Node đã bị chấm. Vui lòng khởi động lại ứng dụng để chắc chắn không kết nối với các Node bị cấm.
popup.warning.priceRelay=rơle giá
@@ -1993,19 +2076,36 @@ popup.shutDownInProgress.msg=Tắt ứng dụng sẽ mất vài giây.\nVui lòn
popup.attention.forTradeWithId=Cần chú ý khi giao dịch có ID {0}
-popup.roundedFiatValues.headline=Tính năng bảo mật mới: Giá trị tiền pháp định đã làm tròn
-popup.roundedFiatValues.msg=Để tăng tính bảo mật, lượng {0} đã được làm tròn.\n\nTùy vào bạn đang sử dụng phiên bản nào của ứng dụng mà bạn sẽ phải trả hay nhận được hoặc là giá trị thập phân hoặc là giá trị đã làm tròn. \n\nCả hai giá trị này từ đây sẽ tuân theo giao thức giao dịch.\n\nCũng nên lưu ý là giá trị BTC sẽ tự động thay đổi sao cho khớp nhất có thể với lượng tiền pháp định đã được làm tròn.
-
popup.info.multiplePaymentAccounts.headline=Có sẵn nhiều tài khoản thanh toán
popup.info.multiplePaymentAccounts.msg=Bạn có sẵn nhiều tài khoản thanh toán cho chào giá này. Vui lòng đảm bảo là bạn chọn đúng tài khoản.
-popup.dao.launch.headline=Phiên bản hoàn chỉnh, đã thực hiện
-popup.dao.launch.governance.title=Đề xuất
-popup.dao.launch.governance=Mạng giao dịch của Bisq vốn đã phi tập trung.\nVới DAO Bisq, bộ phận lãnh đạo của Bisq bây giờ cũng trở thành phi tập trung, khiến Bisq rất khó bị kiểm duyệt.
-popup.dao.launch.trading.title=giao dịch
-popup.dao.launch.trading=Giao dịch BSQ(bitcoin màu) để tham gia quản trị Bisq. Bạn có thể mua và bán BSQ như bất kỳ tài sản nào khác trên Bisq.
-popup.dao.launch.cheaperFees.title=Phí rẻ hơn
-popup.dao.launch.cheaperFees=Giảm phí giao dịch tới 90% khi bạn trả bằng BSQ. Bạn vừa tiết kiệm tiền vừa có thể ủng hộ dự án!\n\n
+popup.news.launch.headline=Two Major Updates
+popup.news.launch.accountSigning.headline=ACCOUNT SIGNING
+popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer.
+popup.news.launch.ntp.headline=NEW TRADE PROTOCOL
+popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant.
+
+popup.accountSigning.selectAccounts.headline=Select payment accounts
+popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign.
+popup.accountSigning.selectAccounts.signAll=Sign all payment methods
+popup.accountSigning.selectAccounts.datePicker=Select point of time until which accounts will be signed
+
+popup.accountSigning.confirmSelectedAccounts.headline=Confirm selected payment accounts
+popup.accountSigning.confirmSelectedAccounts.description=Based on your input, {0} payment accounts will be selected.
+popup.accountSigning.confirmSelectedAccounts.button=Confirm payment accounts
+popup.accountSigning.signAccounts.headline=Confirm signing of payment accounts
+popup.accountSigning.signAccounts.description=Based on your selection, {0} payment accounts will be signed.
+popup.accountSigning.signAccounts.button=Sign payment accounts
+popup.accountSigning.signAccounts.ECKey=Enter private arbitrator key
+popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey
+
+popup.accountSigning.success.headline=Congratulations
+popup.accountSigning.success.description=All {0} payment accounts were successfully signed!
+popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0}
+popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1}
+popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0}
+popup.accountSigning.peerSigner=One of your accounts is mature enough to sign other payment accounts and the initial limit for one of your accounts has been lifted.\n\n{0}
####################################################################
# Notifications
@@ -2071,6 +2171,7 @@ list.currency.editList=Chỉnh sửa danh sách tiền tệ
table.placeholder.noItems=Hiện không có {0} nào
table.placeholder.noData=Hiện không có dữ liệu nào
+table.placeholder.processingData=Processing data...
peerInfoIcon.tooltip.tradePeer=Đối tác giao dịch
@@ -2093,7 +2194,8 @@ peerInfo.title=Thông tin đối tác
peerInfo.nrOfTrades=Số giao dịch đã hoàn thành
peerInfo.notTradedYet=Bạn chưa từng giao dịch với người dùng này.
peerInfo.setTag=Đặt nhãn cho đối tác này
-peerInfo.age=Tuổi tài khoản thanh toán
+peerInfo.age.noRisk=Tuổi tài khoản thanh toán
+peerInfo.age.chargeBackRisk=Time since signing
peerInfo.unknownAge=Tuổi chưa biết
addressTextField.openWallet=Mở ví Bitcoin mặc định của bạn
@@ -2154,7 +2256,7 @@ BTC_REGTEST=Bitcoin Regtest
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=Bitcoin DAO Testnet (không tán thành)
# suppress inspection "UnusedProperty"
-BTC_DAO_BETANET=Bitcoin DAO Betanet (Bitcoin Mainnet)
+BTC_DAO_BETANET=Bisq DAO Betanet (Bitcoin Mainnet)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=Bitcoin DAO Regtest
@@ -2253,6 +2355,7 @@ payment.accepted.banks=Các ngân hàng được chấp nhận (ID)
payment.mobile=Số điện thoại
payment.postal.address=Địa chỉ bưu điện
payment.national.account.id.AR=Số CBU
+shared.accountSigningState=Account signing status
#new
payment.altcoin.address.dyn=Địa chỉ {0}
@@ -2261,7 +2364,7 @@ payment.accountNr=Số tài khoản
payment.emailOrMobile=Email hoặc số điện thoại
payment.useCustomAccountName=Sử dụng tên tài khoản thông dụng
payment.maxPeriod=Thời gian giao dịch cho phép tối đa
-payment.maxPeriodAndLimit=Thời gian giao dịch tối đa: {0} / Giới hạn giao dịch tối đa: {1} / Tuổi tài khoản: {2}
+payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3}
payment.maxPeriodAndLimitCrypto=Thời gian giao dịch tối đa: {0} / Giới hạn giao dịch tối đa: {1}
payment.currencyWithSymbol=Tiền tệ: {0}
payment.nameOfAcceptedBank=Tên NH được chấp nhận
@@ -2284,12 +2387,13 @@ payment.moneyGram.info=Khi dùng MoneyGram người mua BTC phải gửi số x
payment.westernUnion.info=Khi sử dụng Western Union, người mua BTC phải gửi MTCN (số theo dõi) và ảnh giấy biên nhận bằng email cho người bán BTC. Giấy biên nhận phải nêu rõ họ tên, thành phố, quốc gia của người bán và số tiền. Người mua sẽ được hiển thị email người bán trong quá trình giao dịch.
payment.halCash.info=Khi sử dụng HalCash người mua BTC cần phải gửi cho người bán BTC mã HalCash bằng tin nhắn điện thoại.\n\nVui lòng đảm bảo là lượng tiền này không vượt quá số lượng tối đa mà ngân hàng của bạn cho phép gửi khi dùng HalCash. Số lượng rút tối thiểu là 10 EUR và tối đa là 600 EUR. Nếu rút nhiều lần thì giới hạn sẽ là 3000 EUR/ người nhận/ ngày và 6000 EUR/người nhận/tháng. Vui lòng kiểm tra chéo những giới hạn này với ngân hàng của bạn để chắc chắn là họ cũng dùng những giới hạn như ghi ở đây.\n\nSố tiền rút phải là bội số của 10 EUR vì bạn không thể rút các mệnh giá khác từ ATM. Giao diện người dùng ở phần 'tạo chào giá' và 'chấp nhận chào giá' sẽ điều chỉnh lượng btc sao cho lượng EUR tương ứng sẽ chính xác. Bạn không thể dùng giá thị trường vì lượng EUR có thể sẽ thay đổi khi giá thay đổi.\n\nTrường hợp tranh chấp, người mua BTC cần phải cung cấp bằng chứng chứng minh mình đã gửi EUR.
payment.limits.info=Hãy hiểu rằng tất cả giao dịch chuyển khoản ngân hàng đều có thể có rủi ro bị đòi tiền lại.\n\nĐể hạn chế rủi ro này, Bisq đã đặt giới hạn trên mỗi giao dịch dựa trên hai yếu tố:\n\n1. Mức rủi ro đòi tiền lại ước tính cho mỗi phương thức thanh toán áp dụng\n2. Tuổi tài khoản của bạn đối với phương thức thanh toán\n\nTài khoản bạn đang tạo là mới và tuổi bằng không. Sau khi tài khoản của bạn được hai tháng tuổi, giới hạn trên mỗi giao dịch của bạn sẽ tăng lên theo:\n\n● Trong tháng đầu tiên, giới hạn trên mỗi giao dịch của bạn là {0}\n● Trong tháng thứ hai, giới hạn trên mỗi giao dịch của bạn là {1}\n● Sau hai tháng, giới hạn trên mỗi giao dịch của bạn là {2}\n\nLưu ý không có giới hạn trên tổng số lần bạn có thể giao dịch.
+payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade buy limits based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account you just created carries some chargeback risk and is not yet signed by an arbitrator or trusted peer, so it is limited to buying {0} per trade. After it is signed, buy limits will increase as follows:\n\n● Before signing, and up to 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase merely as account age increases. More information is at https://docs.bisq.network/payment-methods#account-signing.\n\nThere are no limits on the number of trades you can make.
payment.cashDeposit.info=Vui lòng xác nhận rằng ngân hàng của bạn cho phép nạp tiền mặt vào tài khoản của người khác. Chẳng hạn, Ngân Hàng Mỹ và Wells Fargo không còn cho phép nạp tiền như vậy nữa.
payment.revolut.info=Vui lòng đảm bảo rằng số điện thoại bạn dùng cho tài khoản Revolut đã được đăng ký tại Revolut nếu không thì người mua BTC sẽ không thể chuyển tiền cho bạn.
-payment.usPostalMoneyOrder.info=Phiếu chuyển tiền là một trong những hình thức mua bằng tiền pháp định có tính riêng tư cao có ở Bisq.\n\nTuy nhiên, vui lòng chú ý tới những nguy cơ tiềm ẩn đi liền với việc sử dụng phiếu chuyển tiền. Bisq sẽ không chịu bất kỳ trách nhiệm nào trong trường hợp phiếu chuyển tiền bị đánh cắp, và trong những trường hợp này trọng tài sẽ chuyển BTC tới người gửi phiếu chuyển tiền, với điều kiện là họ có thể đưa ra thông tin theo dõi và biên nhận. Người gửi nên viết tên người bán BTC trên tờ phiếu chuyển tiền nhằm giảm thiểu khả năng một người khác sẽ rút tiền từ phiếu chuyển tiền này.
+payment.usPostalMoneyOrder.info=Money orders are one of the more private fiat purchase methods available on Bisq.\n\nHowever, please be aware of potentially increased risks associated with their use. Bisq will not bear any responsibility in case a sent money order is stolen, and the mediator or arbitrator will in such cases award the BTC to the sender of the money order, provided they can produce tracking information and receipts. It may be advisable for the sender to write the BTC seller's name on the money order, in order to minimize the risk that the money order is cashed by someone else.
payment.f2f.contact=thông tin liên hệ
payment.f2f.contact.prompt=Bạn muốn liên hệ với đối tác giao dịch qua đâu? (email, địa chỉ, số điện thoại,....)
@@ -2299,11 +2403,15 @@ payment.f2f.optionalExtra=Thông tin thêm tuỳ chọn.
payment.f2f.extra=thông tin thêm
payment.f2f.extra.prompt=Người tạo có thể đặt ‘ các điều khoản’ hoặc thêm thông tin liên hệ mở, để hiểnnthij trong báo giá
-payment.f2f.info=Những giao dịch ‘mặt đối mặt’ đi kèm những quy tắc và rủi ro khác với giao dịch trực tuyến.\n\nNhững khác biệt chính đó là:\n● Bên mua và bán cần trao đổi thông tin về thời gian và địa điểm gặp mặt sử dụng những thông tin liên lạc mà họ cung cấp. \n● Bên mua và bán cần phải mang theo laptop và thực hiện việc xác nhận ‘đã gửi tiền’ và ‘đã nhận tiền’ tại nơi gặp.\n● Nếu bên chào giá có những ‘điều khoản và điều kiện’ đặc biệt, họ sẽ phải nêu ra ở phần ‘thông tin thêm’ trong tài khoản.\n● Chấp nhận chào giá tức là bên chấp nhận đã đồng ý với các ‘điều khoản và điều kiện’ của bên chào giá.\n● Trong trường hợp tranh chấp, trọng tài sẽ không giúp được gì nhiều bởi vì để cung cấp các bằng chứng không thể thay đổi về những việc xảy ra tại nơi gặp mặt thường là rất khó. Trong những trường hợp như vậy, số BTC này có thể sẽ bị khóa vô thời hạn hoặc khóa đến khi bên mua và bán đạt được thỏa thuận. \n\nĐể chắc chắn là bạn hiểu rõ sự khác nhau của các giao dịch ‘mặt đối mặt’vui lòng đọc hướng dẫn và khuyến nghị tại: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
+payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading'
payment.f2f.info.openURL=Mở trang web
-payment.f2f.offerbook.tooltip.countryAndCity=Đất nước và thành phố:{0}/{1}
+payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
payment.f2f.offerbook.tooltip.extra=Thông tin thêm: {0}
+payment.japan.bank=Ngân hàng
+payment.japan.branch=Branch
+payment.japan.account=Tài khoản
+payment.japan.recipient=Tên
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -2317,6 +2425,7 @@ CASH_DEPOSIT=Tiền gửi tiền mặt
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=Giao dịch trực tiếp (gặp mặt)
+JAPAN_BANK=Japan Bank Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=Ngân hàng trong nước
@@ -2334,6 +2443,8 @@ MONEY_GRAM_SHORT=MoneyGram
WESTERN_UNION_SHORT=Western Union
# suppress inspection "UnusedProperty"
F2F_SHORT=F2F
+# suppress inspection "UnusedProperty"
+JAPAN_BANK_SHORT=Japan Furikomi
# Do not translate brand names
# suppress inspection "UnusedProperty"
@@ -2495,7 +2606,12 @@ validation.pattern=Giá trị nhập phải có định dạng: {0}
validation.noHexString=Giá trị nhập không ở định dạng HEX
validation.advancedCash.invalidFormat=Phải là một địa chỉ email hợp lệ hoặc là ID ví với định dạng: X000000000000
validation.invalidUrl=Đây không phải là URL hợp lệ
-validation.mustBeDifferent=Giá trị nhập của bạn phải khác với giá trị hiện tại
+validation.mustBeDifferent=Your input must be different from the current value
validation.cannotBeChanged=Thông số không thể thay đổi
validation.numberFormatException=Ngoại lệ cho định dạng số {0}
validation.mustNotBeNegative=Giá trị nhập không được là số âm
+validation.phone.missingCountryCode=Need two letter country code to validate phone number
+validation.phone.invalidCharacters=Phone number {0} contains invalid characters
+validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number
+validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number
+validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}.
diff --git a/core/src/main/resources/i18n/displayStrings_zh.properties b/core/src/main/resources/i18n/displayStrings_zh.properties
index be48c3c54c..b05485dea3 100644
--- a/core/src/main/resources/i18n/displayStrings_zh.properties
+++ b/core/src/main/resources/i18n/displayStrings_zh.properties
@@ -62,6 +62,10 @@ shared.priceWithCur={0} 价格
shared.priceInCurForCur=1 {1} 的 {0} 价格
shared.fixedPriceInCurForCur=1 {1} 的 {0} 的固定价格
shared.amount=数量
+shared.txFee=交易手续费
+shared.makerFee=挂单费
+shared.buyerSecurityDeposit=买家保证金
+shared.sellerSecurityDeposit=卖家保证金
shared.amountWithCur={0} 数量
shared.volumeWithCur={0} 量
shared.currency=货币类型
@@ -115,7 +119,6 @@ shared.sendingConfirmationAgain=请再次发送确认
shared.exportCSV=导出保存为 .csv
shared.exportJSON=导出保存至 JSON
shared.noDateAvailable=没有可用数据
-shared.arbitratorsFee=仲裁费用
shared.noDetailsAvailable=没有可用详细
shared.notUsedYet=尚未使用
shared.date=日期
@@ -149,11 +152,11 @@ shared.save=保存
shared.onionAddress=匿名地址
shared.supportTicket=帮助话题
shared.dispute=纠纷
+shared.mediationCase=介入事件
shared.seller=卖家
shared.buyer=买家
shared.allEuroCountries=所有欧元国家
shared.acceptedTakerCountries=接受的买家国家
-shared.arbitrator=选中的仲裁者
shared.tradePrice=交易价格
shared.tradeAmount=交易金额
shared.tradeVolume=交易量
@@ -203,6 +206,15 @@ shared.proposal=建议
shared.votes=投票
shared.learnMore=了解更多
shared.dismiss=忽略
+shared.selectedArbitrator=选中的仲裁者
+shared.selectedMediator=选择调解员
+shared.selectedRefundAgent=选中的仲裁者
+shared.mediator=中介
+shared.arbitrator=仲裁员
+shared.refundAgent=仲裁员
+shared.refundAgentForSupportStaff=退款助理
+shared.delayedPayoutTxId=退款担保交易 ID
+
####################################################################
# UI views
@@ -244,7 +256,7 @@ mainView.footer.btcInfo.synchronizingWith=正在同步至
mainView.footer.btcInfo.synchronizedWith=已同步至
mainView.footer.btcInfo.connectingTo=连接至
mainView.footer.btcInfo.connectionFailed=连接失败
-mainView.footer.p2pInfo=P2P 网络节点:{0}
+mainView.footer.p2pInfo=Bisq 网络对等点:{0}
mainView.footer.daoFullNode=DAO 全节点
mainView.bootstrapState.connectionToTorNetwork=(1/4) 连接至 Tor 网络...
@@ -254,10 +266,10 @@ mainView.bootstrapState.initialDataReceived=(4/4) 初始数据已接收
mainView.bootstrapWarning.noSeedNodesAvailable=没有可用的种子节点
mainView.bootstrapWarning.noNodesAvailable=没有可用的种子节点和节点
-mainView.bootstrapWarning.bootstrappingToP2PFailed=自动连接 P2P 网络失败
+mainView.bootstrapWarning.bootstrappingToP2PFailed=启动 Bisq 网络失败
mainView.p2pNetworkWarnMsg.noNodesAvailable=请求数据没有可用种子和节点。\n请检查您的互联网连接或尝试重启应用程序。
-mainView.p2pNetworkWarnMsg.connectionToP2PFailed=连接至 P2P 网络失败(错误报告:{0})。\n请检查您的互联网连接或尝试重启应用程序。
+mainView.p2pNetworkWarnMsg.connectionToP2PFailed=连接至 Bisq 网络失败(错误报告:{0})。\n请检查您的互联网连接或尝试重启应用程序。
mainView.walletServiceErrorMsg.timeout=比特币网络连接超时。
mainView.walletServiceErrorMsg.connectionError=错误:{0} 比特币网络连接失败。
@@ -301,6 +313,7 @@ market.trades.tooltip.candle.close=关闭:
market.trades.tooltip.candle.high=高:
market.trades.tooltip.candle.low=低:
market.trades.tooltip.candle.average=平均:
+market.trades.tooltip.candle.median=调解员:
market.trades.tooltip.candle.date=日期:
####################################################################
@@ -320,6 +333,20 @@ offerbook.offerersAcceptedBankSeats=接受的银行所在国家(买家):\n
offerbook.availableOffers=可用委托
offerbook.filterByCurrency=以货币过滤
offerbook.filterByPaymentMethod=以支付方式过滤
+offerbook.timeSinceSigning=自签字
+offerbook.timeSinceSigning.info=此账户已验证,{0}
+offerbook.timeSinceSigning.info.arbitrator=由仲裁员签字,并可以签署伙伴账户
+offerbook.timeSinceSigning.info.peer=由伙伴签名,等待限制被解除
+offerbook.timeSinceSigning.info.peerLimitLifted=由同伴签署,限制被取消
+offerbook.timeSinceSigning.info.signer=由同伴签署,并可签署同伴(限制已取消)
+offerbook.timeSinceSigning.daysSinceSigning={0} 天
+offerbook.timeSinceSigning.daysSinceSigning.long=自签署{0}
+
+offerbook.timeSinceSigning.help=当您成功地完成与拥有已签字付款帐户的伙伴交易时,您的付款帐户已签字。\n{0} 天后,最初的 {1} 的限制解除以及你的账户可以签署其他伙伴的”付款账户。
+offerbook.timeSinceSigning.notSigned=尚未签字
+offerbook.timeSinceSigning.notSigned.noNeed=N/A
+shared.notSigned=此账户还没有被签署
+shared.notSigned.noNeed=此账户类型不使用签名
offerbook.nrOffers=委托数量:{0}
offerbook.volume={0}(最小 - 最大)
@@ -345,14 +372,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=选择的货币没有交易账
offerbook.warning.noMatchingAccount.headline=没有匹配的交易账户。
offerbook.warning.noMatchingAccount.msg=为了接受这个报价,你需要用这个付款方式建立一个付款账户。\n\n你现在想做这件事吗?
-offerbook.warning.riskyBuyOfferWithImmatureAccountAge=由于以下安全规则,该报价不能被采取:\n-提供商的支付账户创建于2019年3月1日之后\n-最低交易金额超过0.01 BTC\n-该报价的付款方式被认为是有风险的银行扣款\n\n{0}
+offerbook.warning.counterpartyTradeRestrictions=由于交易伙伴的交易限制,这个报价不能接受
-offerbook.warning.sellOfferAndAnyTakerPaymentAccountForOfferMature=由于以下安全规则,该报价不能被采取:\n-您的支付账户创建于2019年3月1日之后\n-最低交易金额超过0.01 BTC\n-该报价的付款方式被认为是有风险的银行扣款\n\n{0}
+offerbook.warning.newVersionAnnouncement=使用这个版本的软件,交易伙伴可以验证和签署彼此的支付帐户,以创建一个可信的支付帐户网络。\n\n交易成功后,您的支付帐户将被签署以及交易限制将在一定时间后解除(此时间基于验证方法)。\n\n有关签署帐户的更多信息,请参见文档 https://docs.bisq.network/payment-methods#account-signing
-offerbook.warning.newVersionAnnouncement=我们需要将此限制替换为增强安全性的短期措施。\n\n下一个软件版本将提供更安全的保护工具,这样具有这种风险配置文件的报价就可以再次交易。
-
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=由于以下安全规则,允许的交易量被限制在 0.01 BTC 以内:\n-买家账户创建于2019年3月1日之后\n-该报价的付款方法被认为有银行退款的风险\n\n{0}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=由于以下安全规则,允许的交易量被限制在 0.01 BTC 以内:\n-您的账户创建于2019年3月1日之后\n-该报价的付款方法被认为有银行退款的风险\n\n{0}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=基于以下标准的安全限制,允许的交易金额限制为 {0}:\n- 买方的帐目没有由仲裁员或伙伴签署\n- 买方帐户自签署之日起不足30天\n- 本报价的付款方式被认为存在银行退款的风险\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=基于以下标准的安全限制,允许的交易金额限制为{0}:\n- 你的买家帐户没有由仲裁员或伙伴签署\n- 自签署你的帐户以来的时间少于30天\n- 本报价的付款方式被认为存在银行退款的风险\n\n{1}
offerbook.warning.wrongTradeProtocol=该委托要求的软件版本与您现在运行的版本不一致。\n\n请检查您是否运行最新版本,否则该委托用户在使用一个旧的版本。\n用户不能与不兼容的交易协议版本进行交易。
offerbook.warning.userIgnored=您已添加该用户的匿名地址在您的忽略列表里。
@@ -516,8 +541,8 @@ portfolio.pending.step3_seller.confirmPaymentReceived=确定收到付款
portfolio.pending.step5.completed=完成
portfolio.pending.step1.info=存款交易已经发布。\n开始付款之前,{0} 需要等待至少一个块链确认。
-portfolio.pending.step1.warn=存款交易仍未得到确认。\n这种情况可能会发生在外部钱包转账时使用的交易手续费用较低造成的。
-portfolio.pending.step1.openForDispute=存款交易仍未得到确认。\n这种情况可能会发生在外部钱包转账时使用的交易手续费用较低造成的。\n交易超时。\n\n请联系仲裁员创建纠纷。
+portfolio.pending.step1.warn=保证金交易仍未得到确认。这种情况可能会发生在外部钱包转账时使用的交易手续费用较低造成的。
+portfolio.pending.step1.openForDispute=保证金交易仍未得到确认。请联系调解员协助。
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=您的交易已经达到至少一个块链确认。\n(如果需要,您可以等待更多的确认 - 6个确认被认为是非常安全的。)\n\n
@@ -535,8 +560,10 @@ portfolio.pending.step2_buyer.altcoin=请从您的外部 {0} 钱包划转\n{1}
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=请到银行并支付 {0} 给 BTC 卖家。\n\n
portfolio.pending.step2_buyer.cash.extra=重要要求:\n完成付款后在纸质收据上写下:不退款。\n然后将其撕成2份,拍照片并发送给 BTC 卖家的电子邮件地址。
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=请使用 MoneyGram 向 BTC 卖家支付 {0}。\n\n
portfolio.pending.step2_buyer.moneyGram.extra=重要要求:\n完成支付后,请通过电邮发送授权编号和照片给 BTC 卖家。\n收据必须清楚地向卖家写明您的全名、城市、国家、数量。卖方的电子邮件是:{0}。
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=请使用 Western Union 向 BTC 卖家支付 {0}。\n\n
portfolio.pending.step2_buyer.westernUnion.extra=重要要求:\n完成支付后,请通过电邮发送 MTCN(追踪号码)和照片给 BTC 卖家。\n收据必须清楚地向卖家写明您的全名、城市、国家、数量。卖方的电子邮件是:{0}。
@@ -544,14 +571,15 @@ portfolio.pending.step2_buyer.westernUnion.extra=重要要求:\n完成支付
portfolio.pending.step2_buyer.postal=请用“美国邮政汇票”发送 {0} 给 BTC 卖家。\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.bank=请到您的在线银行网页并支付 {0} 给 BTC 卖家。\n\n
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.f2f=请通过提供的联系人与 BTC 卖家联系,并安排会议支付 {0}。\n\n
portfolio.pending.step2_buyer.startPaymentUsing=使用 {0} 开始付款
portfolio.pending.step2_buyer.amountToTransfer=划转数量
portfolio.pending.step2_buyer.sellersAddress=卖家的 {0} 地址
portfolio.pending.step2_buyer.buyerAccount=您的付款帐户将被使用
portfolio.pending.step2_buyer.paymentStarted=付款开始
-portfolio.pending.step2_buyer.warn=你还没有完成你的 {0} 付款!\n请注意,交易必须在 {1} 之前完成,否则交易将由仲裁员进行调查。
-portfolio.pending.step2_buyer.openForDispute=您尚未完成付款!\n最大交易期已过。\n\n请联系仲裁员以争取解决纠纷。
+portfolio.pending.step2_buyer.warn=你还没有完成你的 {0} 付款!\n请注意,交易必须在 {1} 之前完成。
+portfolio.pending.step2_buyer.openForDispute=您还没有完成您的付款!\n最大交易期限已过。请联系调解员寻求帮助。
portfolio.pending.step2_buyer.paperReceipt.headline=您是否将纸质收据发送给 BTC 卖家?
portfolio.pending.step2_buyer.paperReceipt.msg=请牢记:\n完成付款后在纸质收据上写下:不退款。\n然后将其撕成2份,拍照片并发送给 BTC 卖家的电子邮件地址。
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=发送授权编号和收据
@@ -569,7 +597,11 @@ portfolio.pending.step2_seller.waitPayment.headline=等待付款
portfolio.pending.step2_seller.f2fInfo.headline=买家的合同信息
portfolio.pending.step2_seller.waitPayment.msg=存款交易至少有一个区块链确认。\n您需要等到 BTC 买家开始 {0} 付款。
portfolio.pending.step2_seller.warn=BTC 买家仍然没有完成 {0} 付款。\n你需要等到他开始付款。\n如果 {1} 交易尚未完成,仲裁员将进行调查。
-portfolio.pending.step2_seller.openForDispute=BTC 买家尚未开始付款!\n最大允许的交易期限已经过去了。\n请联系仲裁员以争取解决纠纷。
+portfolio.pending.step2_seller.openForDispute=BTC 买家尚未开始付款!\n最大允许的交易期限已经过去了。\n你可以继续等待给予交易双方更多时间,或联系仲裁员以争取解决纠纷。
+
+tradeChat.chatWindowTitle=使用 ID “{0}” 进行交易的聊天窗口
+tradeChat.openChat=打开聊天窗口
+tradeChat.rules=您可以与您的伙伴沟通,以解决该交易的潜在问题。\n在聊天中不强制回复。\n如果交易员违反了下面的任何规则,打开纠纷并向调解员或仲裁员报告。\n聊天规则:\n\n\t●不要发送任何链接(有恶意软件的风险)。您可以发送交易 ID 和区块资源管理器的名称。\n\t●不要发送种子词、私钥、密码或其他敏感信息!\n\t●不鼓励 Bisq 以外的交易(无安全保障)。\n\t●不要参与任何形式的危害社会安全的计划。\n\t●如果对方没有回应,也不愿意通过聊天进行沟通,那就尊重对方的决定。\n\t●将谈话范围限制在行业内。这个聊天不是一个社交软件替代品或troll-box。\n\t●保持友好和尊重的交谈。
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=未定义
@@ -578,7 +610,7 @@ message.state.SENT=发出信息
# suppress inspection "UnusedProperty"
message.state.ARRIVED=消息抵达对等点
# suppress inspection "UnusedProperty"
-message.state.STORED_IN_MAILBOX=消息保存在邮箱中
+message.state.STORED_IN_MAILBOX=已发送但尚未被伙伴接收的付款信息
# suppress inspection "UnusedProperty"
message.state.ACKNOWLEDGED=对等确认消息接收
# suppress inspection "UnusedProperty"
@@ -589,14 +621,15 @@ portfolio.pending.step3_buyer.wait.info=等待 BTC 卖家确认收到 {0} 付款
portfolio.pending.step3_buyer.wait.msgStateInfo.label=支付开始消息状态
portfolio.pending.step3_buyer.warn.part1a=在 {0} 区块链
portfolio.pending.step3_buyer.warn.part1b=在您的支付供应商(例如:银行)
-portfolio.pending.step3_buyer.warn.part2=BTC 卖家仍然没有确认您的付款!\n如果付款发送成功,请检查 {0}。\n如果 BTC 卖家在 {1} 之前不确认收到您的付款,交易将由仲裁员进行调查。
-portfolio.pending.step3_buyer.openForDispute=BTC 卖家尚未确认您的付款!\n最长交易期已过。\n请联系仲裁员以争取解决纠纷。
+portfolio.pending.step3_buyer.warn.part2=BTC 卖家仍然没有确认您的付款。如果付款发送成功,请检查 {0}。
+portfolio.pending.step3_buyer.openForDispute=BTC卖家还没有确认你的付款!最大交易期限已过。您可以等待更长时间,并给交易伙伴更多时间或请求调解员的帮助。
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=您的交易伙伴已经确认他们已经发起了 {0} 付款。\n\n
portfolio.pending.step3_seller.altcoin.explorer=在您最喜欢的 {0} 区块链浏览器
portfolio.pending.step3_seller.altcoin.wallet=在您的 {0} 钱包
portfolio.pending.step3_seller.altcoin={0} 请检查 {1} 是否交易已经到您的接收地址\n{2}\n已经有足够的区块链确认了\n支付金额必须为 {3}\n\n关闭该弹出窗口后,您可以从主界面复制并粘贴 {4} 地址。
portfolio.pending.step3_seller.postal={0} 请检查您是否已经从 BTC 买家收到了 {1} “美国邮政汇票”。\n\n交易 ID(“付款原因”文本)是:“{2}”
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.bank=您的交易对象已确认他已启动 {0} 付款\n\n请访问您的网上银行网页,并检查您是否已从 BTC 买家收到 {1}\n\n交易 ID(“付款原因”文本)是:“{2}”\n\n
portfolio.pending.step3_seller.cash=因为付款是通过现金存款完成的,BTC 买家必须在纸质收据上写“不退款”,将其撕成2份,并通过电子邮件向您发送照片。\n\n为避免退款风险,请仅确认您是否收到电子邮件,如果您确定收据有效。\n如果您不确定,{0}
portfolio.pending.step3_seller.moneyGram=买方必须发送授权编码和一张收据的照片。\n收据必须清楚地显示您的全名、城市、国家、数量。如果您收到授权编码,请查收邮件。\n\n关闭弹窗后,您将看到 BTC 买家的姓名和在 MoneyGram 的收款地址。\n\n只有在您成功收到钱之后,再确认收据!
@@ -604,7 +637,7 @@ portfolio.pending.step3_seller.westernUnion=买方必须发送 MTCN(跟踪号
portfolio.pending.step3_seller.halCash=买方必须将 HalCash代码 用短信发送给您。除此之外,您将收到来自 HalCash 的消息,其中包含从支持 HalCash 的 ATM 中提取欧元所需的信息\n从 ATM 取款后,请在此确认付款收据!
portfolio.pending.step3_seller.bankCheck=\n\n还请确认您的银行对帐单中的发件人姓名与委托合同中的发件人姓名相符:\n发件人姓名:{0}\n\n如果名称与此处显示的名称不同,则 {1}
-portfolio.pending.step3_seller.openDispute=请不要确认,而是通过键盘组合键“alt + o”或“option + o”来提出纠纷。
+portfolio.pending.step3_seller.openDispute=请不要确认,而是通过键盘组合键“alt + o”或“option + o”来打开纠纷。
portfolio.pending.step3_seller.confirmPaymentReceipt=确定付款收据
portfolio.pending.step3_seller.amountToReceive=接收数量:
portfolio.pending.step3_seller.yourAddress=您的 {0} 地址
@@ -617,17 +650,18 @@ portfolio.pending.step3_seller.buyerStartedPayment.altcoin=检查您的数字货
portfolio.pending.step3_seller.buyerStartedPayment.fiat=检查您的交易账户(例如银行帐户),并确认您何时收到付款。
portfolio.pending.step3_seller.warn.part1a=在 {0} 区块链
portfolio.pending.step3_seller.warn.part1b=在您的支付供应商(例如:银行)
-portfolio.pending.step3_seller.warn.part2=您还没有确认收到的付款!\n如果您已收到付款,请检查 {0}\n如果您在 {1} 之前不确认收货,交易将由仲裁员进行调查。
-portfolio.pending.step3_seller.openForDispute=您尚未确认付款的收据!\n最大交易期已过\n请联系仲裁员以争取解决纠纷。
+portfolio.pending.step3_seller.warn.part2=你还没有确认收到款项。如果您已经收到款项,请检查 {0}。
+portfolio.pending.step3_seller.openForDispute=您尚未确认付款的收据!\n最大交易期已过\n请确认或请求调解员的协助。
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=您是否收到了您交易伙伴的 {0} 付款?\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.fiat=交易 ID(“付款理由”文本)是“{0}”\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.onPaymentReceived.name=还请确认您的银行对帐单中的发件人姓名与委托合同中的发件人姓名相符:\n发件人姓名:{0}\n\n如果名称与此处显示的名称不一致,请不要通过输入“alt + o”或“option + o”来确认,而是打开争议。\n\n
+portfolio.pending.step3_seller.onPaymentReceived.name=还请确认您的银行对帐单中的发件人姓名与委托合同中的发件人姓名相符:\n每个交易合约的发送者姓名:{0}\n\n如果名称与此处显示的名称不一致,请不要通过确认付款,而是通过“alt + o”或“option + o”打开纠纷。\n\n
portfolio.pending.step3_seller.onPaymentReceived.note=请注意,一旦您确认收到,冻结交易金额将被发放给 BTC 买家,保证金将被退还。
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=确定您已经收到付款
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=是的,我已经收到付款。
+portfolio.pending.step3_seller.onPaymentReceived.signer=重要提示:通过确认收到付款,你也验证了对方的账户,并获得签字。因为对方的账户还没有签字,所以你应该尽可能的延迟付款的确认,以减少退款的风险。
portfolio.pending.step5_buyer.groupTitle=完成交易的概要
portfolio.pending.step5_buyer.tradeFee=挂单费
@@ -636,6 +670,7 @@ portfolio.pending.step5_buyer.takersMiningFee=总共挖矿手续费
portfolio.pending.step5_buyer.refunded=退还保证金
portfolio.pending.step5_buyer.withdrawBTC=提现您的比特币
portfolio.pending.step5_buyer.amount=提现数量
+portfolio.pending.step5_buyer.signer=通过提取您的比特币,您可以验证交易伙伴是否按照交易协议行事。
portfolio.pending.step5_buyer.withdrawToAddress=提现地址
portfolio.pending.step5_buyer.moveToBisqWallet=资金划转到 Bisq 钱包
portfolio.pending.step5_buyer.withdrawExternal=提现到外部钱包
@@ -663,26 +698,53 @@ portfolio.pending.tradePeriodInfo=在第一次区块链确认之后,交易周
portfolio.pending.tradePeriodWarning=如果超过了这个周期,双方均可以提出纠纷。
portfolio.pending.tradeNotCompleted=交易不会及时完成(直到 {0} )
portfolio.pending.tradeProcess=交易流程
-portfolio.pending.openAgainDispute.msg=如果您不确定仲裁员的信息到达(例如,如果您在1天后没有得到回复),则可以随时再次提出纠纷。
+portfolio.pending.openAgainDispute.msg=如果您不确定发送给调解员或仲裁员的消息是否已送达(例如,如果您在1天后没有收到回复),请放心使用 Cmd/Ctrl+o 再次打开纠纷。你也可以在 Bisq 论坛上寻求额外的帮助,网址是 https://bisq.community。
portfolio.pending.openAgainDispute.button=再次出现纠纷
portfolio.pending.openSupportTicket.headline=创建帮助话题
-portfolio.pending.openSupportTicket.msg=请在紧急情况下使用,如果您没有显示“创建帮助话题”或“创建纠纷”按钮。\n\n当您打开帮助话题时,交易将被仲裁员中断和处理
+portfolio.pending.openSupportTicket.msg=请仅在紧急情况下使用此功能,如果您没有看到“提交支持”或“提交纠纷”按钮。\n\n当您发出工单时,交易将被中断并由调解员或仲裁员进行处理。
+
+portfolio.pending.timeLockNotOver=你必须等到≈{0}(还需等待{1}个区块)才能提交纠纷。
+
portfolio.pending.notification=通知
-portfolio.pending.openDispute=创建一个纠纷
-portfolio.pending.arbitrationRequested=纠纷已创建
+
+portfolio.pending.support.headline.getHelp=需要帮助?
+portfolio.pending.support.text.getHelp=如果您有任何问题,您可以尝试在交易聊天中联系交易伙伴,或在 https://bisq.community 询问 Bisq 社区。如果您的问题仍然没有解决,您可以向调解员取得更多的帮助。
+portfolio.pending.support.text.getHelp.arbitrator=如果您有任何问题,您可以尝试在交易聊天中联系交易伙伴,或在 https://bisq.community 询问 Bisq 社区。如果你的问题仍然没有解决,你可以向仲裁员取得更多的帮助。
+portfolio.pending.support.button.getHelp=获取帮助
+portfolio.pending.support.popup.info=如果您与交易的问题仍然没有解决,您可以提交工单来请求调解员的帮助。如果您还没有收到付款,请等到交易结束。\n\n您确定要提交工单吗?
+portfolio.pending.support.popup.button=创建帮助话题
+portfolio.pending.support.headline.halfPeriodOver=确认付款
+portfolio.pending.support.headline.periodOver=交易期结束
+
+portfolio.pending.mediationRequested=已请求调解员协助
+portfolio.pending.refundRequested=已请求退款
portfolio.pending.openSupport=创建帮助话题
portfolio.pending.supportTicketOpened=帮助话题已经创建
portfolio.pending.requestSupport=请求帮助
-portfolio.pending.error.requestSupport=请将问题报告给您的仲裁员。\n\n他会将信息转交给开发人员调查问题。\n在解决问题后,您将收回所有冻结资金。
+portfolio.pending.error.requestSupport=请将问题报告给您的调解员或仲裁员。\n\n他会将信息转交给开发人员调查问题。\n在解决问题后,您将收回所有冻结资金。
portfolio.pending.communicateWithArbitrator=请在“帮助”界面上与仲裁员联系。
+portfolio.pending.communicateWithMediator=请在“支持”页面中与调解员进行联系。
portfolio.pending.supportTicketOpenedMyUser=您创建了一个帮助话题。\n{0}
portfolio.pending.disputeOpenedMyUser=您创建了一个纠纷。\n{0}
portfolio.pending.disputeOpenedByPeer=您的交易对象创建了一个纠纷。\n{0}
portfolio.pending.supportTicketOpenedByPeer=您的交易对象创建了一个帮助工单。\n{0}
portfolio.pending.noReceiverAddressDefined=没有定义接收地址
-portfolio.pending.removeFailedTrade=如果仲裁员无法关闭该交易,您可以将其移动到失败的交易界面。\n您要从“待处理交易”界面中删除该失败的交易吗?
+portfolio.pending.removeFailedTrade=这是一笔失败的交易吗?如果是,请问你想手动关闭它吗?使它不再显示为一个未完成交易。
+
+portfolio.pending.mediationResult.headline=调解费用的支出
+portfolio.pending.mediationResult.info.noneAccepted=通过接受调解员关于交易的建议的支出来完成交易。
+portfolio.pending.mediationResult.info.selfAccepted=你已经接受了调解员的建议。等待伙伴接受。
+portfolio.pending.mediationResult.info.peerAccepted=你的伙伴已经接受了调解员的建议。你也接受吗?
+portfolio.pending.mediationResult.button=查看建议的解决方案
+portfolio.pending.mediationResult.popup.headline=调解员在交易 ID:{0}上的建议
+portfolio.pending.mediationResult.popup.headline.peerAccepted=你的伙伴已经接受了调解员的建议
+portfolio.pending.mediationResult.popup.info=调解员建议的支出如下:\n你将支付:{0}\n你的交易伙伴将支付:{1}\n\n你可以接受或拒绝这笔调解费支出。\n\n通过接受,你签署了合约的支付交易。如果你的交易伙伴也接受和签署,支付将完成,交易将关闭。\n\n如果你们其中一人或双方都拒绝该建议,你将必须等到(2)({3}区块)与仲裁员展开第二轮纠纷讨论,仲裁员将再次调查该案件,并根据他们的调查结果进行支付。\n\n仲裁员可以收取少量费用(费用上限:交易的保证金)作为其工作的补偿。两个交易者都同意调解员的建议是愉快的路径请求仲裁是针对特殊情况的,比如如果一个交易者确信调解员没有提出公平的赔偿建议(或者如果另一个同伴没有回应)。\n\n关于新的仲裁模型的更多细节:https://docs.bisq.network/trading-rules.html#arbitration
+portfolio.pending.mediationResult.popup.openArbitration=拒绝并请求仲裁
+portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
+
portfolio.closed.completed=完成
-portfolio.closed.ticketClosed=话题关闭
+portfolio.closed.ticketClosed=已仲裁
+portfolio.closed.mediationTicketClosed=已调解
portfolio.closed.canceled=已取消
portfolio.failed.Failed=失败
@@ -745,6 +807,9 @@ funds.tx.multiSigDeposit=多重签名保证金:{0}
funds.tx.multiSigPayout=多重签名花费:{0}
funds.tx.disputePayout=纠纷花费:{0}
funds.tx.disputeLost=失败的纠纷案件:{0}
+funds.tx.collateralForRefund=押金退款:{0}
+funds.tx.timeLockedPayoutTx=距锁定锁定支付 tx 的时间: {0}
+funds.tx.refund=仲裁退款:{0}
funds.tx.unknown=未知原因:{0}
funds.tx.noFundsFromDispute=没有退款的纠纷
funds.tx.receivedFunds=收到的资金:
@@ -765,14 +830,15 @@ funds.tx.dustAttackTx.popup=这笔交易是发送一个非常小的比特币金
# Support
####################################################################
-support.tab.mediation.support=帮助工单
-support.tab.ArbitratorsSupportTickets=仲裁员的帮助工单
-support.tab.TradersSupportTickets=交易者的帮助工单
+support.tab.mediation.support=调解
+support.tab.arbitration.support=仲裁
+support.tab.legacyArbitration.support=历史仲裁
+support.tab.ArbitratorsSupportTickets={0} 的工单
support.filter=过滤列表
support.filter.prompt=输入 交易 ID、日期、洋葱地址或账户信息
support.noTickets=没有创建的话题
support.sendingMessage=发送消息...
-support.receiverNotOnline=接收者没有在线,消息保存在他的收件箱。
+support.receiverNotOnline=收件人未在线。消息被保存到他们的邮箱。
support.sendMessageError=发送消息失败。错误:{0}
support.wrongVersion=纠纷中的订单创建于一个旧版本的 Bisq。\n您不能在当前版本关闭这个纠纷。\n\n请您使用一个旧版本与协议版本 {0}
support.openFile=打开附件文件(文件最大大小:{0} kb)
@@ -782,7 +848,7 @@ support.attachment=附件
support.tooManyAttachments=您不能发送一个消息里超过3个附件。
support.save=保存文件到磁盘
support.messages=消息
-support.input.prompt=请在此输入您的消息给仲裁员
+support.input.prompt=输入消息...
support.send=发送
support.addAttachments=添加附件
support.closeTicket=关闭话题
@@ -801,14 +867,18 @@ support.buyerOfferer=BTC 买家/挂单者
support.sellerOfferer=BTC 卖家/挂单者
support.buyerTaker=BTC 买家/买单者
support.sellerTaker=BTC 卖家/买单者
-support.backgroundInfo=Bisq 不是一家公司,所以它处理纠纷的方式不同。\n\n如果在交易过程中出现争议(例如,其中一方没有遵守交易协议),应用程序将在交易期间结束后显示一个“提出纠纷”的按钮,以便与仲裁员联系。\n\n如果应用程序有问题,软件将尝试检测它,并且在可能的情况下显示一个“提交工单”按钮,以便与仲裁人员联系,仲裁人员将问题转发给开发人员。\n\n如果您遇到问题,并且没有看到“提交工单”按钮,您可以在“交易/未完成交易”下选择导致问题的交易,然后单击“alt + o”或“option + o”,手动提交工单。请仅在确定软件没有按预期工作时才使用此方法。如果您有任何问题,请查看 Bisq.network 网页上的常见问答,或者在 Bisq 论坛的支持部分发表文章。
-support.initialInfo=请在下面的文本框中输入您的问题描述。添加尽可能多的信息,以加快解决纠纷的时间。\n \n以下是你应提供的资料核对表:\n \n●如果您是 BTC 买家:您是否使用法定货币或其他加密货币转账?如果是,您是否点击了应用程序中的“支付开始”按钮?\n \n●如果您是 BTC 卖家:您是否收到法定货币或其他加密货币的付款了?如果是,你是否点击了应用程序中的“已收到付款”按钮?\n \n●您使用的是哪个版本的 Bisq?\n \n●您使用的是哪种操作系统?\n\n如果遇到操作执行失败的问题,请考虑切换到新的数据目录。\n \n有时数据目录会损坏,并导致奇怪的错误。\n \n详见:https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n \n请熟悉纠纷处理的基本规则:\n \n●您需要在2天内答复仲裁员的请求。\n \n●纠纷的最长期限为14天。\n \n●你需要与仲裁员合作,提供他们为你的案件所要求的信息。\n \n●当您第一次启动应用程序时,您接受了用户协议中争议文档中列出的规则。\n\n您可以通过 https://bisq.network/docs/exchange/arbitration-system 了解有关纠纷处理的更多信息
+support.backgroundInfo=Bisq 不是一家公司,所以它处理纠纷的方式不同。\n\n交易双方可以在应用程序中通过未完成交易页面上的安全聊天进行通信,以尝试自行解决争端。如果这还不够,调解员可以介入帮助。调解员将对情况进行评估,并对交易资金的支出提出建议。如果两个交易者都接受这个建议,那么支付交易就完成了,交易也结束了。如果一方或双方不同意调解员的建议,他们可以要求仲裁。仲裁员有保证金交易的第三个密钥,并将根据他们的调查结果进行收款。
+support.initialInfo=请在下面的文本框中输入您的问题描述。添加尽可能多的信息,以加快解决纠纷的时间。\n\n以下是你应提供的资料核对表:\n\t●如果您是 BTC 买家:您是否使用法定货币或其他加密货币转账?如果是,您是否点击了应用程序中的“支付开始”按钮?\n\t●如果您是 BTC 卖家:您是否收到法定货币或其他加密货币的付款了?如果是,你是否点击了应用程序中的“已收到付款”按钮?\n\t●您使用的是哪个版本的 Bisq?\n\t●您使用的是哪种操作系统?\n\t●如果遇到操作执行失败的问题,请考虑切换到新的数据目录。\n\t有时数据目录会损坏,并导致奇怪的错误。\n详见:https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\n请熟悉纠纷处理的基本规则:\n\t●您需要在2天内答复 {0} 的请求。\n\t●调解员会在2天之内答复,仲裁员会在5天之内答复。\n\t●纠纷的最长期限为14天。\n\t●你需要与仲裁员合作,提供他们为你的案件所要求的信息。\n\t●当您第一次启动应用程序时,您接受了用户协议中争议文档中列出的规则。\n\n您可以通过 {2} 了解有关纠纷处理的更多信息
support.systemMsg=系统消息:{0}
support.youOpenedTicket=您创建了帮助请求。\n\n{0}\n\nBisq 版本:{1}
support.youOpenedDispute=您创建了一个纠纷请求。\n\n{0}\n\nBisq 版本:{1}
-support.peerOpenedTicket=您的交易对象创建了一个纠纷。\n\n{0}
-support.peerOpenedDispute=您的交易对象创建了一个纠纷\n\n{0}
+support.youOpenedDisputeForMediation=您创建了一个调解请求。\n\n{0}\n\nBisq 版本:{1}
+support.peerOpenedTicket=您的同伴因技术问题获取帮助。\n\n{0}\n\nBisq 版本:{1}
+support.peerOpenedDispute=您的交易伙伴创建了一个纠纷请求。\n\n{0}\n\nBisq 版本:{1}
+support.peerOpenedDisputeForMediation=您的交易伙伴创建了一个调解请求。\n\n{0}\n\nBisq 版本:{1}
+support.mediatorsDisputeSummary=系统消息:\n调解纠纷总结:\n{0}
+support.mediatorsAddress=仲裁员的节点地址:{0}
####################################################################
@@ -843,6 +913,7 @@ setting.preferences.addAltcoin=添加数字货币
setting.preferences.displayOptions=显示选项
setting.preferences.showOwnOffers=在委托列表中显示我的委托
setting.preferences.useAnimations=使用动画
+setting.preferences.useDarkMode=使用夜间模式(beta)
setting.preferences.sortWithNumOffers=使用“委托ID/交易ID”筛选列表
setting.preferences.resetAllFlags=重置所有“不再提示”的提示
setting.preferences.reset=重置
@@ -852,7 +923,7 @@ settings.preferences.selectCurrencyNetwork=选择网络
setting.preferences.daoOptions=DAO 选项
setting.preferences.dao.resync.label=从 genesis tx 重构 DAO 状态
setting.preferences.dao.resync.button=重新同步
-setting.preferences.dao.resync.popup=应用程序重启后,将从种子节点重新加载 P2P 网络整合数据,并从 genesis 交易重构 BSQ 协议一致的状态。
+setting.preferences.dao.resync.popup=应用程序重新启动后,Bisq 网络治理数据将从种子节点重新加载,而 BSQ 同步状态将从初始交易中重新构建。
setting.preferences.dao.isDaoFullNode=以 DAO 全节点运行 Bisq
setting.preferences.dao.rpcUser=RPC 用户名
setting.preferences.dao.rpcPw=PRC 密码
@@ -862,7 +933,7 @@ setting.preferences.dao.fullNodeInfo.ok=打开文档页面
setting.preferences.dao.fullNodeInfo.cancel=不,我坚持使用 lite 节点模式
settings.net.btcHeader=比特币网络
-settings.net.p2pHeader=P2P 网络
+settings.net.p2pHeader=Bisq 网络
settings.net.onionAddressLabel=我的匿名地址
settings.net.btcNodesLabel=使用自定义比特币主节点
settings.net.bitcoinPeersLabel=已连接节点
@@ -887,6 +958,10 @@ settings.net.receivedBytesColumn=接收
settings.net.peerTypeColumn=节点类型
settings.net.openTorSettingsButton=打开 Tor 设置
+settings.net.versionColumn=版本
+settings.net.subVersionColumn=破坏?
+settings.net.heightColumn=高度
+
settings.net.needRestart=您需要重启应用程序以同意这次变更。\n您需要现在重启吗?
settings.net.notKnownYet=至今未知...
settings.net.sentReceived=发送 {0},接收 {1}
@@ -928,6 +1003,8 @@ setting.about.subsystems.val=网络版本:{0};P2P 消息版本:{1};本
####################################################################
account.tab.arbitratorRegistration=仲裁员注册
+account.tab.mediatorRegistration=调解员注册
+account.tab.refundAgentRegistration=退款助理注册
account.tab.account=账户
account.info.headline=欢迎来到 Bisq 账户
account.info.msg=在这里你可以设置交易账户的法定货币及数字货币,选择仲裁员和备份你的钱包及账户数据。\n\n当你开始运行 Bisq 就已经创建了一个空的比特币钱包。\n\n我们建议你在充值之前写下你比特币钱包的还原密钥(在左边的列表)和考虑添加密码。在“资金”选项中管理比特币存入和提现。\n\n隐私 & 安全:\nBisq 是一个去中心化的交易所 – 意味着您的所有数据都保存在您的电脑上,没有服务器,我们无法访问您的个人信息,您的资金,甚至您的 IP 地址。如银行账号、数字货币、比特币地址等数据只分享给与您交易的人,以实现您发起的交易(如果有争议,仲裁员将会看到您的交易数据)。
@@ -939,42 +1016,39 @@ account.menu.seedWords=钱包密钥
account.menu.backup=备份
account.menu.notifications=通知
+## TODO should we rename the following to a gereric name?
account.arbitratorRegistration.pubKey=公钥
-account.arbitratorRegistration.register=注册仲裁员
-account.arbitratorRegistration.revoke=撤销注册
-account.arbitratorRegistration.info.msg=请注意,撤销后需要保留15天,因为可能有交易正在以你作为仲裁员。最大允许的交易期限为8天,纠纷过程最多可能需要7天。
+account.arbitratorRegistration.register=注册
+account.arbitratorRegistration.registration={0} 注册
+account.arbitratorRegistration.revoke=撤销
+account.arbitratorRegistration.info.msg=请注意,撤销后需要保留15天,因为可能有交易正在以你作为 {0}。最大允许的交易期限为8天,纠纷过程最多可能需要7天。
account.arbitratorRegistration.warn.min1Language=您需要设置至少1种语言。\n我们已经为您添加了默认语言。
-account.arbitratorRegistration.removedSuccess=您已从 P2P 网络成功删除您的仲裁员。
+account.arbitratorRegistration.removedSuccess=您已从 Bisq 网络成功删除仲裁员注册信息。
account.arbitratorRegistration.removedFailed=无法删除仲裁员。{0}
-account.arbitratorRegistration.registerSuccess=您已从 P2P 网络成功注册您的仲裁员。
+account.arbitratorRegistration.registerSuccess=您已从 Bisq 网络成功注册您的仲裁员。
account.arbitratorRegistration.registerFailed=无法注册仲裁员。{0}
-account.arbitratorSelection.minOneArbitratorRequired=您需要设置至少1种语言。\n我们已经为您添加了默认语言。
-account.arbitratorSelection.whichLanguages=您使用哪种语言?
-account.arbitratorSelection.whichDoYouAccept=您能接受哪位仲裁员
-account.arbitratorSelection.autoSelect=自动匹配语言选定仲裁员
-account.arbitratorSelection.regDate=注册时间
-account.arbitratorSelection.languages=语言
-account.arbitratorSelection.cannotSelectHimself=仲裁员不能选定自己作为交易中的仲裁。
-account.arbitratorSelection.noMatchingLang=匹配不到语言。
-account.arbitratorSelection.noLang=您可以选择至少说1种常用语言的仲裁员。
-account.arbitratorSelection.minOne=您至少需要选择一名仲裁员。
-
account.altcoin.yourAltcoinAccounts=您的数字货币账户
-account.altcoin.popup.wallet.msg=请确保您按照 {1} 网页上所述使用 {0} 钱包的要求。\n使用集中式交易所的钱包,您无法控制密钥或使用不兼容的钱包软件,可能会导致交易资金的流失!\n仲裁员不是 {2} 专家,在这种情况下不能帮助。
+account.altcoin.popup.wallet.msg=请确保您按照 {1} 网页上所述使用 {0} 钱包的要求。\n使用集中式交易所的钱包,您无法控制密钥或使用不兼容的钱包软件,可能会导致交易资金的流失!\n调解员或仲裁员不是 {2} 专家,在这种情况下不能帮助。
account.altcoin.popup.wallet.confirm=我了解并确定我知道我需要哪种钱包。
-account.altcoin.popup.arq.msg=在 Bisq 上交易 ARQ 需要您了解并满足以下要求:\n\n要发送 ARQ ,您需要使用官方的 ArQmA GUI 钱包或启用 store-tx-info 标志的 ArQmA CLI 钱包(在新版本中是默认的)。请确保您可以访问Tx密钥,因为在纠纷状态时需要。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高级>证明/检查页面。\n\n在普通的区块链浏览器中,这种交易是不可验证的。\n\n如有纠纷,你须向仲裁员提供下列资料:\n \n- Tx私钥\n- 交易哈希\n- 接收者的公开地址\n\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。如果发生纠纷,ARQ 发送方负责向仲裁员提供 ARQ 转账的验证。\n\n不需要支付 ID,只需要普通的公共地址。\n \n如果您对该流程不确定,请访问 ArQmA Discord 频道(https://discord.gg/s9BQpJT)或 ArQmA 论坛(https://labs.arqma.com)了解更多信息。
-account.altcoin.popup.xmr.msg=在 Bisq 上交易 XMR 需要您了解并满足以下要求:\n\n要发送 XMR ,您需要使用官方的 Monero GUI 钱包或 Monero CLI 钱包,并启用 store-tx-info 标志(在新版本中是默认的)。请确保您可以访问Tx密钥,因为如果发生纠纷这是需要的。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高级>证明/检查页面。\n\n除了 XMR checktx 工具(https://xmr llcoins.net/checktx.html),还可以在钱包中完成验证。\nmonero-wallet-cli:使用命令(check_tx_key)。 \nmonero-wallet-gui:在高级>证明/检查页面\n\n在普通的区块浏览器,这种转移是不可验证的。\n\n如有纠纷,你须向仲裁员提供下列资料: \n- Tx私钥\n- 交易哈希\n- 接收者的公开地址\n\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。如果发生纠纷,XMR 发送方负责向仲裁员提供 XMR 转账的验证。\n\n如果您对该流程不确定,请访问(https://www.getmonero.org/resources/user-guides/prove-payment.html)或 Monero 论坛(https://forum.getmonero.org)了解更多信息。
-account.altcoin.popup.blur.msg=在 Bisq 上交易 BLUR 需要你了解并满足以下要求:\n\n要发送匿名信息你必须使用匿名网络 CLI 或 GUI 钱包。\n如果您正在使用 CLI 钱包,在传输发送后将显示交易哈希(tx ID)。您必须保存此信息。在发送传输之后,您必须立即使用“get_tx_key”命令来检索交易私钥。如果未能执行此步骤,以后可能无法检索密钥。\n\n如果您使用 Blur Network GUI 钱包,可以在“历史”选项卡中方便地找到交易私钥和交易 ID。发送后立即定位感兴趣的交易。单击包含交易的框的右下角的“?”符号。您必须保存此信息。\n\n如果仲裁是必要的,您必须向仲裁员提供以下信息:1.)交易ID,2.)交易私钥,3.)收件人地址。仲裁程序将使用 BLUR 事务查看器(https://blur.cash/#tx-viewer)验证 BLUR 转账。\n\n未能向仲裁员提供必要的信息将导致败诉。在所有争议的情况下,匿名发送方承担100%的责任来向仲裁员核实交易。\n\n如果你不了解这些要求,不要在 Bisq 上交易。首先,在 Blur Network Discord 中寻求帮助(https://discord.gg/dMWaqVW)。
-account.altcoin.popup.cash2.msg=在 Bisq 上交易 CASH2 需要您了解并满足以下要求:\n\n要发送 CASH2,您必须使用 CASH2 钱包版本 3 或更高。\n\n在发送交易之后,将显示交易ID。您必须保存此信息。在发送交易之后,必须立即在 simplewallet 中使用命令“getTxKey”来检索交易密钥。\n\n如果仲裁是必要的,您必须向仲裁员提供以下信息:1)交易 ID,2)交易密钥,3)收件人的 CASH2 地址。仲裁员将使用 CASH2 区块资源管理器(https://blocks.cash2.org)验证 CASH2 转账。\n\n未能向仲裁员提供必要的信息将导致败诉。在所有发生争议的情况下,在向仲裁员核实交易时,CASH2 的发送方承担 100% 的责任。\n\n如果你不理解这些要求,不要在 Bisq 上交易。首先,在 Cash2 Discord 中寻求帮助(https://discord.gg/FGfXAYN)。
-account.altcoin.popup.qwertycoin.msg=在 Bisq 上交易 Qwertycoin 需要您了解并满足以下要求:\n\n要发送 Qwertycoin,您必须使用 Qwertycoin 钱包版本 5.1.3 或更高。\n\n在发送交易之后,将显示交易ID。您必须保存此信息。在发送交易之后,必须立即在 simplewallet 中使用命令“get_Tx_Key”来检索交易密钥。\n\n如果仲裁是必要的,您必须向仲裁员提供以下信息::1)交易 ID,、2)交易密钥,3)收件人的 QWC 地址。仲裁员将使用 QWC 区块资源管理器(https://explorer.qwertycoin.org)验证 QWC 转账。\n\n未能向仲裁员提供必要的信息将导致败诉。在所有发生争议的情况下,在向仲裁员核实交易时,QWC 的发送方承担 100% 的责任。\n\n如果你不理解这些要求,不要在 Bisq 上交易。首先,在 QWC Discord 中寻求帮助(https://discord.gg/rUkfnpC)。
-account.altcoin.popup.drgl.msg=在 Bisq 上交易 Dragonglass 需要您了解并满足以下要求:\n\n由于 Dragonglass 提供了隐私保护,所以交易不能在公共区块链上验证。如果需要,您可以通过使用您的 TXN-Private-Key 来证明您的付款。\nTXN-Private 密匙是自动生成的一次性密匙,用于只能从 DRGL 钱包中访问的每个交易。\n要么通过 DRGL-wallet GUI(内部交易细节对话框),要么通过 Dragonglass CLI simplewallet(使用命令“get_tx_key”)。\n\n两者都需要 DRGL 版本的“Oathkeeper”或更高版本。\n\n如有争议,你必须向仲裁员提供下列资料:\n \n- txn-Privite-ket\n- 交易哈希 \n- 接收者的公开地址\n\n付款验证可以使用上面的数据作为输入(http://drgl.info/#check_txn)。\n\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。Dragonglass 发送方负责在发生争议时向仲裁员提供 DRGL 转账的验证。不需要使用付款 ID。\n\n如果您对这个过程的任何部分都不确定,请访问(http://discord.drgl.info)上的 Dragonglass 寻求帮助。
-account.altcoin.popup.ZEC.msg=当使用 Zcash 时,您只能使用透明地址(以 t 开头),而不能使用 z 地址(私有),因为仲裁程序无法使用 z 地址验证交易。
-account.altcoin.popup.XZC.msg=在使用 Zcoin 时,您只能使用透明的(可跟踪的)地址,而不能使用不可跟踪的地址,因为仲裁程序无法在区块资源管理器中使用不可跟踪的地址验证交易。
+account.altcoin.popup.upx.msg=在 Bisq 上交易 UPX 需要您了解并满足以下要求:\n\n要发送 UPX ,您需要使用官方的 UPXmA GUI 钱包或启用 store-tx-info 标志的 UPXmA CLI 钱包(在新版本中是默认的)。请确保您可以访问Tx密钥,因为在纠纷状态时需要。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高级>证明/检查页面。\n\n在普通的区块链浏览器中,这种交易是不可验证的。\n\n如有纠纷,你须向仲裁员提供下列资料:\n \n- Tx私钥\n- 交易哈希\n- 接收者的公开地址\n\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。如果发生纠纷,UPX 发送方负责向仲裁员提供 UPX 转账的验证。\n\n不需要支付 ID,只需要普通的公共地址。\n \n如果您对该流程不确定,请访问 UPXmA Discord 频道(https://discord.gg/vhdNSrV)或 Telegram 交流群(https://t.me/uplexaOfficial)了解更多信息。\n\n
+account.altcoin.popup.arq.msg=在 Bisq 上交易 ARQ 需要您了解并满足以下要求:\n\n要发送 ARQ ,您需要使用官方的 ArQmA GUI 钱包或启用 store-tx-info 标志的 ArQmA CLI 钱包(在新版本中是默认的)。请确保您可以访问Tx密钥,因为在纠纷状态时需要。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高级>证明/检查页面。\n\n在普通的区块链浏览器中,这种交易是不可验证的。\n\n如有纠纷,你须向调解员或仲裁员提供下列资料:\n\n- Tx私钥\n- 交易哈希\n- 接收者的公开地址\n\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。如果发生纠纷,ARQ 发送方负责向调解员或仲裁员提供 ARQ 转账的验证。\n\n不需要交易 ID,只需要普通的公共地址。\n\n如果您对该流程不确定,请访问 ArQmA Discord 频道(https://discord.gg/s9BQpJT)或 ArQmA 论坛(https://labs.arqma.com)了解更多信息。
+account.altcoin.popup.xmr.msg=在 Bisq 上交易 XMR 需要您了解并满足以下要求:\n\n要发送 XMR ,您需要使用官方的 Monero GUI 钱包或 Monero CLI 钱包,并启用 store-tx-info 标志(在新版本中是默认的)。请确保您可以访问Tx密钥,因为如果发生纠纷这是需要的。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高级>证明/检查页面。\n\n除了 XMR checktx 工具(https://xmr llcoins.net/checktx.html),还可以在钱包中完成验证。\nmonero-wallet-cli:使用命令(check_tx_key)。\nmonero-wallet-gui:在高级>证明/检查页面\n\n在普通的区块浏览器,这种转移是不可验证的。\n\n如有纠纷,你须向调解员或仲裁员提供下列资料:\n- Tx私钥\n- 交易哈希\n- 接收者的公开地址\n\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。如果发生纠纷,XMR 发送方负责向调解员或仲裁员提供 XMR 转账的验证。\n\n如果您对该流程不确定,请访问(https://www.getmonero.org/resources/user-guides/prove-payment.html)或 Monero 论坛(https://forum.getmonero.org)了解更多信息。
+# suppress inspection "TrailingSpacesInProperty"
+account.altcoin.popup.msr.msg=区块链浏览器在 Bisq 上交易 XMR 需要您了解并满足以下要求:\n\n发送MSR时,您需要使用官方的 Masari GUI 钱包、启用store-tx-info标记的Masari CLI钱包(默认启用)或Masari 网页钱包(https://wallet.getmasari.org)。请确保您可以访问的 tx 密钥,因为如果发生纠纷这是需要的。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高级>证明/检查页面。\n\nMasari 网页钱包(前往 帐户->交易历史和查看您发送的交易细节)\n\n验证可以在钱包中完成。\nmonero-wallet-cli:使用命令(check_tx_key)。\nmonero-wallet-gui:在高级>证明/检查页面\n验证可以在区块浏览器中完成\n打开区块浏览器(https://explorer.getmasari.org),使用搜索栏查找您的事务哈希。\n一旦找到交易,滚动到底部的“证明发送”区域,并填写所需的详细信息。\n如有纠纷,你须向调解员或仲裁员提供下列资料:\n- Tx私钥\n- 交易哈希\n- 接收者的公开地址\n\n不需要交易 ID,只需要正常的公共地址。\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。如果发生纠纷,XMR 发送方负责向调解员或仲裁员提供 XMR 转账的验证。\n\n如果您对该流程不确定,请访问官方的 Masari Discord(https://discord.gg/sMCwMqs)上寻求帮助。
+account.altcoin.popup.blur.msg=在 Bisq 上交易 BLUR 需要你了解并满足以下要求:\n\n要发送匿名信息你必须使用匿名网络 CLI 或 GUI 钱包。\n如果您正在使用 CLI 钱包,在传输发送后将显示交易哈希(tx ID)。您必须保存此信息。在发送传输之后,您必须立即使用“get_tx_key”命令来检索交易私钥。如果未能执行此步骤,以后可能无法检索密钥。\n\n如果您使用 Blur Network GUI 钱包,可以在“历史”选项卡中方便地找到交易私钥和交易 ID。发送后立即定位感兴趣的交易。单击包含交易的框的右下角的“?”符号。您必须保存此信息。\n\n如果仲裁是必要的,您必须向调解员或仲裁员提供以下信息:1.)交易ID,2.)交易私钥,3.)收件人地址。调解或仲裁程序将使用 BLUR 事务查看器(https://blur.cash/#tx-viewer)验证 BLUR 转账。\n\n未能向调解员或仲裁员提供必要的信息将导致败诉。在所有争议的情况下,匿名发送方承担100%的责任来向调解员或仲裁员核实交易。\n\n如果你不了解这些要求,不要在 Bisq 上交易。首先,在 Blur Network Discord 中寻求帮助(https://discord.gg/dMWaqVW)。
+account.altcoin.popup.solo.msg=在 Bisq 上交易 Solo 需要您了解并满足以下要求:\n\n要发送 Solo,您必须使用 Solo CLI 网络钱包版本 5.1.3 或更高。\n\n如果您使用的是CLI钱包,则在发送交易之后,将显示交易ID。您必须保存此信息。在发送交易之后,您必须立即使用'get_tx_key'命令来检索交易密钥。如果未能执行此步骤,则以后可能无法检索密钥。\n\n如果仲裁是必要的,您必须向调解员或仲裁员提供以下信息:1)交易 ID,、2)交易密钥,3)收件人的地址。调解员或仲裁员将使用 Solo 区块资源管理器(https://explorer.Solo.org)搜索交易然后使用“发送证明”功能(https://explorer.minesolo.com/)\n\n未能向调解员或仲裁员提供必要的信息将导致败诉。在所有发生争议的情况下,在向调解员或仲裁员核实交易时,QWC 的发送方承担 100% 的责任。\n\n如果你不理解这些要求,不要在 Bisq 上交易。首先,在 Solo Discord 中寻求帮助(https://discord.minesolo.com/)。\n\n
+account.altcoin.popup.cash2.msg=在 Bisq 上交易 CASH2 需要您了解并满足以下要求:\n\n要发送 CASH2,您必须使用 CASH2 钱包版本 3 或更高。\n\n在发送交易之后,将显示交易ID。您必须保存此信息。在发送交易之后,必须立即在 simplewallet 中使用命令“getTxKey”来检索交易密钥。\n\n如果仲裁是必要的,您必须向调解员或仲裁员提供以下信息:1)交易 ID,2)交易密钥,3)收件人的 CASH2 地址。调解员或仲裁员将使用 CASH2 区块资源管理器(https://blocks.cash2.org)验证 CASH2 转账。\n\n未能向调解员或仲裁员提供必要的信息将导致败诉。在所有发生争议的情况下,在向调解员或仲裁员核实交易时,CASH2 的发送方承担 100% 的责任。\n\n如果你不理解这些要求,不要在 Bisq 上交易。首先,在 Cash2 Discord 中寻求帮助(https://discord.gg/FGfXAYN)。
+account.altcoin.popup.qwertycoin.msg=在 Bisq 上交易 Qwertycoin 需要您了解并满足以下要求:\n\n要发送 Qwertycoin,您必须使用 Qwertycoin 钱包版本 5.1.3 或更高。\n\n在发送交易之后,将显示交易ID。您必须保存此信息。在发送交易之后,必须立即在 simplewallet 中使用命令“get_Tx_Key”来检索交易密钥。\n\n如果仲裁是必要的,您必须向调解员或仲裁员提供以下信息::1)交易 ID,、2)交易密钥,3)收件人的 QWC 地址。调解员或仲裁员将使用 QWC 区块资源管理器(https://explorer.qwertycoin.org)验证 QWC 转账。\n\n未能向调解员或仲裁员提供必要的信息将导致败诉。在所有发生争议的情况下,在向调解员或仲裁员核实交易时,QWC 的发送方承担 100% 的责任。\n\n如果你不理解这些要求,不要在 Bisq 上交易。首先,在 QWC Discord 中寻求帮助(https://discord.gg/rUkfnpC)。
+account.altcoin.popup.drgl.msg=在 Bisq 上交易 Dragonglass 需要您了解并满足以下要求:\n\n由于 Dragonglass 提供了隐私保护,所以交易不能在公共区块链上验证。如果需要,您可以通过使用您的 TXN-Private-Key 来证明您的付款。\nTXN-Private 密匙是自动生成的一次性密匙,用于只能从 DRGL 钱包中访问的每个交易。\n要么通过 DRGL-wallet GUI(内部交易细节对话框),要么通过 Dragonglass CLI simplewallet(使用命令“get_tx_key”)。\n\n两者都需要 DRGL 版本的“Oathkeeper”或更高版本。\n\n如有争议,你必须向调解员或仲裁员提供下列资料:\n\n- txn-Privite-ket\n- 交易哈希 \n- 接收者的公开地址\n\n付款验证可以使用上面的数据作为输入(http://drgl.info/#check_txn)。\n\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。Dragonglass 发送方负责在发生争议时向调解员或仲裁员提供 DRGL 转账的验证。不需要使用付款 ID。\n\n如果您对这个过程的任何部分都不确定,请访问(http://discord.drgl.info)上的 Dragonglass 寻求帮助。
+account.altcoin.popup.ZEC.msg=当使用 Zcash 时,您只能使用透明地址(以 t 开头),而不能使用 z 地址(私有),因为调解员或仲裁员无法使用 z 地址验证交易。
+account.altcoin.popup.XZC.msg=在使用 Zcoin 时,您只能使用透明的(可跟踪的)地址,而不能使用不可跟踪的地址,因为调解员或仲裁员无法在区块资源管理器中使用不可跟踪的地址验证交易。
account.altcoin.popup.grin.msg=GRIN 需要发送方和接收方之间的交互过程来创建交易。请确保遵循 GRIN 项目网页中的说明,以可靠地发送和接收 GRIN(接收方需要在线,或至少在一定时间内在线)。\n \nBisq 只支持 Grinbox(Wallet713)钱包 URL 格式。\n\nGRIN 发送者需要提供他们已成功发送 GRIN 的证明。如果钱包不能提供证明,一个潜在的纠纷将被解决,有利于露齿微笑的接受者。请确保您使用了最新的支持交易证明的 Grinbox 软件,并且您了解传输和接收 GRIN 的过程以及如何创建证明。\n请参阅 https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only,以获得关于 Grinbox 证明工具的更多信息。\n
account.altcoin.popup.beam.msg=BEAM 需要发送方和接收方之间的交互过程来创建交易。\n\n\n确保遵循 BEAM 项目网页的指示可靠地发送和接收 BEAM(接收方需要在线,或者至少在一定的时间范围内在线)。\n\nBEAM 发送者需要提供他们成功发送 BEAM 的证明。一定要使用钱包软件,可以产生这样的证明。如果钱包不能提供证据,一个潜在的纠纷将得到解决,有利于 BEAM 接收者。
-account.altcoin.popup.pars.msg=在 Bisq 上交易 ParsiCoin 需要您了解并满足以下要求:\n\n要发送 PARS ,您必须使用官方 ParsiCoin Wallet 版本 3.0.0 或更高。\n\n您可以在 GUI 钱包(ParsiPay)的交易部分检查您的交易哈希和交易键,您需要右键单击“交易”,然后单击“显示详情”。\n\n如果仲裁是 100% 必要的,您必须向仲裁人员提供以下内容:1)交易哈希,2)交易密钥,以及3)接收方的 PARS 地址。仲裁程序将使用 ParsiCoin 区块链浏览器 (http://explorer.parsicoin.net/#check_payment)验证 PARS 传输。\n\n如果你不了解这些要求,不要在Bisq上交易。首先,在 ParsiCoin Discord寻求帮助(https://discord.gg/c7qmFNh)。
+account.altcoin.popup.pars.msg=在 Bisq 上交易 ParsiCoin 需要您了解并满足以下要求:\n\n要发送 PARS ,您必须使用官方 ParsiCoin Wallet 版本 3.0.0 或更高。\n\n您可以在 GUI 钱包(ParsiPay)的交易部分检查您的交易哈希和交易键,您需要右键单击“交易”,然后单击“显示详情”。\n\n如果仲裁是 100% 必要的,您必须向调解员或仲裁员提供以下内容:1)交易哈希,2)交易密钥,以及3)接收方的 PARS 地址。调解员或仲裁员将使用 ParsiCoin 区块链浏览器 (http://explorer.parsicoin.net/#check_payment)验证 PARS 传输。\n\n如果你不了解这些要求,不要在 Bisq 上交易。首先,在 ParsiCoin Discord 寻求帮助(https://discord.gg/c7qmFNh)。
+
+account.altcoin.popup.blk-burnt.msg=要交易烧毁的货币,你需要知道以下几点:\n\n烧毁的货币是不能花的。要在 Bisq 上交易它们,输出脚本需要采用以下形式:OP_RETURN OP_PUSHDATA,后跟相关的数据字节,这些字节经过十六进制编码后构成地址。例如,地址为666f6f(在UTF-8中的"foo")的烧毁的货币将有以下脚本:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\n要创建烧毁的货币,您可以使用“烧毁”RPC命令,它在一些钱包可用。\n\n对于可能的情况,可以查看 https://ibo.laboratorium.ee\n\n因为烧毁的货币是不能用的,所以不能重新出售。“出售”烧毁的货币意味着焚烧初始的货币(与目的地地址相关联的数据)。\n\n如果发生争议,BLK 卖方需要提供交易哈希。
account.fiat.yourFiatAccounts=您的法定货币账户
@@ -1218,6 +1292,7 @@ dao.param.BONDED_ROLE_FACTOR=担保角色对 BSQ 的影响
dao.param.ISSUANCE_LIMIT=每个周期的 BSQ 发行限额
dao.param.currentValue=当前值:{0}
+dao.param.currentAndPastValue=当前余额:{0}(提案时的余额:{1})
dao.param.blocks={0} 区块
dao.results.cycle.duration.label={0} 的周期
@@ -1225,7 +1300,7 @@ dao.results.cycle.duration.value={0} 区块
dao.results.cycle.value.postFix.isDefaultValue=(默认值)
dao.results.cycle.value.postFix.hasChanged=(在投票中更改)
-dao.results.invalidVotes=在那个投票周期中,我们有无效的投票。如果投票没有在 P2P 网络中很好地分布,就会发生这种情况。\n{0}
+dao.results.invalidVotes=在那个投票周期中,我们有无效的投票。如果投票没有在 Bisq 网络中很好地分布,就会发生这种情况。\n{0}
# suppress inspection "UnusedProperty"
dao.phase.PHASE_UNDEFINED=未定义
@@ -1503,7 +1578,7 @@ dao.proposal.create.publish=发布提案
dao.proposal.create.publishing=正在发布提案中...
dao.proposal=提案
dao.proposal.display.type=提议类型
-dao.proposal.display.name=名称/昵称
+dao.proposal.display.name=确切的 GitHub 的用户名
dao.proposal.display.link=连接到详情
dao.proposal.display.link.prompt=连接到提案
dao.proposal.display.requestedBsq=被要求的 BSQ 数量
@@ -1527,7 +1602,8 @@ dao.proposal.table.icon.tooltip.changeVote=当前投票:“{0}”。更改投
dao.proposal.display.myVote.accepted=已接受
dao.proposal.display.myVote.rejected=已拒绝
dao.proposal.display.myVote.ignored=已忽略
-dao.proposal.myVote.summary=已投票:{0};投票权重:{1}(获得的:{2} + 奖金:{3});
+dao.proposal.display.myVote.unCounted=投票结果不包括在内
+dao.proposal.myVote.summary=已投票:{0};投票权重:{1}(获得的:{2} + 奖金:{3})({4})
dao.proposal.myVote.invalid=投票无效
dao.proposal.voteResult.success=已接受
@@ -1680,6 +1756,7 @@ dao.monitor.daoState.utxoConflicts=UTXO 冲突
dao.monitor.daoState.utxoConflicts.blockHeight=区块高度:{0}
dao.monitor.daoState.utxoConflicts.sumUtxo=所有 UTXO 的总和:{0} BSQ
dao.monitor.daoState.utxoConflicts.sumBsq=所有 BSQ 的总和:{0} BSQ
+dao.monitor.daoState.checkpoint.popup=DAO 状态与网络不同步。重启之后,DAO 状态将重新同步。
dao.monitor.proposal.headline=提案状态
dao.monitor.proposal.table.headline=提案状态的哈希链
@@ -1705,6 +1782,8 @@ dao.factsAndFigures.menuItem.transactions=BSQ 交易
dao.factsAndFigures.dashboard.marketPrice=市场数据
dao.factsAndFigures.dashboard.price=最新的 BSQ/BTC 的市场价(在 Bisq)
+dao.factsAndFigures.dashboard.avgPrice90=90天平均 BSQ/BTC 交易价格
+dao.factsAndFigures.dashboard.avgPrice30=30天平均 BSQ/BTC 交易价格
dao.factsAndFigures.dashboard.marketCap=市值(基于市场价)
dao.factsAndFigures.dashboard.availableAmount=总共可用的 BSQ
@@ -1769,10 +1848,6 @@ displayUpdateDownloadWindow.download.openDir=打开下载目录
disputeSummaryWindow.title=概要
disputeSummaryWindow.openDate=工单创建时间
disputeSummaryWindow.role=交易者的角色
-disputeSummaryWindow.evidence=证据
-disputeSummaryWindow.evidence.tamperProof=防篡改证据
-disputeSummaryWindow.evidence.id=ID 验证
-disputeSummaryWindow.evidence.video=视频/截屏
disputeSummaryWindow.payout=交易金额支付
disputeSummaryWindow.payout.getsTradeAmount=BTC {0} 获得交易金额支付
disputeSummaryWindow.payout.getsAll=BTC {0} 获取全部
@@ -1792,8 +1867,13 @@ disputeSummaryWindow.reason.bank=银行
disputeSummaryWindow.summaryNotes=总结说明
disputeSummaryWindow.addSummaryNotes=添加总结说明
disputeSummaryWindow.close.button=关闭话题
-disputeSummaryWindow.close.msg=话题已关闭 {0}\n\n摘要:\n{1} 提供防篡改证据:{2}\n{3} 进行了 ID 验证:{4}\n{5} 进行了截屏或视频:{6}\nBTC 买家的支付金额:{7}\nBTC 卖家的支付金额:{8}\n\n总结说明:\n{9}
+disputeSummaryWindow.close.msg=工单已关闭 {0}\n\n摘要:\nBTC 买家的支付金额:{1}\nBTC 卖家的支付金额:{2}\n\n总结说明:\n{3}
+disputeSummaryWindow.close.nextStepsForMediation=\n\n下一个步骤:\n未完成交易,接受或拒绝建议的调解
disputeSummaryWindow.close.closePeer=你也需要关闭交易对象的话题!
+disputeSummaryWindow.close.txDetails.headline=发布交易退款
+disputeSummaryWindow.close.txDetails.buyer=买方收到{0}在地址:{1}
+disputeSummaryWindow.close.txDetails.seller=卖方收到{0}在地址:{1}
+disputeSummaryWindow.close.txDetails=费用:{0}\n{1}{2}交易费:{3}({4}satoshis/byte)\n事务大小:{5} Kb\n\n您确定要发布此事务吗?
emptyWalletWindow.headline={0} 钱包急救工具
emptyWalletWindow.info=请在紧急情况下使用,如果您无法从 UI 中访问您的资金。\n\n请注意,使用此工具时,所有未结委托将自动关闭。\n\n在使用此工具之前,请备份您的数据目录。您可以在“帐户/备份”中执行此操作。\n\n请报告我们您的问题,并在 Github 或 Bisq 论坛上提交错误报告,以便我们可以调查导致问题的原因。
@@ -1806,7 +1886,7 @@ emptyWalletWindow.openOffers.warn=您有发布的委托,如果您清空钱包
emptyWalletWindow.openOffers.yes=是的,我确定
emptyWalletWindow.sent.success=您的钱包的余额已成功转移。
-enterPrivKeyWindow.headline=只有被邀请的才能登记仲裁员
+enterPrivKeyWindow.headline=输入密钥进行注册
filterWindow.headline=编辑过滤列表
filterWindow.offers=过滤报价(用逗号“,”隔开)
@@ -1815,6 +1895,8 @@ filterWindow.accounts=过滤交易账户数据:\n格式:逗号分割的 [付
filterWindow.bannedCurrencies=过滤货币代码(用逗号“,”隔开)
filterWindow.bannedPaymentMethods=过滤支付方式 ID(用逗号“,”隔开)
filterWindow.arbitrators=过滤后的仲裁人(用逗号“,”隔开的洋葱地址)
+filterWindow.mediators=过滤后的调解员(用逗号“,”隔开的洋葱地址)
+filterWindow.refundAgents=过滤后的退款助理(用逗号“,”隔开的洋葱地址)
filterWindow.seedNode=过滤后的种子节点(用逗号“,”隔开的洋葱地址)
filterWindow.priceRelayNode=过滤后的价格中继节点(用逗号“,”隔开的洋葱地址)
filterWindow.btcNode=过滤后的比特币节点(用逗号“,”隔开的地址+端口)
@@ -1833,7 +1915,6 @@ offerDetailsWindow.offererBankId=(卖家的银行 ID/BIC/SWIFT)
offerDetailsWindow.offerersBankName=(卖家的银行名称):
offerDetailsWindow.bankId=银行 ID(例如 BIC 或者 SWIFT ):
offerDetailsWindow.countryBank=卖家银行所在国家
-offerDetailsWindow.acceptedArbitrators=接受的仲裁者
offerDetailsWindow.commitment=承诺
offerDetailsWindow.agree=我同意
offerDetailsWindow.tac=条款和条件
@@ -1883,6 +1964,7 @@ tradeDetailsWindow.tradeDate=交易时间
tradeDetailsWindow.txFee=矿工手续费
tradeDetailsWindow.tradingPeersOnion=交易对手匿名地址
tradeDetailsWindow.tradeState=交易状态
+tradeDetailsWindow.agentAddresses=仲裁员/调解员
walletPasswordWindow.headline=输入密码解锁
@@ -1945,10 +2027,11 @@ popup.warning.incompatibleDB=我们检测到不兼容的数据库文件!\n\n
popup.warning.startupFailed.twoInstances=Bisq 已经在运行。 您不能运行两个 Bisq 实例。
popup.warning.cryptoTestFailed=看起来你使用自编译的二进制文件,并且没有遵循 https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys\n\n如果不是这种情况,并且使用官方的 Bisq 二进制文件,请向 Github 页面提交错误报告。\n错误={0}
popup.warning.tradePeriod.halfReached=您与 ID {0} 的交易已达到最长交易期的一半,且仍未完成。\n\n交易期结束于 {1}\n\n请查看“业务/未完成交易”的交易状态,以获取更多信息。
-popup.warning.tradePeriod.ended=您与 ID {0} 的已达到最长交易期,且未完成。\n\n交易期结束于 {1}\n\n请查看“业务/未完成交易”的交易状态,以获取更多信息。
+popup.warning.tradePeriod.ended=您与 ID {0} 的已达到最长交易期,且未完成。\n\n交易期结束于 {1}\n\n请查看“业务/未完成交易”的交易状态,以从调解员获取更多信息。
popup.warning.noTradingAccountSetup.headline=您还没有设置交易账户
popup.warning.noTradingAccountSetup.msg=您需要设置法定货币或数字货币账户才能创建委托。\n您要设置帐户吗?
popup.warning.noArbitratorsAvailable=没有仲裁员可用。
+popup.warning.noMediatorsAvailable=没有调解员可用。
popup.warning.notFullyConnected=您需要等到您完全连接到网络\n在启动时可能需要2分钟。
popup.warning.notSufficientConnectionsToBtcNetwork=你需要等待至少有{0}个与比特币网络的连接点。
popup.warning.downloadNotComplete=您需要等待,直到丢失的比特币区块被下载完毕。
@@ -1958,8 +2041,8 @@ popup.warning.examplePercentageValue=请输入百分比数字,如 5.4% 是
popup.warning.noPriceFeedAvailable=该货币没有可用的价格。 你不能使用基于百分比的价格。\n请选择固定价格。
popup.warning.sendMsgFailed=向您的交易对象发送消息失败。\n请重试,如果继续失败报告错误。
popup.warning.insufficientBtcFundsForBsqTx=你没有足够的 BTC 资金支付这笔交易的挖矿手续费。\n请充值您的 BTC 钱包。\n缺少的资金:{0}
-popup.warning.bsqChangeBelowDustException=该交易产生的 BSQ 变化输出低于零头限制(5.46 BSQ),将被比特币网络拒绝。\n \n您需要发送更高的金额以避免更改输出(例如,通过在您的发送金额中添加零头),或者向您的钱包中添加更多的 BSQ 资金,以避免生成零头输出。\n \n零头输出为 {0}。
-popup.warning.btcChangeBelowDustException=该交易创建的更改输出低于零头限制(546 聪),将被比特币网络拒绝。\n \n您需要将零头添加到发送量中,以避免生成零头输出。\n \n零头输出为{0}。
+popup.warning.bsqChangeBelowDustException=该交易产生的 BSQ 变化输出低于零头限制(5.46 BSQ),将被比特币网络拒绝。\n\n您需要发送更高的金额以避免更改输出(例如,通过在您的发送金额中添加零头),或者向您的钱包中添加更多的 BSQ 资金,以避免生成零头输出。\n\n零头输出为 {0}。
+popup.warning.btcChangeBelowDustException=该交易创建的更改输出低于零头限制(546 聪),将被比特币网络拒绝。\n\n您需要将零头添加到发送量中,以避免生成零头输出。\n\n零头输出为{0}。
popup.warning.insufficientBsqFundsForBtcFeePayment=您没有足够的 BSQ 资金支付 BSQ 的交易费用。您可以在 BTC 支付费用,或者您需要充值您的 BSQ 钱包。你可以在 Bisq 买到 BSQ 。\n\n缺少 BSQ 资金:{0}
popup.warning.noBsqFundsForBtcFeePayment=您的 BSQ 钱包没有足够的资金支付 BSQ 的交易费用。
@@ -1993,19 +2076,36 @@ popup.shutDownInProgress.msg=关闭应用可能会花一点时间。\n请不要
popup.attention.forTradeWithId=交易 ID {0} 需要注意
-popup.roundedFiatValues.headline=新的隐私功能:全面的法定货币值
-popup.roundedFiatValues.msg=为了增加您的交易隐私,{0} 的金额是四舍五入的。\n\n根据客户端版本,您将支付或接收小数或四舍五入的值。\n\n从现在开始,这两种价值都符合贸易协定。\n\n还要注意,BTC 值会自动更改,以尽可能接近四舍五入的法定货币金额。
-
popup.info.multiplePaymentAccounts.headline=多个支付账户可用
popup.info.multiplePaymentAccounts.msg=您有多个支付帐户在这个报价中可用。请确你做了正确的选择。
-popup.dao.launch.headline=完整的愿景,实现
-popup.dao.launch.governance.title=管理
-popup.dao.launch.governance=Bisq 的交易网络已经去中心化了。\n \n有了 Bisq DAO , Bisq 的领导权现在也去中心化了,这使得 Bisq 对审查格外抗拒。
-popup.dao.launch.trading.title=交易
-popup.dao.launch.trading=交易 BSQ(源自比特币)来参与 Bisq 治理。就像 Bisq 上的其他资产一样,你可以买卖 BSQ 。
-popup.dao.launch.cheaperFees.title=更低的手续费
-popup.dao.launch.cheaperFees=使用 BSQ 以获得 90% 的交易手续费的折扣。节省资金,同时支持项目!\n\n
+popup.news.launch.headline=两个重要更新
+popup.news.launch.accountSigning.headline=账户签署
+popup.news.launch.accountSigning.description=提高0.01 BTC的法币交易限制,从签署伙伴购买 BTC。
+popup.news.launch.ntp.headline=新的交易协议
+popup.news.launch.ntp.description=新的两级争端解决系统使 Bisq 更安全,可扩展,和审查抵抗。
+
+popup.accountSigning.selectAccounts.headline=选择付款账户
+popup.accountSigning.selectAccounts.description=根据付款方式和时间点,所有与支付给买方的付款发生的争议有关的付款帐户将被选择让您签字。
+popup.accountSigning.selectAccounts.signAll=签署所有付款方式
+popup.accountSigning.selectAccounts.datePicker=选择要签署的帐户的时间点
+
+popup.accountSigning.confirmSelectedAccounts.headline=确认选定的付款帐户
+popup.accountSigning.confirmSelectedAccounts.description=根据您的输入,将选择 {0} 支付帐户。
+popup.accountSigning.confirmSelectedAccounts.button=确认付款账户
+popup.accountSigning.signAccounts.headline=确认签署付款账户
+popup.accountSigning.signAccounts.description=根据您的选择,{0} 付款帐户将被签署。
+popup.accountSigning.signAccounts.button=签署付款账户
+popup.accountSigning.signAccounts.ECKey=输入仲裁员密钥
+popup.accountSigning.signAccounts.ECKey.error=不正确的仲裁员 ECKey
+
+popup.accountSigning.success.headline=恭喜
+popup.accountSigning.success.description=所有 {0} 支付账户已成功签署!
+popup.accountSigning.generalInformation=您将在帐户页面找到所有账户的签名状态。\n\n更多信息,请访问https://docs.bisq.network/payment-methods#account-signing.
+popup.accountSigning.signedByArbitrator=您的一个付款帐户已被认证以及被仲裁员签署。交易成功后,使用此帐户将自动签署您的交易伙伴的帐户。\n\n{0}
+popup.accountSigning.signedByPeer=您的一个付款帐户已经被交易伙伴验证和签署。您的初始交易限额将被取消,您将能够在{0}天后签署其他帐户。
+popup.accountSigning.peerLimitLifted=您其中一个帐户的初始限额已被取消。\n\n{0}
+popup.accountSigning.peerSigner=您的一个帐户已足够成熟,可以签署其他付款帐户,您的一个帐户的初始限额已被取消。\n\n{0}
####################################################################
# Notifications
@@ -2071,6 +2171,7 @@ list.currency.editList=编辑币种列表
table.placeholder.noItems=最近没有可用的 {0}
table.placeholder.noData=最近没有可用数据
+table.placeholder.processingData=处理数据…
peerInfoIcon.tooltip.tradePeer=交易伙伴
@@ -2093,7 +2194,8 @@ peerInfo.title=对象资料
peerInfo.nrOfTrades=已完成交易数量
peerInfo.notTradedYet=你还没有与他交易过。
peerInfo.setTag=设置该对象的标签
-peerInfo.age=支付账户账龄
+peerInfo.age.noRisk=支付账户账龄
+peerInfo.age.chargeBackRisk=自签字
peerInfo.unknownAge=账龄未知
addressTextField.openWallet=打开您的默认比特币钱包
@@ -2154,7 +2256,7 @@ BTC_REGTEST=比特币回归测试
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=比特币测试网络(弃用)
# suppress inspection "UnusedProperty"
-BTC_DAO_BETANET=比特币测试网络(比特币主要网络)
+BTC_DAO_BETANET=Bisq DAO 测试网络(比特币主要网络)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=比特币 DAO 回归测试
@@ -2253,6 +2355,7 @@ payment.accepted.banks=接受的银行(ID)
payment.mobile=手机号码
payment.postal.address=邮寄地址
payment.national.account.id.AR=CBU 号码
+shared.accountSigningState=账户签署状态
#new
payment.altcoin.address.dyn={0} 地址
@@ -2261,7 +2364,7 @@ payment.accountNr=账号:
payment.emailOrMobile=电子邮箱或手机号码
payment.useCustomAccountName=使用自定义名称
payment.maxPeriod=最大允许交易时限
-payment.maxPeriodAndLimit=最大交易期限:{0} /最大交易限额:{1}
+payment.maxPeriodAndLimit=最大交易时间:{0}/ 最大买入:{1}/ 最大出售:{2}/账龄:{3}
payment.maxPeriodAndLimitCrypto=最大交易期限:{0}/最大交易限额:{1}
payment.currencyWithSymbol=货币:{0}
payment.nameOfAcceptedBank=接受的银行名称
@@ -2284,12 +2387,13 @@ payment.moneyGram.info=使用 MoneyGram 时,BTC 买方必须将授权号码和
payment.westernUnion.info=使用 Western Union 时,BTC 买方必须通过电子邮件将 MTCN(运单号)和收据照片发送给 BTC 卖方。收据上必须清楚地显示卖方的全名、城市、国家和金额。买方将在交易过程中显示卖方的电子邮件。
payment.halCash.info=使用 HalCash 时,BTC 买方需要通过手机短信向 BTC 卖方发送 HalCash 代码。\n\n请确保不要超过银行允许您用半现金汇款的最高金额。每次取款的最低金额是 10 欧元,最高金额是 10 欧元。金额是 600 欧元。对于重复取款,每天每个接收者 3000 欧元,每月每个接收者 6000 欧元。请与您的银行核对这些限额,以确保它们使用与此处所述相同的限额。\n\n提现金额必须是 10 欧元的倍数,因为您不能从 ATM 机提取其他金额。 create-offer 和 take-offer 屏幕中的 UI 将调整 BTC 金额,使 EUR 金额正确。你不能使用基于市场的价格,因为欧元的数量会随着价格的变化而变化。\n
payment.limits.info=请注意,所有银行转账都有一定的退款风险。\n\n为了降低这一风险,Bisq 基于两个因素对每笔交易设置了限制:\n\n1. 使用的付款方法的预估退款风险水平\n2. 您的付款方式的账龄\n\n您现在创建的帐户是新的,它的账龄为零。随着你的账户在两个月的时间里增长,你的每笔交易限额也会随之增长:\n\n●在第一个月,您的每笔交易限额为 {0}\n●在第二个月,您的每笔交易限额将为 {1}\n●第二个月后,您的每笔交易限额为 {2}\n\n请注意,您可以交易的总次数没有限制。
+payment.limits.info.withSigning=为了降低这一风险,Bisq 基于两个因素对每笔交易设置了限制:\n\n1. 使用的付款方法的预估退款风险水平\n2. 您的付款方式的账龄\n\n您刚刚创建的这个支付帐户有一定的退款风险,而且还没有仲裁员或受信任的伙伴签署,所以它只能在每笔交易中购买 {0} 。签署后,购买限额将增加如下:\n\n●在签署前,以及签署后30天内,您每笔交易的购买限额将为 {0}\n●在签署后的第二个月,您的每笔交易限额将为 {1}\n●在签署后第二个月后,您的每笔交易限额为 {2}\n\n销售限额不受帐户签署的影响,并且仅随着账龄的增加而增加。更多信息请访问 https://docs.bisq.network/payment-methods#account-signing。\n\n请注意,您可以交易的总次数没有限制。
payment.cashDeposit.info=请确认您的银行允许您将现金存款汇入他人账户。例如,美国银行和富国银行不再允许此类存款。
payment.revolut.info=请确保您用于您的 Revolut 账户的电话号码是注册在 Revolut 上的,否则 BTC 买家无法将资金发送给您。
-payment.usPostalMoneyOrder.info=汇款单是 Bisq 上比较私人的法定货币购买方式之一。\n\n但是,请注意与它们的使用相关的潜在增加的风险。如果汇款单被盗, Bisq 将不承担任何责任,在这种情况下,仲裁员将把 BTC 判给汇款单的发送方,前提是他们能够提供跟踪信息和收据。寄件人最好在汇款单上写上卖方的名称,以减低汇款单被他人兑现的风险。
+payment.usPostalMoneyOrder.info=汇款单是 Bisq 上比较私人的法定货币购买方式之一。\n\n但是,请注意与它们的使用相关的潜在增加的风险。如果汇款单被盗, Bisq 将不承担任何责任,在这种情况下,调解员或仲裁员将把 BTC 判给汇款单的发送方,前提是他们能够提供跟踪信息和收据。寄件人最好在汇款单上写上卖方的名称,以减低汇款单被他人兑现的风险。
payment.f2f.contact=联系方式
payment.f2f.contact.prompt=您希望如何与交易伙伴联系?(电子邮箱、电话号码、…)
@@ -2299,11 +2403,15 @@ payment.f2f.optionalExtra=可选的附加信息
payment.f2f.extra=附加信息
payment.f2f.extra.prompt=交易方可以定义“条款和条件”或添加公共联系信息。它将与报价一同显示。
-payment.f2f.info=与网上交易相比,“面对面”交易有不同的规则,也有不同的风险。\n\n主要区别是:\n●交易伙伴需要使用他们提供的联系方式交换关于会面地点和时间的信息。\n●交易双方需要携带笔记本电脑,在会面地点确认“已发送付款”和“已收到付款”。\n●如果交易方有特殊的“条款和条件”,他们必须在账户的“附加信息”文本框中声明这些条款和条件。\n●在发生争议时,仲裁员不能提供太多帮助,因为通常很难获得有关会面上所发生情况的篡改证据。在这种情况下,BTC 资金可能会被无限期锁定,或者直到交易双方达成协议。\n \n为确保您完全理解“面对面”交易的不同之处,请阅读以下说明和建议:“https://docs.bisq.network/trading-rules.html#f2f-trading”
+payment.f2f.info=与网上交易相比,“面对面”交易有不同的规则,也有不同的风险。\n\n主要区别是:\n●交易伙伴需要使用他们提供的联系方式交换关于会面地点和时间的信息。\n●交易双方需要携带笔记本电脑,在会面地点确认“已发送付款”和“已收到付款”。\n●如果交易方有特殊的“条款和条件”,他们必须在账户的“附加信息”文本框中声明这些条款和条件。\n●在发生争议时,调解员或仲裁员不能提供太多帮助,因为通常很难获得有关会面上所发生情况的篡改证据。在这种情况下,BTC 资金可能会被无限期锁定,或者直到交易双方达成协议。\n\n为确保您完全理解“面对面”交易的不同之处,请阅读以下说明和建议:“https://docs.bisq.network/trading-rules.html#f2f-trading”
payment.f2f.info.openURL=打开网页
-payment.f2f.offerbook.tooltip.countryAndCity=县市:{0} / {1}
+payment.f2f.offerbook.tooltip.countryAndCity=国家/城市:{0} / {1}
payment.f2f.offerbook.tooltip.extra=附加信息:{0}
+payment.japan.bank=银行
+payment.japan.branch=分行
+payment.japan.account=账户
+payment.japan.recipient=名称
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -2317,6 +2425,7 @@ CASH_DEPOSIT=现金/ATM 存款
MONEY_GRAM=MoneyGram
WESTERN_UNION=西联汇款
F2F=面对面(当面交易)
+JAPAN_BANK=Japan Bank Furikomi
# suppress inspection "UnusedProperty"
NATIONAL_BANK_SHORT=国内银行
@@ -2334,6 +2443,8 @@ MONEY_GRAM_SHORT=MoneyGram
WESTERN_UNION_SHORT=西联汇款
# suppress inspection "UnusedProperty"
F2F_SHORT=F2F
+# suppress inspection "UnusedProperty"
+JAPAN_BANK_SHORT=Japan Furikomi
# Do not translate brand names
# suppress inspection "UnusedProperty"
@@ -2499,3 +2610,8 @@ validation.mustBeDifferent=您输入的值必须与当前值不同
validation.cannotBeChanged=参数不能更改
validation.numberFormatException=数字格式异常 {0}
validation.mustNotBeNegative=不能输入负值
+validation.phone.missingCountryCode=需要两个字母的国家代码来验证电话号码
+validation.phone.invalidCharacters=电话号码 {0} 包含无效字符
+validation.phone.insufficientDigits={0} 中没有足够的数字作为有效的电话号码
+validation.phone.tooManyDigits={0} 中的数字太多,不是有效的电话号码
+validation.phone.invalidDialingCode=数字 {0} 中的国家拨号代码对于国家 {1} 无效。正确的拨号号码是 {2} 。
diff --git a/core/src/main/resources/wallet/checkpoints.txt b/core/src/main/resources/wallet/checkpoints.txt
index f29a031c22..47c26438b8 100644
--- a/core/src/main/resources/wallet/checkpoints.txt
+++ b/core/src/main/resources/wallet/checkpoints.txt
@@ -1,6 +1,6 @@
TXT CHECKPOINTS 1
0
-293
+297
AAAAAAAAB+EH4QfhAAAH4AEAAABjl7tqvU/FIcDT9gcbVlA4nwtFUbxAtOawZzBpAAAAAKzkcK7NqciBjI/ldojNKncrWleVSgDfBCCn3VRrbSxXaw5/Sf//AB0z8Bkv
AAAAAAAAD8EPwQ/BAAAPwAEAAADfP83Sx8MZ9RsrnZCvqzAwqB2Ma+ZesNAJrTfwAAAAACwESaNKhvRgz6WuE7UFdFk1xwzfRY/OIdIOPzX5yaAdjnWUSf//AB0GrNq5
AAAAAAAAF6EXoRehAAAXoAEAAADonWzAaUAKd30XT3NnHKobZMnLOuHdzm/xtehsAAAAAD8cUJA6NBIHHcqPHLc4IrfHw+6mjCGu3e+wRO81EvpnMVqrSf//AB1ffy8G
@@ -294,3 +294,7 @@ BxjR5kMqYX5AXwC1AAjrwAAAACCmOTRY8Cy7u4/sugJgpCO/mHoLwbZeEQAAAAAAAAAAAOZIsqYbzRmD
B1m9nmok83qfrm9oAAjzoAAAgCDP8OB6s52w8x1N7YG6IzkXMVW5xXg5EQAAAAAAAAAAAHotddzlmB7EIaVN9wbT1Af2bckXDx4NbkjtHoocrXck6e02XQg6Hxe8Q7EK
B5pN58sRlHzFOR//AAj7gAAAACBSYArI6b5PONfRi67pcVj7cWTbJI1rCQAAAAAAAAAAAKh1PP1FNXL/yUwEMhXpYBPx8f6iC77T2BDBwemNb+RO2JlHXTkwHBcAFrew
B+HS6cYPTvV6+snbAAkDYAAAwCD/aBvTWiuCtoAhxbQRpupP82voj93gFgAAAAAAAAAAAIDkuWjcUvoGa94vzaFmniQN1z6cVysCVsBwbetPXZvp5rlZXdGjGxdcc04A
+CCrDlIUnc1LZ8Nj7AAkLQAAA/z9FV3KiSlGDfga9ToHe8ysq0WioRw7iEQAAAAAAAAAAANUoIlkSoxVo6aV0yNQwBWNFJQHWUc5jhRxig6Tw4XsQVS5rXT4hGherRNd9
+CHfrzMTnNH4hN5sYAAkTIAAA/z+HbkJNgw5nAYXntDFX57V72pTVvvZIDAAAAAAAAAAAAIaAZN99p5iv3Uy5KzLVIn4oJdXuWwQtoiPuVvR37fNGt+h7XfWrFxeUDV+5
+CM0W0f4hiP5fWVciAAkbAAAAACD949mnNSIOTWH92aZDY80eG/VA3HF4DwAAAAAAAAAAAHz7539g8IjaBVxv7M2N+/bPcmY6Nik4r0IZMxOPFbbAkSCNXSQPFhcRiJ3V
+CSh7DyaX/kiv4GZrAAki4AAAQCBkJtVoaqbUq7I+EEmnUlsQDTY688BYFQAAAAAAAAAAAN8JpiIqwffNT/xQxjdHpDrq3zyloPsBWmA2IQWQQO0LdzufXVyjFReQWFDz
diff --git a/core/src/test/java/bisq/core/account/sign/SignedWitnessServiceTest.java b/core/src/test/java/bisq/core/account/sign/SignedWitnessServiceTest.java
index 941a8996c3..d9c7f5ad1d 100644
--- a/core/src/test/java/bisq/core/account/sign/SignedWitnessServiceTest.java
+++ b/core/src/test/java/bisq/core/account/sign/SignedWitnessServiceTest.java
@@ -19,7 +19,6 @@ package bisq.core.account.sign;
import bisq.core.account.witness.AccountAgeWitness;
-import bisq.core.support.dispute.arbitration.ArbitrationManager;
import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager;
import bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService;
@@ -41,6 +40,8 @@ import java.util.Date;
import org.junit.Before;
import org.junit.Test;
+import static bisq.core.account.sign.SignedWitness.VerificationMethod.ARBITRATOR;
+import static bisq.core.account.sign.SignedWitness.VerificationMethod.TRADE;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
@@ -70,20 +71,23 @@ public class SignedWitnessServiceTest {
private long tradeAmount1;
private long tradeAmount2;
private long tradeAmount3;
+ private long SIGN_AGE_1 = SignedWitnessService.SIGNER_AGE_DAYS * 3 + 5;
+ private long SIGN_AGE_2 = SignedWitnessService.SIGNER_AGE_DAYS * 2 + 4;
+ private long SIGN_AGE_3 = SignedWitnessService.SIGNER_AGE_DAYS + 3;
+
@Before
public void setup() throws Exception {
AppendOnlyDataStoreService appendOnlyDataStoreService = mock(AppendOnlyDataStoreService.class);
ArbitratorManager arbitratorManager = mock(ArbitratorManager.class);
- ArbitrationManager arbitrationManager = mock(ArbitrationManager.class);
when(arbitratorManager.isPublicKeyInList(any())).thenReturn(true);
- signedWitnessService = new SignedWitnessService(null, null, null, arbitratorManager, null, appendOnlyDataStoreService, arbitrationManager, null);
+ signedWitnessService = new SignedWitnessService(null, null, arbitratorManager, null, appendOnlyDataStoreService, null);
account1DataHash = org.bitcoinj.core.Utils.sha256hash160(new byte[]{1});
account2DataHash = org.bitcoinj.core.Utils.sha256hash160(new byte[]{2});
account3DataHash = org.bitcoinj.core.Utils.sha256hash160(new byte[]{3});
- long account1CreationTime = getTodayMinusNDays(96);
- long account2CreationTime = getTodayMinusNDays(66);
- long account3CreationTime = getTodayMinusNDays(36);
+ long account1CreationTime = getTodayMinusNDays(SIGN_AGE_1 + 1);
+ long account2CreationTime = getTodayMinusNDays(SIGN_AGE_2 + 1);
+ long account3CreationTime = getTodayMinusNDays(SIGN_AGE_3 + 1);
aew1 = new AccountAgeWitness(account1DataHash, account1CreationTime);
aew2 = new AccountAgeWitness(account2DataHash, account2CreationTime);
aew3 = new AccountAgeWitness(account3DataHash, account3CreationTime);
@@ -94,9 +98,9 @@ public class SignedWitnessServiceTest {
signature1 = arbitrator1Key.signMessage(Utilities.encodeToHex(account1DataHash)).getBytes(Charsets.UTF_8);
signature2 = Sig.sign(peer1KeyPair.getPrivate(), Utilities.encodeToHex(account2DataHash).getBytes(Charsets.UTF_8));
signature3 = Sig.sign(peer2KeyPair.getPrivate(), Utilities.encodeToHex(account3DataHash).getBytes(Charsets.UTF_8));
- date1 = getTodayMinusNDays(95);
- date2 = getTodayMinusNDays(64);
- date3 = getTodayMinusNDays(33);
+ date1 = getTodayMinusNDays(SIGN_AGE_1);
+ date2 = getTodayMinusNDays(SIGN_AGE_2);
+ date3 = getTodayMinusNDays(SIGN_AGE_3);
signer1PubKey = arbitrator1Key.getPubKey();
signer2PubKey = Sig.getPublicKeyBytes(peer1KeyPair.getPublic());
signer3PubKey = Sig.getPublicKeyBytes(peer2KeyPair.getPublic());
@@ -110,85 +114,131 @@ public class SignedWitnessServiceTest {
@Test
public void testIsValidAccountAgeWitnessOk() {
- SignedWitness sw1 = new SignedWitness(true, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
- SignedWitness sw2 = new SignedWitness(false, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
- SignedWitness sw3 = new SignedWitness(false, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
+ SignedWitness sw1 = new SignedWitness(ARBITRATOR, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
+ SignedWitness sw2 = new SignedWitness(TRADE, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
+ SignedWitness sw3 = new SignedWitness(TRADE, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
signedWitnessService.addToMap(sw1);
signedWitnessService.addToMap(sw2);
signedWitnessService.addToMap(sw3);
- assertTrue(signedWitnessService.isValidAccountAgeWitness(aew1));
- assertTrue(signedWitnessService.isValidAccountAgeWitness(aew2));
- assertTrue(signedWitnessService.isValidAccountAgeWitness(aew3));
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew1));
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew2));
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew3));
}
@Test
public void testIsValidAccountAgeWitnessArbitratorSignatureProblem() {
signature1 = new byte[]{1, 2, 3};
- SignedWitness sw1 = new SignedWitness(true, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
- SignedWitness sw2 = new SignedWitness(false, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
- SignedWitness sw3 = new SignedWitness(false, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
+ SignedWitness sw1 = new SignedWitness(ARBITRATOR, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
+ SignedWitness sw2 = new SignedWitness(TRADE, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
+ SignedWitness sw3 = new SignedWitness(TRADE, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
signedWitnessService.addToMap(sw1);
signedWitnessService.addToMap(sw2);
signedWitnessService.addToMap(sw3);
- assertFalse(signedWitnessService.isValidAccountAgeWitness(aew1));
- assertFalse(signedWitnessService.isValidAccountAgeWitness(aew2));
- assertFalse(signedWitnessService.isValidAccountAgeWitness(aew3));
+ assertFalse(signedWitnessService.isSignerAccountAgeWitness(aew1));
+ assertFalse(signedWitnessService.isSignerAccountAgeWitness(aew2));
+ assertFalse(signedWitnessService.isSignerAccountAgeWitness(aew3));
}
@Test
public void testIsValidAccountAgeWitnessPeerSignatureProblem() {
signature2 = new byte[]{1, 2, 3};
- SignedWitness sw1 = new SignedWitness(true, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
- SignedWitness sw2 = new SignedWitness(false, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
- SignedWitness sw3 = new SignedWitness(false, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
+ SignedWitness sw1 = new SignedWitness(ARBITRATOR, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
+ SignedWitness sw2 = new SignedWitness(TRADE, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
+ SignedWitness sw3 = new SignedWitness(TRADE, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
signedWitnessService.addToMap(sw1);
signedWitnessService.addToMap(sw2);
signedWitnessService.addToMap(sw3);
- assertTrue(signedWitnessService.isValidAccountAgeWitness(aew1));
- assertFalse(signedWitnessService.isValidAccountAgeWitness(aew2));
- assertFalse(signedWitnessService.isValidAccountAgeWitness(aew3));
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew1));
+ assertFalse(signedWitnessService.isSignerAccountAgeWitness(aew2));
+ assertFalse(signedWitnessService.isSignerAccountAgeWitness(aew3));
+ }
+
+ @Test
+ public void testIsValidSelfSignatureOk() throws Exception {
+ KeyPair peer1KeyPair = Sig.generateKeyPair();
+ signer2PubKey = Sig.getPublicKeyBytes(peer1KeyPair.getPublic());
+
+ signature2 = Sig.sign(peer1KeyPair.getPrivate(), Utilities.encodeToHex(account2DataHash).getBytes(Charsets.UTF_8));
+ signature3 = Sig.sign(peer1KeyPair.getPrivate(), Utilities.encodeToHex(account3DataHash).getBytes(Charsets.UTF_8));
+
+ SignedWitness sw1 = new SignedWitness(ARBITRATOR, account1DataHash, signature1, signer1PubKey, signer2PubKey, date1, tradeAmount1);
+ SignedWitness sw2 = new SignedWitness(TRADE, account2DataHash, signature2, signer2PubKey, signer2PubKey, date2, tradeAmount2);
+ SignedWitness sw3 = new SignedWitness(TRADE, account3DataHash, signature3, signer2PubKey, signer2PubKey, date3, tradeAmount3);
+
+ signedWitnessService.addToMap(sw1);
+ signedWitnessService.addToMap(sw2);
+ signedWitnessService.addToMap(sw3);
+
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew1));
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew2));
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew3));
+ }
+
+ @Test
+ public void testIsValidSimpleLoopSignatureProblem() throws Exception {
+ // A reasonable case where user1 is signed by user2 and later switches account and the new
+ // account gets signed by user2. This is not allowed.
+ KeyPair peer1KeyPair = Sig.generateKeyPair();
+ KeyPair peer2KeyPair = Sig.generateKeyPair();
+ byte[] user1PubKey = Sig.getPublicKeyBytes(peer1KeyPair.getPublic());
+ byte[] user2PubKey = Sig.getPublicKeyBytes(peer2KeyPair.getPublic());
+
+ signature2 = Sig.sign(peer1KeyPair.getPrivate(), Utilities.encodeToHex(account2DataHash).getBytes(Charsets.UTF_8));
+ signature3 = Sig.sign(peer2KeyPair.getPrivate(), Utilities.encodeToHex(account3DataHash).getBytes(Charsets.UTF_8));
+
+ SignedWitness sw1 = new SignedWitness(ARBITRATOR, account1DataHash, signature1, signer1PubKey, user1PubKey, date1, tradeAmount1);
+ SignedWitness sw2 = new SignedWitness(TRADE, account2DataHash, signature2, user1PubKey, user2PubKey, date2, tradeAmount2);
+ SignedWitness sw3 = new SignedWitness(TRADE, account3DataHash, signature3, user2PubKey, user1PubKey, date3, tradeAmount3);
+
+ signedWitnessService.addToMap(sw1);
+ signedWitnessService.addToMap(sw2);
+ signedWitnessService.addToMap(sw3);
+
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew1));
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew2));
+ assertFalse(signedWitnessService.isSignerAccountAgeWitness(aew3));
}
@Test
public void testIsValidAccountAgeWitnessDateTooSoonProblem() {
- date3 = getTodayMinusNDays(63);
+ date3 = getTodayMinusNDays(SIGN_AGE_2 - 1);
- SignedWitness sw1 = new SignedWitness(true, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
- SignedWitness sw2 = new SignedWitness(false, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
- SignedWitness sw3 = new SignedWitness(false, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
+ SignedWitness sw1 = new SignedWitness(ARBITRATOR, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
+ SignedWitness sw2 = new SignedWitness(TRADE, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
+ SignedWitness sw3 = new SignedWitness(TRADE, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
signedWitnessService.addToMap(sw1);
signedWitnessService.addToMap(sw2);
signedWitnessService.addToMap(sw3);
- assertTrue(signedWitnessService.isValidAccountAgeWitness(aew1));
- assertTrue(signedWitnessService.isValidAccountAgeWitness(aew2));
- assertFalse(signedWitnessService.isValidAccountAgeWitness(aew3));
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew1));
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew2));
+ assertFalse(signedWitnessService.isSignerAccountAgeWitness(aew3));
}
@Test
public void testIsValidAccountAgeWitnessDateTooLateProblem() {
date3 = getTodayMinusNDays(3);
- SignedWitness sw1 = new SignedWitness(true, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
- SignedWitness sw2 = new SignedWitness(false, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
- SignedWitness sw3 = new SignedWitness(false, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
+ SignedWitness sw1 = new SignedWitness(ARBITRATOR, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
+ SignedWitness sw2 = new SignedWitness(TRADE, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
+ SignedWitness sw3 = new SignedWitness(TRADE, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
signedWitnessService.addToMap(sw1);
signedWitnessService.addToMap(sw2);
signedWitnessService.addToMap(sw3);
- assertTrue(signedWitnessService.isValidAccountAgeWitness(aew1));
- assertTrue(signedWitnessService.isValidAccountAgeWitness(aew2));
- assertFalse(signedWitnessService.isValidAccountAgeWitness(aew3));
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew1));
+ assertTrue(signedWitnessService.isSignerAccountAgeWitness(aew2));
+ assertFalse(signedWitnessService.isSignerAccountAgeWitness(aew3));
}
@@ -197,9 +247,9 @@ public class SignedWitnessServiceTest {
byte[] account1DataHash = org.bitcoinj.core.Utils.sha256hash160(new byte[]{1});
byte[] account2DataHash = org.bitcoinj.core.Utils.sha256hash160(new byte[]{2});
byte[] account3DataHash = org.bitcoinj.core.Utils.sha256hash160(new byte[]{3});
- long account1CreationTime = getTodayMinusNDays(96);
- long account2CreationTime = getTodayMinusNDays(66);
- long account3CreationTime = getTodayMinusNDays(36);
+ long account1CreationTime = getTodayMinusNDays(SIGN_AGE_1 + 1);
+ long account2CreationTime = getTodayMinusNDays(SIGN_AGE_2 + 1);
+ long account3CreationTime = getTodayMinusNDays(SIGN_AGE_3 + 1);
AccountAgeWitness aew1 = new AccountAgeWitness(account1DataHash, account1CreationTime);
AccountAgeWitness aew2 = new AccountAgeWitness(account2DataHash, account2CreationTime);
AccountAgeWitness aew3 = new AccountAgeWitness(account3DataHash, account3CreationTime);
@@ -208,7 +258,6 @@ public class SignedWitnessServiceTest {
KeyPair peer2KeyPair = Sig.generateKeyPair();
KeyPair peer3KeyPair = Sig.generateKeyPair();
-
String account1DataHashAsHexString = Utilities.encodeToHex(account1DataHash);
String account2DataHashAsHexString = Utilities.encodeToHex(account2DataHash);
String account3DataHashAsHexString = Utilities.encodeToHex(account3DataHash);
@@ -223,23 +272,23 @@ public class SignedWitnessServiceTest {
byte[] witnessOwner1PubKey = Sig.getPublicKeyBytes(peer1KeyPair.getPublic());
byte[] witnessOwner2PubKey = Sig.getPublicKeyBytes(peer2KeyPair.getPublic());
byte[] witnessOwner3PubKey = Sig.getPublicKeyBytes(peer3KeyPair.getPublic());
- long date1 = getTodayMinusNDays(95);
- long date2 = getTodayMinusNDays(64);
- long date3 = getTodayMinusNDays(33);
+ long date1 = getTodayMinusNDays(SIGN_AGE_1);
+ long date2 = getTodayMinusNDays(SIGN_AGE_2);
+ long date3 = getTodayMinusNDays(SIGN_AGE_3);
long tradeAmount1 = 1000;
long tradeAmount2 = 1001;
long tradeAmount3 = 1001;
- SignedWitness sw1 = new SignedWitness(false, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
- SignedWitness sw2 = new SignedWitness(false, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
- SignedWitness sw3 = new SignedWitness(false, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
+ SignedWitness sw1 = new SignedWitness(TRADE, account1DataHash, signature1, signer1PubKey, witnessOwner1PubKey, date1, tradeAmount1);
+ SignedWitness sw2 = new SignedWitness(TRADE, account2DataHash, signature2, signer2PubKey, witnessOwner2PubKey, date2, tradeAmount2);
+ SignedWitness sw3 = new SignedWitness(TRADE, account3DataHash, signature3, signer3PubKey, witnessOwner3PubKey, date3, tradeAmount3);
signedWitnessService.addToMap(sw1);
signedWitnessService.addToMap(sw2);
signedWitnessService.addToMap(sw3);
- assertFalse(signedWitnessService.isValidAccountAgeWitness(aew3));
+ assertFalse(signedWitnessService.isSignerAccountAgeWitness(aew3));
}
@@ -251,7 +300,7 @@ public class SignedWitnessServiceTest {
int iterations = 1002;
for (int i = 0; i < iterations; i++) {
byte[] accountDataHash = org.bitcoinj.core.Utils.sha256hash160(String.valueOf(i).getBytes(Charsets.UTF_8));
- long accountCreationTime = getTodayMinusNDays((iterations - i) * (SignedWitnessService.CHARGEBACK_SAFETY_DAYS + 1));
+ long accountCreationTime = getTodayMinusNDays((iterations - i) * (SignedWitnessService.SIGNER_AGE_DAYS + 1));
aew = new AccountAgeWitness(accountDataHash, accountCreationTime);
String accountDataHashAsHexString = Utilities.encodeToHex(accountDataHash);
byte[] signature;
@@ -270,11 +319,11 @@ public class SignedWitnessServiceTest {
signerPubKey = Sig.getPublicKeyBytes(signerKeyPair.getPublic());
}
byte[] witnessOwnerPubKey = Sig.getPublicKeyBytes(signedKeyPair.getPublic());
- long date = getTodayMinusNDays((iterations - i) * (SignedWitnessService.CHARGEBACK_SAFETY_DAYS + 1));
- SignedWitness sw = new SignedWitness(i == 0, accountDataHash, signature, signerPubKey, witnessOwnerPubKey, date, tradeAmount1);
+ long date = getTodayMinusNDays((iterations - i) * (SignedWitnessService.SIGNER_AGE_DAYS + 1));
+ SignedWitness sw = new SignedWitness(i == 0 ? ARBITRATOR : TRADE, accountDataHash, signature, signerPubKey, witnessOwnerPubKey, date, tradeAmount1);
signedWitnessService.addToMap(sw);
}
- assertFalse(signedWitnessService.isValidAccountAgeWitness(aew));
+ assertFalse(signedWitnessService.isSignerAccountAgeWitness(aew));
}
diff --git a/core/src/test/java/bisq/core/account/sign/SignedWitnessTest.java b/core/src/test/java/bisq/core/account/sign/SignedWitnessTest.java
index 305a539151..7b4381c81d 100644
--- a/core/src/test/java/bisq/core/account/sign/SignedWitnessTest.java
+++ b/core/src/test/java/bisq/core/account/sign/SignedWitnessTest.java
@@ -13,6 +13,8 @@ import java.time.Instant;
import org.junit.Before;
import org.junit.Test;
+import static bisq.core.account.sign.SignedWitness.VerificationMethod.ARBITRATOR;
+import static bisq.core.account.sign.SignedWitness.VerificationMethod.TRADE;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
@@ -33,17 +35,17 @@ public class SignedWitnessTest {
@Test
public void testProtoRoundTrip() {
- SignedWitness signedWitness = new SignedWitness(true, witnessHash, witnessHashSignature, arbitrator1Key.getPubKey(), witnessOwner1PubKey, Instant.now().getEpochSecond(), 100);
+ SignedWitness signedWitness = new SignedWitness(ARBITRATOR, witnessHash, witnessHashSignature, arbitrator1Key.getPubKey(), witnessOwner1PubKey, Instant.now().getEpochSecond(), 100);
assertEquals(signedWitness, SignedWitness.fromProto(signedWitness.toProtoMessage().getSignedWitness()));
}
@Test
public void isImmutable() {
byte[] signerPubkey = arbitrator1Key.getPubKey();
- SignedWitness signedWitness = new SignedWitness(true, witnessHash, witnessHashSignature, signerPubkey, witnessOwner1PubKey, Instant.now().getEpochSecond(), 100);
- byte[] originalWitnessHash = signedWitness.getWitnessHash().clone();
+ SignedWitness signedWitness = new SignedWitness(TRADE, witnessHash, witnessHashSignature, signerPubkey, witnessOwner1PubKey, Instant.now().getEpochSecond(), 100);
+ byte[] originalWitnessHash = signedWitness.getAccountAgeWitnessHash().clone();
witnessHash[0] += 1;
- assertArrayEquals(originalWitnessHash, signedWitness.getWitnessHash());
+ assertArrayEquals(originalWitnessHash, signedWitness.getAccountAgeWitnessHash());
byte[] originalWitnessHashSignature = signedWitness.getSignature().clone();
witnessHashSignature[0] += 1;
diff --git a/core/src/test/java/bisq/core/account/witness/AccountAgeWitnessServiceTest.java b/core/src/test/java/bisq/core/account/witness/AccountAgeWitnessServiceTest.java
index c5f28113f5..3b2d90567a 100644
--- a/core/src/test/java/bisq/core/account/witness/AccountAgeWitnessServiceTest.java
+++ b/core/src/test/java/bisq/core/account/witness/AccountAgeWitnessServiceTest.java
@@ -17,6 +17,9 @@
package bisq.core.account.witness;
+import bisq.core.account.sign.SignedWitnessService;
+import bisq.core.payment.ChargeBackRisk;
+
import bisq.common.crypto.CryptoException;
import bisq.common.crypto.Sig;
@@ -38,6 +41,7 @@ import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
// Restricted default Java security policy on Travis does not allow long keys, so test fails.
// Using Utilities.removeCryptographyRestrictions(); did not work.
@@ -49,7 +53,9 @@ public class AccountAgeWitnessServiceTest {
@Before
public void setup() throws CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException, CryptoException {
- service = new AccountAgeWitnessService(null, null, null, null, null);
+ SignedWitnessService signedWitnessService = mock(SignedWitnessService.class);
+ ChargeBackRisk chargeBackRisk = mock(ChargeBackRisk.class);
+ service = new AccountAgeWitnessService(null, null, null, signedWitnessService, chargeBackRisk, null, null, null);
keypair = Sig.generateKeyPair();
publicKey = keypair.getPublic();
}
diff --git a/core/src/test/java/bisq/core/arbitration/BuyerDataItemTest.java b/core/src/test/java/bisq/core/arbitration/TraderDataItemTest.java
similarity index 64%
rename from core/src/test/java/bisq/core/arbitration/BuyerDataItemTest.java
rename to core/src/test/java/bisq/core/arbitration/TraderDataItemTest.java
index 61dc33b834..7909a6fdf9 100644
--- a/core/src/test/java/bisq/core/arbitration/BuyerDataItemTest.java
+++ b/core/src/test/java/bisq/core/arbitration/TraderDataItemTest.java
@@ -1,7 +1,7 @@
package bisq.core.arbitration;
import bisq.core.account.witness.AccountAgeWitness;
-import bisq.core.support.dispute.arbitration.BuyerDataItem;
+import bisq.core.support.dispute.arbitration.TraderDataItem;
import bisq.core.payment.payload.PaymentAccountPayload;
import org.bitcoinj.core.Coin;
@@ -31,10 +31,10 @@ import static org.mockito.Mockito.mock;
* You should have received a copy of the GNU Affero General Public License
* along with Bisq. If not, see .
*/
-public class BuyerDataItemTest {
- private BuyerDataItem buyerDataItem1;
- private BuyerDataItem buyerDataItem2;
- private BuyerDataItem buyerDataItem3;
+public class TraderDataItemTest {
+ private TraderDataItem traderDataItem1;
+ private TraderDataItem traderDataItem2;
+ private TraderDataItem traderDataItem3;
private AccountAgeWitness accountAgeWitness1;
private AccountAgeWitness accountAgeWitness2;
private byte[] hash1 = "1".getBytes();
@@ -44,24 +44,24 @@ public class BuyerDataItemTest {
public void setup() {
accountAgeWitness1 = new AccountAgeWitness(hash1, 123);
accountAgeWitness2 = new AccountAgeWitness(hash2, 124);
- buyerDataItem1 = new BuyerDataItem(mock(PaymentAccountPayload.class), accountAgeWitness1, Coin.valueOf(546),
+ traderDataItem1 = new TraderDataItem(mock(PaymentAccountPayload.class), accountAgeWitness1, Coin.valueOf(546),
mock(PublicKey.class));
- buyerDataItem2 = new BuyerDataItem(mock(PaymentAccountPayload.class), accountAgeWitness1, Coin.valueOf(547),
+ traderDataItem2 = new TraderDataItem(mock(PaymentAccountPayload.class), accountAgeWitness1, Coin.valueOf(547),
mock(PublicKey.class));
- buyerDataItem3 = new BuyerDataItem(mock(PaymentAccountPayload.class), accountAgeWitness2, Coin.valueOf(548),
+ traderDataItem3 = new TraderDataItem(mock(PaymentAccountPayload.class), accountAgeWitness2, Coin.valueOf(548),
mock(PublicKey.class));
}
@Test
public void testEquals() {
- assertEquals(buyerDataItem1, buyerDataItem2);
- assertNotEquals(buyerDataItem1, buyerDataItem3);
- assertNotEquals(buyerDataItem2, buyerDataItem3);
+ assertEquals(traderDataItem1, traderDataItem2);
+ assertNotEquals(traderDataItem1, traderDataItem3);
+ assertNotEquals(traderDataItem2, traderDataItem3);
}
@Test
public void testHashCode() {
- assertEquals(buyerDataItem1.hashCode(), buyerDataItem2.hashCode());
- assertNotEquals(buyerDataItem1.hashCode(), buyerDataItem3.hashCode());
+ assertEquals(traderDataItem1.hashCode(), traderDataItem2.hashCode());
+ assertNotEquals(traderDataItem1.hashCode(), traderDataItem3.hashCode());
}
}
diff --git a/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java b/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java
index 9fcca9a4de..c80ea13e0e 100644
--- a/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java
+++ b/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java
@@ -40,7 +40,7 @@ public class OpenOfferManagerTest {
final OpenOfferManager manager = new OpenOfferManager(null, null, p2PService,
null, null, null, offerBookService,
null, null, null,
- null, null, null,
+ null, null, null, null, null,
new Storage>(null, null, corruptedDatabaseFilesHandler));
AtomicBoolean startEditOfferSuccessful = new AtomicBoolean(false);
@@ -76,7 +76,7 @@ public class OpenOfferManagerTest {
final OpenOfferManager manager = new OpenOfferManager(null, null, p2PService,
null, null, null, offerBookService,
null, null, null,
- null, null, null,
+ null, null, null, null, null,
new Storage>(null, null, corruptedDatabaseFilesHandler));
AtomicBoolean startEditOfferSuccessful = new AtomicBoolean(false);
@@ -104,7 +104,7 @@ public class OpenOfferManagerTest {
final OpenOfferManager manager = new OpenOfferManager(null, null, p2PService,
null, null, null, offerBookService,
null, null, null,
- null, null, null,
+ null, null, null, null, null,
new Storage>(null, null, corruptedDatabaseFilesHandler));
AtomicBoolean startEditOfferSuccessful = new AtomicBoolean(false);
diff --git a/core/src/test/java/bisq/core/payment/PaymentAccountsTest.java b/core/src/test/java/bisq/core/payment/PaymentAccountsTest.java
index 8402ebab47..b869045683 100644
--- a/core/src/test/java/bisq/core/payment/PaymentAccountsTest.java
+++ b/core/src/test/java/bisq/core/payment/PaymentAccountsTest.java
@@ -22,15 +22,10 @@ import bisq.core.account.witness.AccountAgeWitnessService;
import bisq.core.offer.Offer;
import bisq.core.payment.payload.PaymentAccountPayload;
-import com.google.common.collect.Sets;
-
import java.util.Collections;
-import java.util.Set;
-import java.util.function.BiFunction;
import org.junit.Test;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
@@ -46,22 +41,22 @@ public class PaymentAccountsTest {
assertNull(actual);
}
- @Test
- public void testGetOldestPaymentAccountForOffer() {
- AccountAgeWitnessService service = mock(AccountAgeWitnessService.class);
-
- PaymentAccount oldest = createAccountWithAge(service, 3);
- Set accounts = Sets.newHashSet(
- oldest,
- createAccountWithAge(service, 2),
- createAccountWithAge(service, 1));
-
- BiFunction dummyValidator = (offer, account) -> true;
- PaymentAccounts testedEntity = new PaymentAccounts(accounts, service, dummyValidator);
-
- PaymentAccount actual = testedEntity.getOldestPaymentAccountForOffer(mock(Offer.class));
- assertEquals(oldest, actual);
- }
+// @Test
+// public void testGetOldestPaymentAccountForOffer() {
+// AccountAgeWitnessService service = mock(AccountAgeWitnessService.class);
+//
+// PaymentAccount oldest = createAccountWithAge(service, 3);
+// Set accounts = Sets.newHashSet(
+// oldest,
+// createAccountWithAge(service, 2),
+// createAccountWithAge(service, 1));
+//
+// BiFunction dummyValidator = (offer, account) -> true;
+// PaymentAccounts testedEntity = new PaymentAccounts(accounts, service, dummyValidator);
+//
+// PaymentAccount actual = testedEntity.getOldestPaymentAccountForOffer(mock(Offer.class));
+// assertEquals(oldest, actual);
+// }
private static PaymentAccount createAccountWithAge(AccountAgeWitnessService service, long age) {
PaymentAccountPayload payload = mock(PaymentAccountPayload.class);
diff --git a/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java b/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java
index 9062f5209c..96616e5afd 100644
--- a/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java
+++ b/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java
@@ -57,6 +57,7 @@ public class UserPayloadModelVOTest {
"string",
new byte[]{10, 0, 0},
null,
+ Lists.newArrayList(),
Lists.newArrayList()));
vo.setRegisteredArbitrator(ArbitratorTest.getArbitratorMock());
vo.setRegisteredMediator(MediatorTest.getMediatorMock());
diff --git a/desktop/package/linux/Dockerfile b/desktop/package/linux/Dockerfile
index ecf9b402f7..5e513dd818 100644
--- a/desktop/package/linux/Dockerfile
+++ b/desktop/package/linux/Dockerfile
@@ -8,7 +8,7 @@
# pull base image
FROM openjdk:8-jdk
-ENV version 1.1.7-SNAPSHOT
+ENV version 1.2.1-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
diff --git a/desktop/package/linux/package.sh b/desktop/package/linux/package.sh
index 92f89e975c..1e1b02a82d 100755
--- a/desktop/package/linux/package.sh
+++ b/desktop/package/linux/package.sh
@@ -6,7 +6,7 @@
# - Update version below
# - Ensure JAVA_HOME below is pointing to OracleJDK 10 directory
-version=1.1.7-SNAPSHOT
+version=1.2.1-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
diff --git a/desktop/package/linux/release.sh b/desktop/package/linux/release.sh
index 525fa8176c..2aa371c307 100755
--- a/desktop/package/linux/release.sh
+++ b/desktop/package/linux/release.sh
@@ -4,7 +4,7 @@
# Prior to running this script:
# - Update version below
-version=1.1.7-SNAPSHOT
+version=1.2.1-SNAPSHOT
base_dir=$( cd "$(dirname "$0")" ; pwd -P )/../../..
package_dir=$base_dir/desktop/package
release_dir=$base_dir/desktop/release/$version
diff --git a/desktop/package/macosx/Info.plist b/desktop/package/macosx/Info.plist
index 6eca8197a3..6dc1844e34 100644
--- a/desktop/package/macosx/Info.plist
+++ b/desktop/package/macosx/Info.plist
@@ -5,10 +5,10 @@
CFBundleVersion
- 1.1.7
+ 1.2.1CFBundleShortVersionString
- 1.1.7
+ 1.2.1CFBundleExecutableBisq
diff --git a/desktop/package/macosx/copy_dbs.sh b/desktop/package/macosx/copy_dbs.sh
index 1640de36fc..c3d1de7200 100755
--- a/desktop/package/macosx/copy_dbs.sh
+++ b/desktop/package/macosx/copy_dbs.sh
@@ -10,3 +10,4 @@ resDir=p2p/src/main/resources
cp "$dbDir/TradeStatistics2Store" "$resDir/TradeStatistics2Store_BTC_MAINNET"
cp "$dbDir/AccountAgeWitnessStore" "$resDir/AccountAgeWitnessStore_BTC_MAINNET"
cp "$dbDir/DaoStateStore" "$resDir/DaoStateStore_BTC_MAINNET"
+cp "$dbDir/SignedWitnessStore" "$resDir/SignedWitnessStore_BTC_MAINNET"
diff --git a/desktop/package/macosx/create_app.sh b/desktop/package/macosx/create_app.sh
index 32550c5dab..b4ea32d9da 100755
--- a/desktop/package/macosx/create_app.sh
+++ b/desktop/package/macosx/create_app.sh
@@ -6,13 +6,14 @@ mkdir -p deploy
set -e
-version="1.1.7-SNAPSHOT"
+version="1.2.1-SNAPSHOT"
cd ..
./gradlew :desktop:build -x test shadowJar
cd desktop
EXE_JAR=build/libs/desktop-$version-all.jar
+JAR_LIB=build/app/lib
# we need to strip out Java 9 module configuration used in the fontawesomefx library as it causes the javapackager to stop,
# because of this existing module information, although it is not used as a module.
@@ -38,8 +39,13 @@ java -jar ./package/tools-1.0.jar $EXE_JAR
echo SHA 256 after stripping jar file to get a deterministic jar:
shasum -a256 $EXE_JAR | awk '{print $1}' | tee deploy/Bisq-$version.jar.txt
-vmPath=/Users/christoph/Documents/Workspaces/Java
-#vmPath=/Volumes
+# zip jar lib for Raspberry Pi
+echo "Zipping jar lib for raspberry pi"
+zip -r -X -q "deploy/jar-lib-for-raspberry-pi-$version.zip" $JAR_LIB
+
+# Set BISQ_VM_PATH as environment var to the directory where your shared folders for virtual box are residing
+
+vmPath=$BISQ_VM_PATH
linux64=$vmPath/vm_shared_ubuntu/desktop
linux64Package=$linux64/package/linux
win64=$vmPath/vm_shared_windows/desktop
diff --git a/desktop/package/macosx/finalize.sh b/desktop/package/macosx/finalize.sh
index 9f040dcc56..b70629955a 100755
--- a/desktop/package/macosx/finalize.sh
+++ b/desktop/package/macosx/finalize.sh
@@ -2,18 +2,18 @@
cd ../../
-version="1.1.7-SNAPSHOT"
+version="1.2.1-SNAPSHOT"
target_dir="releases/$version"
-vmPath=/Users/christoph/Documents/Workspaces/Java
-#vmPath=/Volumes
+# Set BISQ_GPG_USER as environment var to the email address used for gpg signing. e.g. BISQ_GPG_USER=manfred@bitsquare.io
+# Set BISQ_VM_PATH as environment var to the directory where your shared folders for virtual box are residing
+
+vmPath=$BISQ_VM_PATH
linux64=$vmPath/vm_shared_ubuntu/desktop/package/linux
win64=$vmPath/vm_shared_windows/desktop/package/windows
-macOS=deploy
-
-# Set BISQ_GPG_USER as environment var to the email address used for gpg signing. e.g. BISQ_GPG_USER=manfred@bitsquare.io
+deployDir=deploy
rm -r $target_dir
@@ -31,7 +31,7 @@ cp "$target_dir/../../package/signingkey.asc" "$target_dir/"
cp "deploy/Bisq-$version.jar.txt" "$target_dir/"
dmg="Bisq-$version.dmg"
-cp "$macOS/$dmg" "$target_dir/"
+cp "$deployDir/$dmg" "$target_dir/"
deb="Bisq-$version.deb"
deb64="Bisq-64bit-$version.deb"
@@ -45,6 +45,9 @@ exe="Bisq-$version.exe"
exe64="Bisq-64bit-$version.exe"
cp "$win64/$exe" "$target_dir/$exe64"
+rpi="jar-lib-for-raspberry-pi-$version.zip"
+cp "$deployDir/$rpi" "$target_dir/"
+
cd "$target_dir"
echo Create signatures
@@ -52,12 +55,14 @@ gpg --digest-algo SHA256 --local-user $BISQ_GPG_USER --output $dmg.asc --detach-
gpg --digest-algo SHA256 --local-user $BISQ_GPG_USER --output $deb64.asc --detach-sig --armor $deb64
gpg --digest-algo SHA256 --local-user $BISQ_GPG_USER --output $rpm64.asc --detach-sig --armor $rpm64
gpg --digest-algo SHA256 --local-user $BISQ_GPG_USER --output $exe64.asc --detach-sig --armor $exe64
+gpg --digest-algo SHA256 --local-user $BISQ_GPG_USER --output $rpi.asc --detach-sig --armor $rpi
echo Verify signatures
gpg --digest-algo SHA256 --verify $dmg{.asc*,}
gpg --digest-algo SHA256 --verify $deb64{.asc*,}
gpg --digest-algo SHA256 --verify $rpm64{.asc*,}
gpg --digest-algo SHA256 --verify $exe64{.asc*,}
+gpg --digest-algo SHA256 --verify $rpi{.asc*,}
mkdir $win64/$version
cp -r . $win64/$version
diff --git a/desktop/package/macosx/insert_snapshot_version.sh b/desktop/package/macosx/insert_snapshot_version.sh
index b4f47a3f6a..d8b5c88d65 100755
--- a/desktop/package/macosx/insert_snapshot_version.sh
+++ b/desktop/package/macosx/insert_snapshot_version.sh
@@ -2,7 +2,7 @@
cd $(dirname $0)/../../../
-version=1.1.7
+version=1.2.1
find . -type f \( -name "finalize.sh" \
-o -name "create_app.sh" \
diff --git a/desktop/package/macosx/replace_version_number.sh b/desktop/package/macosx/replace_version_number.sh
index 534fcca568..3deaf1bced 100755
--- a/desktop/package/macosx/replace_version_number.sh
+++ b/desktop/package/macosx/replace_version_number.sh
@@ -2,8 +2,8 @@
cd $(dirname $0)/../../../
-oldVersion=1.1.6
-newVersion=1.1.7
+oldVersion=1.2.0
+newVersion=1.2.1
find . -type f \( -name "finalize.sh" \
-o -name "create_app.sh" \
diff --git a/desktop/package/windows/package.bat b/desktop/package/windows/package.bat
index d9775ab7ac..d5c866b293 100644
--- a/desktop/package/windows/package.bat
+++ b/desktop/package/windows/package.bat
@@ -8,7 +8,7 @@
@echo off
-set version=1.1.7-SNAPSHOT
+set version=1.2.1-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.
diff --git a/desktop/package/windows/release.bat b/desktop/package/windows/release.bat
index b53afa7e59..616e97388e 100644
--- a/desktop/package/windows/release.bat
+++ b/desktop/package/windows/release.bat
@@ -6,7 +6,7 @@
@echo off
-set version=1.1.7-SNAPSHOT
+set version=1.2.1-SNAPSHOT
set release_dir=%~dp0..\..\..\releases\%version%
set package_dir=%~dp0..
diff --git a/desktop/src/main/java/bisq/desktop/bisq.css b/desktop/src/main/java/bisq/desktop/bisq.css
index 53caec8ed0..89c9dc0df5 100644
--- a/desktop/src/main/java/bisq/desktop/bisq.css
+++ b/desktop/src/main/java/bisq/desktop/bisq.css
@@ -723,7 +723,7 @@ tree-table-view:focused {
* Icons *
* *
******************************************************************************/
-.icon, icon:hover {
+.icon, .icon:hover {
-fx-cursor: hand;
}
@@ -782,6 +782,18 @@ tree-table-view:focused {
-fx-padding: 27 2 0 2;
}
+.close-icon {
+ -fx-fill: -bs-text-color;
+}
+
+.close-icon:hover {
+ -fx-fill: -fx-accent;
+}
+
+.tooltip-icon {
+ -fx-fill: -bs-text-color;
+}
+
/*******************************************************************************
* *
* Tooltip *
@@ -838,6 +850,12 @@ textfield */
-fx-underline: false;
}
+.hyperlink.highlight,
+.hyperlink.highlight .text.hyperlink.no-underline {
+ -fx-text-fill: -fx-accent;
+ -fx-fill: -fx-accent;
+}
+
/*******************************************************************************
* *
* Table *
@@ -1967,56 +1985,6 @@ textfield */
-fx-font-size: 0.923em;
}
-.dao-launch-version {
- -fx-font-size: 1.077em;
-}
-
-.dao-launch-headline {
- -fx-font-size: 2.154em;
- -fx-text-fill: -bs-rd-font-dark-gray;
- -fx-font-family: "IBM Plex Sans Light";
-}
-
-.dao-launch-description {
- -fx-font-size: 1.538em;
- -fx-text-fill: -bs-rd-font-dark-gray;
- -fx-font-family: "IBM Plex Sans Light";
-}
-
-.dao-launch-paging-button {
- -fx-text-fill: -bs-rd-font-light;
- -fx-fill: -bs-rd-font-light;
-}
-
-.dao-launch-tab-box {
- -fx-border-style: solid;
- -fx-border-width: 1 0 0 0;
- -fx-border-color: -bs-rd-tab-border;
-}
-
-.slider-section-button {
- -fx-cursor: hand;
- -fx-background-color: transparent;
- -fx-translate-y: -1;
- -fx-padding: 11;
-}
-
-.slider-section-button .text {
- -fx-font-size: 0.923em;
- -fx-fill: -bs-rd-font-dark-gray;
- -fx-font-family: "IBM Plex Sans Light";
-}
-
-.slider-section-button:selected {
- -fx-border-style: solid;
- -fx-border-width: 1 0 0 0;
- -fx-border-color: -bs-rd-green;
-}
-
-.slider-section-button:selected .text {
- -fx-fill: -bs-rd-green;
-}
-
.price-trend-up {
-fx-text-fill: -bs-color-primary;
-fx-padding: 2 0 0 0;
@@ -2027,6 +1995,33 @@ textfield */
-fx-padding: 2 0 0 0;
}
+/********************************************************************************************************************
+ * *
+ * News *
+ * *
+ ********************************************************************************************************************/
+
+.news-version {
+ -fx-alignment: center-left;
+ -fx-font-size: 1em;
+}
+
+.news-feature-headline {
+ -fx-font-size: 1.077em;
+ -fx-text-fill: -bs-rd-font-dark-gray;
+ -fx-font-family: "IBM Plex Sans Medium";
+}
+
+.news-feature-description {
+ -fx-font-size: 1em;
+ -fx-text-fill: -bs-rd-font-dark-gray;
+}
+
+.news-feature-image {
+ -fx-border-style: solid;
+ -fx-border-width: 1;
+ -fx-border-color: -bs-rd-separator-dark;
+}
/********************************************************************************************************************
* *
* Notifications *
@@ -2040,3 +2035,18 @@ textfield */
.status-icon {
-fx-text-fill: -fx-faint-focus-color;
}
+
+/********************************************************************************************************************
+ * *
+ * Popover *
+ * *
+ ********************************************************************************************************************/
+.popover > .content {
+ -fx-padding: 10;
+}
+
+.popover > .content .default-text {
+ -fx-text-fill: -bs-text-color;
+}
+
+
diff --git a/desktop/src/main/java/bisq/desktop/components/AddressWithIconAndDirection.java b/desktop/src/main/java/bisq/desktop/components/AddressWithIconAndDirection.java
index 2ffbb2e282..6f9c0defc4 100644
--- a/desktop/src/main/java/bisq/desktop/components/AddressWithIconAndDirection.java
+++ b/desktop/src/main/java/bisq/desktop/components/AddressWithIconAndDirection.java
@@ -19,7 +19,6 @@ package bisq.desktop.components;
import de.jensd.fx.fontawesome.AwesomeDude;
import de.jensd.fx.fontawesome.AwesomeIcon;
-import de.jensd.fx.glyphs.GlyphIcons;
import javafx.scene.control.Hyperlink;
import javafx.scene.control.Label;
@@ -40,7 +39,7 @@ public class AddressWithIconAndDirection extends HBox {
private static final Logger log = LoggerFactory.getLogger(AddressWithIconAndDirection.class);
private final Hyperlink hyperlink;
- public AddressWithIconAndDirection(String text, String address, GlyphIcons icon, boolean received) {
+ public AddressWithIconAndDirection(String text, String address, boolean received) {
Label directionIcon = new Label();
directionIcon.getStyleClass().add("icon");
directionIcon.getStyleClass().add(received ? "received-funds-icon" : "sent-funds-icon");
@@ -55,7 +54,7 @@ public class AddressWithIconAndDirection extends HBox {
HBox.setMargin(directionIcon, new Insets(0, 3, 0, 0));
HBox.setHgrow(label, Priority.ALWAYS);
- hyperlink = new HyperlinkWithIcon(address, icon);
+ hyperlink = new ExternalHyperlink(address);
HBox.setMargin(hyperlink, new Insets(0));
HBox.setHgrow(hyperlink, Priority.SOMETIMES);
// You need to set max width to Double.MAX_VALUE to make HBox.setHgrow working like expected!
diff --git a/desktop/src/main/java/bisq/desktop/components/AutoTooltipTableColumn.java b/desktop/src/main/java/bisq/desktop/components/AutoTooltipTableColumn.java
index 0a1c12781e..906a751e2c 100644
--- a/desktop/src/main/java/bisq/desktop/components/AutoTooltipTableColumn.java
+++ b/desktop/src/main/java/bisq/desktop/components/AutoTooltipTableColumn.java
@@ -28,8 +28,6 @@ import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.layout.HBox;
-import javafx.geometry.Insets;
-
import java.util.concurrent.TimeUnit;
public class AutoTooltipTableColumn extends TableColumn {
@@ -66,7 +64,6 @@ public class AutoTooltipTableColumn extends TableColumn {
final Label helpLabel = new Label(help);
helpLabel.setMaxWidth(300);
helpLabel.setWrapText(true);
- helpLabel.setPadding(new Insets(10));
showInfoPopOver(helpLabel);
});
helpIcon.setOnMouseExited(e -> {
diff --git a/desktop/src/main/java/bisq/desktop/components/ExternalHyperlink.java b/desktop/src/main/java/bisq/desktop/components/ExternalHyperlink.java
new file mode 100644
index 0000000000..62f7cf1210
--- /dev/null
+++ b/desktop/src/main/java/bisq/desktop/components/ExternalHyperlink.java
@@ -0,0 +1,31 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see .
+ */
+
+package bisq.desktop.components;
+
+import de.jensd.fx.glyphs.materialdesignicons.MaterialDesignIcon;
+
+public class ExternalHyperlink extends HyperlinkWithIcon {
+
+ public ExternalHyperlink(String text) {
+ super(text, MaterialDesignIcon.LINK);
+ }
+
+ public ExternalHyperlink(String text, String style) {
+ super(text, MaterialDesignIcon.LINK, style);
+ }
+}
diff --git a/desktop/src/main/java/bisq/desktop/components/HyperlinkWithIcon.java b/desktop/src/main/java/bisq/desktop/components/HyperlinkWithIcon.java
index 368b67a22e..c9504c9da4 100644
--- a/desktop/src/main/java/bisq/desktop/components/HyperlinkWithIcon.java
+++ b/desktop/src/main/java/bisq/desktop/components/HyperlinkWithIcon.java
@@ -52,11 +52,21 @@ public class HyperlinkWithIcon extends Hyperlink {
}
public HyperlinkWithIcon(String text, GlyphIcons icon) {
+ this(text, icon, null);
+ }
+
+ public HyperlinkWithIcon(String text, GlyphIcons icon, String style) {
super(text);
Text textIcon = FormBuilder.getIcon(icon);
textIcon.setOpacity(0.7);
textIcon.getStyleClass().addAll("hyperlink", "no-underline");
+
+ if (style != null) {
+ textIcon.getStyleClass().add(style);
+ getStyleClass().add(style);
+ }
+
setPadding(new Insets(0));
setIcon(textIcon);
diff --git a/desktop/src/main/java/bisq/desktop/components/InfoAutoTooltipLabel.java b/desktop/src/main/java/bisq/desktop/components/InfoAutoTooltipLabel.java
index fe418e76d1..0f08bdf92e 100644
--- a/desktop/src/main/java/bisq/desktop/components/InfoAutoTooltipLabel.java
+++ b/desktop/src/main/java/bisq/desktop/components/InfoAutoTooltipLabel.java
@@ -17,9 +17,10 @@
package bisq.desktop.components;
-import bisq.common.UserThread;
import bisq.desktop.components.controlsfx.control.PopOver;
+import bisq.common.UserThread;
+
import de.jensd.fx.fontawesome.AwesomeIcon;
import de.jensd.fx.glyphs.GlyphIcons;
@@ -35,26 +36,52 @@ import static bisq.desktop.util.FormBuilder.getIcon;
public class InfoAutoTooltipLabel extends AutoTooltipLabel {
+ public static final int DEFAULT_WIDTH = 300;
private Node textIcon;
private Boolean hidePopover;
private PopOver infoPopover;
+ private ContentDisplay contentDisplay;
public InfoAutoTooltipLabel(String text, GlyphIcons icon, ContentDisplay contentDisplay, String info) {
- super(text);
+ this(text, contentDisplay);
- textIcon = getIcon(icon);
- addIcon(contentDisplay, info, 300);
+ setIcon(icon);
+ positionAndActivateIcon(contentDisplay, info, DEFAULT_WIDTH);
}
public InfoAutoTooltipLabel(String text, AwesomeIcon icon, ContentDisplay contentDisplay, String info, double width) {
super(text);
- textIcon = getIcon(icon);
- addIcon(contentDisplay, info, width);
+ setIcon(icon);
+ positionAndActivateIcon(contentDisplay, info, width);
}
- private void addIcon(ContentDisplay contentDisplay, String info, double width) {
+ public InfoAutoTooltipLabel(String text, ContentDisplay contentDisplay) {
+ super(text);
+ this.contentDisplay = contentDisplay;
+ }
+
+ public void setIcon(GlyphIcons icon) {
+ textIcon = getIcon(icon);
+ }
+
+ public void setIcon(GlyphIcons icon, String info) {
+ setIcon(icon);
+ positionAndActivateIcon(contentDisplay, info, DEFAULT_WIDTH);
+ }
+
+ public void setIcon(AwesomeIcon icon) {
+ textIcon = getIcon(icon);
+ }
+
+ public void hideIcon() {
+ textIcon = null;
+ setGraphic(textIcon);
+ }
+
+ private void positionAndActivateIcon(ContentDisplay contentDisplay, String info, double width) {
textIcon.setOpacity(0.4);
+ textIcon.getStyleClass().add("tooltip-icon");
textIcon.setOnMouseEntered(e -> {
hidePopover = false;
diff --git a/desktop/src/main/java/bisq/desktop/components/InfoTextField.java b/desktop/src/main/java/bisq/desktop/components/InfoTextField.java
index c4b27475fb..cc87dd7cb4 100644
--- a/desktop/src/main/java/bisq/desktop/components/InfoTextField.java
+++ b/desktop/src/main/java/bisq/desktop/components/InfoTextField.java
@@ -17,16 +17,19 @@
package bisq.desktop.components;
-import bisq.common.UserThread;
import bisq.desktop.components.controlsfx.control.PopOver;
+import bisq.common.UserThread;
+
import de.jensd.fx.fontawesome.AwesomeIcon;
+import de.jensd.fx.glyphs.materialdesignicons.MaterialDesignIcon;
import com.jfoenix.controls.JFXTextField;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
+import javafx.scene.text.Text;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
@@ -39,6 +42,7 @@ import org.slf4j.LoggerFactory;
import lombok.Getter;
import static bisq.desktop.util.FormBuilder.getIcon;
+import static bisq.desktop.util.FormBuilder.getRegularIconForLabel;
public class InfoTextField extends AnchorPane {
public static final Logger log = LoggerFactory.getLogger(InfoTextField.class);
@@ -48,7 +52,6 @@ public class InfoTextField extends AnchorPane {
private final StringProperty text = new SimpleStringProperty();
protected final Label infoIcon;
- protected final Label privacyIcon;
private Label currentIcon;
private Boolean hidePopover;
private PopOver popover;
@@ -68,18 +71,13 @@ public class InfoTextField extends AnchorPane {
infoIcon.setLayoutY(5);
infoIcon.getStyleClass().addAll("icon", "info");
- privacyIcon = getIcon(AwesomeIcon.EYE_CLOSE);
- privacyIcon.setLayoutY(5);
- privacyIcon.getStyleClass().addAll("icon", "info");
-
AnchorPane.setRightAnchor(infoIcon, 7.0);
- AnchorPane.setRightAnchor(privacyIcon, 7.0);
AnchorPane.setRightAnchor(textField, 0.0);
AnchorPane.setLeftAnchor(textField, 0.0);
hideIcons();
- getChildren().addAll(textField, infoIcon, privacyIcon);
+ getChildren().addAll(textField, infoIcon);
}
@@ -96,21 +94,20 @@ public class InfoTextField extends AnchorPane {
setActionHandlers(node);
}
- public void setContentForPrivacyPopOver(Node node) {
- currentIcon = privacyIcon;
-
+ public void setContent(MaterialDesignIcon icon, String info, String style, double opacity) {
hideIcons();
- setActionHandlers(node);
- }
- public void setIconsLeftAligned() {
- arrowLocation = PopOver.ArrowLocation.LEFT_TOP;;
+ currentIcon = new Label();
+ Text textIcon = getRegularIconForLabel(icon, currentIcon);
- AnchorPane.clearConstraints(infoIcon);
- AnchorPane.clearConstraints(privacyIcon);
+ setActionHandlers(new Label(info));
- AnchorPane.setLeftAnchor(infoIcon, 7.0);
- AnchorPane.setLeftAnchor(privacyIcon, 7.0);
+ currentIcon.setLayoutY(5);
+ textIcon.getStyleClass().addAll("icon", style);
+ currentIcon.setOpacity(opacity);
+ AnchorPane.setRightAnchor(currentIcon, 7.0);
+
+ getChildren().add(currentIcon);
}
///////////////////////////////////////////////////////////////////////////////////////////
@@ -119,8 +116,6 @@ public class InfoTextField extends AnchorPane {
private void hideIcons() {
infoIcon.setManaged(false);
infoIcon.setVisible(false);
- privacyIcon.setManaged(false);
- privacyIcon.setVisible(false);
}
private void setActionHandlers(Node node) {
diff --git a/desktop/src/main/java/bisq/desktop/components/PeerInfoIcon.java b/desktop/src/main/java/bisq/desktop/components/PeerInfoIcon.java
index 54d3725e61..af5428d188 100644
--- a/desktop/src/main/java/bisq/desktop/components/PeerInfoIcon.java
+++ b/desktop/src/main/java/bisq/desktop/components/PeerInfoIcon.java
@@ -25,14 +25,19 @@ import bisq.core.alert.PrivateNotificationManager;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.Res;
import bisq.core.offer.Offer;
+import bisq.core.payment.payload.PaymentMethod;
import bisq.core.trade.Trade;
import bisq.core.user.Preferences;
import bisq.core.util.BSFormatter;
import bisq.network.p2p.NodeAddress;
+import bisq.common.util.Tuple2;
+
import com.google.common.base.Charsets;
+import org.apache.commons.lang3.StringUtils;
+
import javafx.scene.Group;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
@@ -131,7 +136,7 @@ public class PeerInfoIcon extends Group {
peerTagMap = preferences.getPeerTagMap();
boolean hasTraded = numTrades > 0;
- long peersAccountAge = getPeersAccountAge(trade, offer);
+ Tuple2 peersAccount = getPeersAccountAge(trade, offer);
if (offer == null) {
checkNotNull(trade, "Trade must not be null if offer is null.");
offer = trade.getOffer();
@@ -142,7 +147,7 @@ public class PeerInfoIcon extends Group {
boolean isFiatCurrency = CurrencyUtil.isFiatCurrency(offer.getCurrencyCode());
String accountAge = isFiatCurrency ?
- peersAccountAge > -1 ? Res.get("peerInfoIcon.tooltip.age", DisplayUtils.formatAccountAge(peersAccountAge)) :
+ peersAccount.first > -1 ? Res.get("peerInfoIcon.tooltip.age", DisplayUtils.formatAccountAge(peersAccount.first)) :
Res.get("peerInfoIcon.tooltip.unknownAge") :
"";
tooltipText = hasTraded ?
@@ -152,7 +157,8 @@ public class PeerInfoIcon extends Group {
// outer circle
Color ringColor;
if (isFiatCurrency) {
- switch (accountAgeWitnessService.getAccountAgeCategory(peersAccountAge)) {
+
+ switch (accountAgeWitnessService.getPeersAccountAgeCategory(peersAccount.first)) {
case TWO_MONTHS_OR_MORE:
ringColor = Color.rgb(0, 225, 0); // > 2 months green
break;
@@ -160,9 +166,12 @@ public class PeerInfoIcon extends Group {
ringColor = Color.rgb(0, 139, 205); // 1-2 months blue
break;
case LESS_ONE_MONTH:
- default:
ringColor = Color.rgb(255, 140, 0); //< 1 month orange
break;
+ case UNVERIFIED:
+ default:
+ ringColor = Color.rgb(255, 0, 0); // not signed, red
+ break;
}
@@ -240,23 +249,36 @@ public class PeerInfoIcon extends Group {
getChildren().addAll(outerBackground, innerBackground, avatarImageView, tagPane, numTradesPane);
- addMouseListener(numTrades, privateNotificationManager, offer, preferences, formatter, useDevPrivilegeKeys, isFiatCurrency, peersAccountAge);
+ boolean needsSigning = PaymentMethod.hasChargebackRisk(offer.getPaymentMethod(), offer.getCurrencyCode());
+ String accountSigningState = null;
+ String accountAgeInfo = peersAccount.second;
+
+ if (needsSigning) {
+ AccountAgeWitnessService.SignState signState = accountAgeWitnessService.getSignState(offer);
+ accountSigningState = StringUtils.capitalize(signState.getPresentation());
+
+ if (signState.equals(AccountAgeWitnessService.SignState.UNSIGNED))
+ accountAgeInfo = null;
+ }
+
+ addMouseListener(numTrades, privateNotificationManager, offer, preferences, formatter, useDevPrivilegeKeys,
+ isFiatCurrency, peersAccount.first, accountAgeInfo, accountSigningState);
}
- private long getPeersAccountAge(@Nullable Trade trade, @Nullable Offer offer) {
+ private Tuple2 getPeersAccountAge(@Nullable Trade trade, @Nullable Offer offer) {
if (trade != null) {
offer = trade.getOffer();
if (offer == null) {
// unexpected
- return -1;
+ return new Tuple2<>(-1L, Res.get("peerInfo.age.noRisk"));
}
-
- return accountAgeWitnessService.getTradingPeersAccountAge(trade);
- } else {
- checkNotNull(offer, "Offer must not be null if trade is null.");
-
- return accountAgeWitnessService.getMakersAccountAge(offer, new Date());
}
+ checkNotNull(offer, "Offer must not be null if trade is null.");
+ if (PaymentMethod.hasChargebackRisk(offer.getPaymentMethod(), offer.getCurrencyCode())) {
+ return new Tuple2<>(accountAgeWitnessService.getWitnessSignAge(offer, new Date()),
+ Res.get("peerInfo.age.chargeBackRisk"));
+ }
+ return new Tuple2<>(accountAgeWitnessService.getAccountAge(offer), Res.get("peerInfo.age.noRisk"));
}
protected void addMouseListener(int numTrades,
@@ -266,16 +288,22 @@ public class PeerInfoIcon extends Group {
BSFormatter formatter,
boolean useDevPrivilegeKeys,
boolean isFiatCurrency,
- long makersAccountAge) {
- final String accountAgeTagEditor = isFiatCurrency ?
+ long makersAccountAge,
+ String makersAccountAgeInfo,
+ String accountSigningState) {
+
+ final String accountAgeTagEditor = isFiatCurrency && makersAccountAgeInfo != null ?
makersAccountAge > -1 ?
DisplayUtils.formatAccountAge(makersAccountAge) :
Res.get("peerInfo.unknownAge") :
null;
+
setOnMouseClicked(e -> new PeerInfoWithTagEditor(privateNotificationManager, offer, preferences, useDevPrivilegeKeys)
.fullAddress(fullAddress)
.numTrades(numTrades)
.accountAge(accountAgeTagEditor)
+ .accountAgeInfo(makersAccountAgeInfo)
+ .accountSigningState(accountSigningState)
.position(localToScene(new Point2D(0, 0)))
.onSave(newTag -> {
preferences.setTagForPeer(fullAddress, newTag);
diff --git a/desktop/src/main/java/bisq/desktop/components/PeerInfoIconSmall.java b/desktop/src/main/java/bisq/desktop/components/PeerInfoIconSmall.java
index c07bc5ff32..e506ffc2d5 100644
--- a/desktop/src/main/java/bisq/desktop/components/PeerInfoIconSmall.java
+++ b/desktop/src/main/java/bisq/desktop/components/PeerInfoIconSmall.java
@@ -35,11 +35,14 @@ public class PeerInfoIconSmall extends PeerInfoIcon {
@Override
protected void addMouseListener(int numTrades,
PrivateNotificationManager privateNotificationManager,
- Offer offer, Preferences preferences,
+ Offer offer,
+ Preferences preferences,
BSFormatter formatter,
boolean useDevPrivilegeKeys,
boolean isFiatCurrency,
- long makersAccountAge) {
+ long makersAccountAge,
+ String makersAccountAgeInfo,
+ String accountSigningState) {
}
@Override
diff --git a/desktop/src/main/java/bisq/desktop/components/paymentmethods/AssetsForm.java b/desktop/src/main/java/bisq/desktop/components/paymentmethods/AssetsForm.java
index 58078de9e4..6ddde75588 100644
--- a/desktop/src/main/java/bisq/desktop/components/paymentmethods/AssetsForm.java
+++ b/desktop/src/main/java/bisq/desktop/components/paymentmethods/AssetsForm.java
@@ -17,9 +17,8 @@
package bisq.desktop.components.paymentmethods;
-import bisq.desktop.components.InputTextField;
-import bisq.desktop.components.NewBadge;
import bisq.desktop.components.AutocompleteComboBox;
+import bisq.desktop.components.InputTextField;
import bisq.desktop.main.overlays.popups.Popup;
import bisq.desktop.util.FormBuilder;
import bisq.desktop.util.Layout;
@@ -48,12 +47,9 @@ import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
-import javafx.scene.layout.Priority;
-import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.geometry.Insets;
-import javafx.geometry.Pos;
import javafx.util.StringConverter;
@@ -120,19 +116,10 @@ public class AssetsForm extends PaymentMethodForm {
new Popup<>().information(Res.get("payment.altcoin.tradeInstant.popup")).show();
});
- // add new badge for this new feature for this release
- // TODO: remove it with 0.9.6+
gridPane.getChildren().remove(tradeInstantCheckBox);
tradeInstantCheckBox.setPadding(new Insets(0, 40, 0, 0));
- NewBadge instantTradeNewsBadge = new NewBadge(tradeInstantCheckBox, INSTANT_TRADE_NEWS, preferences);
- instantTradeNewsBadge.setAlignment(Pos.CENTER_LEFT);
- instantTradeNewsBadge.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
-
- GridPane.setRowIndex(instantTradeNewsBadge, gridRow);
- GridPane.setHgrow(instantTradeNewsBadge, Priority.NEVER);
- GridPane.setMargin(instantTradeNewsBadge, new Insets(10, 0, 0, 0));
- gridPane.getChildren().add(instantTradeNewsBadge);
+ gridPane.getChildren().add(tradeInstantCheckBox);
addressInputTextField = FormBuilder.addInputTextField(gridPane, ++gridRow,
Res.get("payment.altcoin.address"));
diff --git a/desktop/src/main/java/bisq/desktop/components/paymentmethods/PaymentMethodForm.java b/desktop/src/main/java/bisq/desktop/components/paymentmethods/PaymentMethodForm.java
index 1ac3618a0f..f35dd71a95 100644
--- a/desktop/src/main/java/bisq/desktop/components/paymentmethods/PaymentMethodForm.java
+++ b/desktop/src/main/java/bisq/desktop/components/paymentmethods/PaymentMethodForm.java
@@ -25,6 +25,7 @@ import bisq.desktop.util.DisplayUtils;
import bisq.desktop.util.FormBuilder;
import bisq.desktop.util.Layout;
+import bisq.core.account.witness.AccountAgeWitness;
import bisq.core.account.witness.AccountAgeWitnessService;
import bisq.core.locale.Country;
import bisq.core.locale.CurrencyUtil;
@@ -32,8 +33,10 @@ import bisq.core.locale.FiatCurrency;
import bisq.core.locale.Res;
import bisq.core.locale.TradeCurrency;
import bisq.core.offer.Offer;
+import bisq.core.offer.OfferPayload;
import bisq.core.payment.AssetAccount;
import bisq.core.payment.PaymentAccount;
+import bisq.core.payment.payload.PaymentMethod;
import bisq.core.util.BSFormatter;
import bisq.core.util.validation.InputValidator;
@@ -44,6 +47,8 @@ import org.bitcoinj.core.Coin;
import org.apache.commons.lang3.StringUtils;
+import de.jensd.fx.glyphs.materialdesignicons.MaterialDesignIcon;
+
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
@@ -60,7 +65,9 @@ import javafx.collections.FXCollections;
import javafx.util.StringConverter;
+import java.util.Date;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
@@ -178,16 +185,61 @@ public abstract class PaymentMethodForm {
final String limitationsText = paymentAccount instanceof AssetAccount ?
Res.get("payment.maxPeriodAndLimitCrypto",
getTimeText(hours),
- formatter.formatCoinWithCode(Coin.valueOf(accountAgeWitnessService.getMyTradeLimit(paymentAccount, tradeCurrency.getCode()))))
+ formatter.formatCoinWithCode(Coin.valueOf(accountAgeWitnessService.getMyTradeLimit(
+ paymentAccount, tradeCurrency.getCode(), OfferPayload.Direction.BUY))))
:
Res.get("payment.maxPeriodAndLimit",
getTimeText(hours),
- formatter.formatCoinWithCode(Coin.valueOf(accountAgeWitnessService.getMyTradeLimit(paymentAccount, tradeCurrency.getCode()))),
+ formatter.formatCoinWithCode(Coin.valueOf(accountAgeWitnessService.getMyTradeLimit(
+ paymentAccount, tradeCurrency.getCode(), OfferPayload.Direction.BUY))),
+ formatter.formatCoinWithCode(Coin.valueOf(accountAgeWitnessService.getMyTradeLimit(
+ paymentAccount, tradeCurrency.getCode(), OfferPayload.Direction.SELL))),
DisplayUtils.formatAccountAge(accountAge));
- if (isDisplayForm)
+ if (isDisplayForm) {
addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.limitations"), limitationsText);
- else
+
+ String accountSigningStateText;
+ MaterialDesignIcon icon;
+
+ boolean needsSigning = PaymentMethod.hasChargebackRisk(paymentAccount.getPaymentMethod(),
+ paymentAccount.getTradeCurrencies());
+
+ if (needsSigning) {
+
+ AccountAgeWitness myWitness = accountAgeWitnessService.getMyWitness(
+ paymentAccount.paymentAccountPayload);
+ AccountAgeWitnessService.SignState signState =
+ accountAgeWitnessService.getSignState(myWitness);
+
+ accountSigningStateText = StringUtils.capitalize(signState.getPresentation());
+
+ long daysSinceSigning = TimeUnit.MILLISECONDS.toDays(
+ accountAgeWitnessService.getWitnessSignAge(myWitness, new Date()));
+ String timeSinceSigning = Res.get("offerbook.timeSinceSigning.daysSinceSigning.long",
+ Res.get("offerbook.timeSinceSigning.daysSinceSigning",
+ daysSinceSigning));
+
+ switch (signState) {
+ case PEER_SIGNER:
+ case ARBITRATOR:
+ icon = MaterialDesignIcon.APPROVAL;
+ accountSigningStateText += " / " + timeSinceSigning;
+ break;
+ case PEER_INITIAL:
+ case PEER_LIMIT_LIFTED:
+ accountSigningStateText += " / " + timeSinceSigning;
+ default:
+ icon = MaterialDesignIcon.ALERT_CIRCLE_OUTLINE;
+ }
+
+ InfoTextField accountSigningField = addCompactTopLabelInfoTextField(gridPane, ++gridRow, Res.get("shared.accountSigningState"),
+ accountSigningStateText).second;
+ //TODO: add additional information regarding account signing
+ accountSigningField.setContent(icon, accountSigningStateText, "", 0.4);
+ }
+
+ } else
addTopLabelTextField(gridPane, ++gridRow, Res.get("payment.limitations"), limitationsText);
if (!(paymentAccount instanceof AssetAccount)) {
diff --git a/desktop/src/main/java/bisq/desktop/components/paymentmethods/RevolutForm.java b/desktop/src/main/java/bisq/desktop/components/paymentmethods/RevolutForm.java
index d9d26dc833..a473912ffd 100644
--- a/desktop/src/main/java/bisq/desktop/components/paymentmethods/RevolutForm.java
+++ b/desktop/src/main/java/bisq/desktop/components/paymentmethods/RevolutForm.java
@@ -88,7 +88,8 @@ public class RevolutForm extends PaymentMethodForm {
private void addCurrenciesGrid(boolean isEditable) {
FlowPane flowPane = addTopLabelFlowPane(gridPane, ++gridRow,
- Res.get("payment.supportedCurrencies"), 0).second;
+ Res.get("payment.supportedCurrencies"), Layout.FLOATING_LABEL_DISTANCE,
+ Layout.FLOATING_LABEL_DISTANCE).second;
if (isEditable)
flowPane.setId("flow-pane-checkboxes-bg");
diff --git a/desktop/src/main/java/bisq/desktop/images.css b/desktop/src/main/java/bisq/desktop/images.css
index 05b03c14e9..f943661fed 100644
--- a/desktop/src/main/java/bisq/desktop/images.css
+++ b/desktop/src/main/java/bisq/desktop/images.css
@@ -279,31 +279,10 @@
-fx-image: url("../../images/avatars/avatar_15.png");
}
-#poloniex {
- -fx-image: url("../../images/poloniex.png");
+#image-account-signing-screenshot {
+ -fx-image: url("../../images/account_signing_screenshot.png");
}
-#btcaverage {
- -fx-image: url("../../images/btcaverage.png");
+#image-new-trade-protocol-screenshot {
+ -fx-image: url("../../images/new_trade_protocol_screenshot.png");
}
-
-#accepted {
- -fx-image: url("../../images/accepted.png");
-}
-
-#rejected {
- -fx-image: url("../../images/rejected.png");
-}
-
-#dao-screenshot-governance {
- -fx-image: url("../../images/dao-screenshot-governance.png");
-}
-
-#dao-screenshot-trading {
- -fx-image: url("../../images/dao-screenshot-trading.png");
-}
-
-#dao-screenshot-cheaper-fees {
- -fx-image: url("../../images/dao-screenshot-cheaper-fees.png");
-}
-
diff --git a/desktop/src/main/java/bisq/desktop/main/MainView.java b/desktop/src/main/java/bisq/desktop/main/MainView.java
index ff09adc716..ad98f7bbe4 100644
--- a/desktop/src/main/java/bisq/desktop/main/MainView.java
+++ b/desktop/src/main/java/bisq/desktop/main/MainView.java
@@ -44,9 +44,9 @@ import bisq.desktop.util.Transitions;
import bisq.core.dao.monitoring.DaoStateMonitoringService;
import bisq.core.exceptions.BisqException;
import bisq.core.locale.GlobalSettings;
+import bisq.core.locale.LanguageUtil;
import bisq.core.locale.Res;
import bisq.core.util.BSFormatter;
-import bisq.core.locale.LanguageUtil;
import bisq.common.Timer;
import bisq.common.UserThread;
@@ -82,9 +82,9 @@ import javafx.scene.layout.VBox;
import javafx.scene.text.TextAlignment;
import javafx.geometry.Insets;
+import javafx.geometry.NodeOrientation;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
-import javafx.geometry.NodeOrientation;
import javafx.beans.binding.ObjectBinding;
import javafx.beans.property.BooleanProperty;
@@ -194,6 +194,8 @@ public class MainView extends InitializableView
JFXBadge supportButtonWithBadge = new JFXBadge(supportButton);
JFXBadge daoButtonWithBadge = new JFXBadge(daoButton);
daoButtonWithBadge.getStyleClass().add("new");
+ JFXBadge accountButtonWithBadge = new JFXBadge(accountButton);
+ accountButtonWithBadge.getStyleClass().add("new");
Locale locale = GlobalSettings.getLocale();
DecimalFormat currencyFormat = (DecimalFormat) NumberFormat.getNumberInstance(locale);
@@ -322,7 +324,7 @@ public class MainView extends InitializableView
HBox.setHgrow(primaryNav, Priority.SOMETIMES);
HBox secondaryNav = new HBox(supportButtonWithBadge, getNavigationSpacer(), settingsButton,
- getNavigationSpacer(), accountButton, getNavigationSpacer(), daoButtonWithBadge);
+ getNavigationSpacer(), accountButtonWithBadge, getNavigationSpacer(), daoButtonWithBadge);
secondaryNav.getStyleClass().add("nav-secondary");
HBox.setHgrow(secondaryNav, Priority.SOMETIMES);
@@ -366,6 +368,7 @@ public class MainView extends InitializableView
setupBadge(portfolioButtonWithBadge, model.getNumPendingTrades(), model.getShowPendingTradesNotification());
setupBadge(supportButtonWithBadge, model.getNumOpenSupportTickets(), model.getShowOpenSupportTicketsNotification());
setupBadge(daoButtonWithBadge, new SimpleStringProperty(Res.get("shared.new")), model.getShowDaoUpdatesNotification());
+ setupBadge(accountButtonWithBadge, new SimpleStringProperty(Res.get("shared.new")), model.getShowAccountUpdatesNotification());
navigation.addListener(viewPath -> {
if (viewPath.size() != 2 || viewPath.indexOf(MainView.class) != 0)
diff --git a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java
index 70726c52ac..5c37eee8dc 100644
--- a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java
+++ b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java
@@ -24,18 +24,20 @@ import bisq.desktop.components.TxIdTextField;
import bisq.desktop.main.overlays.Overlay;
import bisq.desktop.main.overlays.notifications.NotificationCenter;
import bisq.desktop.main.overlays.popups.Popup;
-import bisq.desktop.main.overlays.windows.DaoLaunchWindow;
import bisq.desktop.main.overlays.windows.DisplayAlertMessageWindow;
+import bisq.desktop.main.overlays.windows.NewTradeProtocolLaunchWindow;
import bisq.desktop.main.overlays.windows.TacWindow;
import bisq.desktop.main.overlays.windows.TorNetworkSettingsWindow;
import bisq.desktop.main.overlays.windows.WalletPasswordWindow;
import bisq.desktop.main.overlays.windows.downloadupdate.DisplayUpdateDownloadWindow;
+import bisq.desktop.main.presentation.AccountPresentation;
import bisq.desktop.main.presentation.DaoPresentation;
import bisq.desktop.main.presentation.MarketPricePresentation;
import bisq.desktop.main.shared.PriceFeedComboBoxItem;
import bisq.desktop.util.DisplayUtils;
import bisq.desktop.util.GUIUtil;
+import bisq.core.account.sign.SignedWitnessService;
import bisq.core.account.witness.AccountAgeWitnessService;
import bisq.core.alert.PrivateNotificationManager;
import bisq.core.app.AppOptionKeys;
@@ -43,6 +45,7 @@ import bisq.core.app.BisqEnvironment;
import bisq.core.app.BisqSetup;
import bisq.core.btc.setup.WalletsSetup;
import bisq.core.btc.wallet.BtcWalletService;
+import bisq.core.locale.CryptoCurrency;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.Res;
import bisq.core.payment.AliPayAccount;
@@ -56,7 +59,6 @@ import bisq.core.trade.TradeManager;
import bisq.core.user.DontShowAgainLookup;
import bisq.core.user.Preferences;
import bisq.core.user.User;
-import bisq.core.util.BSFormatter;
import bisq.network.p2p.BootstrapListener;
import bisq.network.p2p.P2PService;
@@ -68,8 +70,6 @@ import bisq.common.storage.CorruptedDatabaseFilesHandler;
import com.google.inject.Inject;
-import javafx.geometry.HPos;
-
import org.fxmisc.easybind.EasyBind;
import org.fxmisc.easybind.monadic.MonadicBinding;
@@ -87,6 +87,7 @@ import javafx.collections.ObservableList;
import java.util.Comparator;
import java.util.Date;
+import java.util.Optional;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
@@ -104,6 +105,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
private final SupportTicketsPresentation supportTicketsPresentation;
private final MarketPricePresentation marketPricePresentation;
private final DaoPresentation daoPresentation;
+ private final AccountPresentation accountPresentation;
private final P2PService p2PService;
private final TradeManager tradeManager;
@Getter
@@ -119,7 +121,6 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
@Getter
private final TorNetworkSettingsWindow torNetworkSettingsWindow;
private final CorruptedDatabaseFilesHandler corruptedDatabaseFilesHandler;
- private final BSFormatter formatter;
@Getter
private BooleanProperty showAppScreen = new SimpleBooleanProperty();
@@ -146,7 +147,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
SupportTicketsPresentation supportTicketsPresentation,
MarketPricePresentation marketPricePresentation,
DaoPresentation daoPresentation,
- P2PService p2PService,
+ AccountPresentation accountPresentation, P2PService p2PService,
TradeManager tradeManager,
Preferences preferences,
PrivateNotificationManager privateNotificationManager,
@@ -158,8 +159,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
BisqEnvironment bisqEnvironment,
AccountAgeWitnessService accountAgeWitnessService,
TorNetworkSettingsWindow torNetworkSettingsWindow,
- CorruptedDatabaseFilesHandler corruptedDatabaseFilesHandler,
- BSFormatter formatter) {
+ CorruptedDatabaseFilesHandler corruptedDatabaseFilesHandler) {
this.bisqSetup = bisqSetup;
this.walletsSetup = walletsSetup;
this.user = user;
@@ -168,6 +168,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
this.supportTicketsPresentation = supportTicketsPresentation;
this.marketPricePresentation = marketPricePresentation;
this.daoPresentation = daoPresentation;
+ this.accountPresentation = accountPresentation;
this.p2PService = p2PService;
this.tradeManager = tradeManager;
this.preferences = preferences;
@@ -180,7 +181,6 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
this.accountAgeWitnessService = accountAgeWitnessService;
this.torNetworkSettingsWindow = torNetworkSettingsWindow;
this.corruptedDatabaseFilesHandler = corruptedDatabaseFilesHandler;
- this.formatter = formatter;
TxIdTextField.setPreferences(preferences);
@@ -243,6 +243,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
marketPricePresentation.setup();
daoPresentation.setup();
+ accountPresentation.setup();
if (DevEnv.isDevMode()) {
preferences.setShowOwnOffersInOfferBook(true);
@@ -265,7 +266,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
// in MainView showAppScreen handler
notificationCenter.onAllServicesAndViewsInitialized();
- maybeAddDaoLaunchWindowToQueue();
+ maybeAddNewTradeProtocolLaunchWindowToQueue();
maybeShowPopupsFromQueue();
}
@@ -288,33 +289,26 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
tacWindow.onAction(acceptedHandler::run).show();
}, 1));
- bisqSetup.setCryptoSetupFailedHandler(msg -> {
- UserThread.execute(() -> new Popup<>().warning(msg)
- .useShutDownButton()
- .useReportBugButton()
- .show());
- });
+ bisqSetup.setCryptoSetupFailedHandler(msg -> UserThread.execute(() ->
+ new Popup<>().warning(msg)
+ .useShutDownButton()
+ .useReportBugButton()
+ .show()));
bisqSetup.setDisplayTorNetworkSettingsHandler(show -> {
if (show)
torNetworkSettingsWindow.show();
else
torNetworkSettingsWindow.hide();
});
- bisqSetup.setSpvFileCorruptedHandler(msg -> {
- new Popup<>().warning(msg)
- .actionButtonText(Res.get("settings.net.reSyncSPVChainButton"))
- .onAction(() -> GUIUtil.reSyncSPVChain(walletsSetup, preferences))
- .show();
- });
- bisqSetup.setVoteResultExceptionHandler(voteResultException -> {
- log.warn(voteResultException.toString());
- });
+ bisqSetup.setSpvFileCorruptedHandler(msg -> new Popup<>().warning(msg)
+ .actionButtonText(Res.get("settings.net.reSyncSPVChainButton"))
+ .onAction(() -> GUIUtil.reSyncSPVChain(preferences))
+ .show());
+ bisqSetup.setVoteResultExceptionHandler(voteResultException -> log.warn(voteResultException.toString()));
- bisqSetup.setChainFileLockedExceptionHandler(msg -> {
- new Popup<>().warning(msg)
- .useShutDownButton()
- .show();
- });
+ bisqSetup.setChainFileLockedExceptionHandler(msg -> new Popup<>().warning(msg)
+ .useShutDownButton()
+ .show());
bisqSetup.setLockedUpFundsHandler(msg -> new Popup<>().warning(msg).show());
bisqSetup.setShowFirstPopupIfResyncSPVRequestedHandler(this::showFirstPopupIfResyncSPVRequested);
bisqSetup.setRequestWalletPasswordHandler(aesKeyHandler -> walletPasswordWindow
@@ -335,9 +329,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
bisqSetup.setDisplayAlertHandler(alert -> new DisplayAlertMessageWindow()
.alertMessage(alert)
.closeButtonText(Res.get("shared.close"))
- .onClose(() -> {
- user.setDisplayedAlert(alert);
- })
+ .onClose(() -> user.setDisplayedAlert(alert))
.show());
bisqSetup.setDisplayPrivateNotificationHandler(privateNotification ->
new Popup<>().headLine(Res.get("popup.privateNotification.headline"))
@@ -361,16 +353,22 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
popupQueue.add(popup);
}
});
+ bisqSetup.setDisplaySignedByArbitratorHandler(key -> accountPresentation.showOneTimeAccountSigningPopup(
+ key, "popup.accountSigning.signedByArbitrator"));
+ bisqSetup.setDisplaySignedByPeerHandler(key -> accountPresentation.showOneTimeAccountSigningPopup(
+ key, "popup.accountSigning.signedByPeer", String.valueOf(SignedWitnessService.SIGNER_AGE_DAYS)));
+ bisqSetup.setDisplayPeerLimitLiftedHandler(key -> accountPresentation.showOneTimeAccountSigningPopup(
+ key, "popup.accountSigning.peerLimitLifted"));
+ bisqSetup.setDisplayPeerSignerHandler(key -> accountPresentation.showOneTimeAccountSigningPopup(
+ key, "popup.accountSigning.peerSigner"));
bisqSetup.setWrongOSArchitectureHandler(msg -> new Popup<>().warning(msg).show());
- corruptedDatabaseFilesHandler.getCorruptedDatabaseFiles().ifPresent(files -> {
- new Popup<>()
- .warning(Res.get("popup.warning.incompatibleDB", files.toString(),
- bisqEnvironment.getProperty(AppOptionKeys.APP_DATA_DIR_KEY)))
- .useShutDownButton()
- .show();
- });
+ corruptedDatabaseFilesHandler.getCorruptedDatabaseFiles().ifPresent(files -> new Popup<>()
+ .warning(Res.get("popup.warning.incompatibleDB", files.toString(),
+ bisqEnvironment.getProperty(AppOptionKeys.APP_DATA_DIR_KEY)))
+ .useShutDownButton()
+ .show());
tradeManager.setTakeOfferRequestErrorMessageHandler(errorMessage -> new Popup<>()
.warning(Res.get("popup.error.takeOfferRequestFailed", errorMessage))
@@ -379,9 +377,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
bisqSetup.getBtcSyncProgress().addListener((observable, oldValue, newValue) -> updateBtcSyncProgress());
daoPresentation.getBsqSyncProgress().addListener((observable, oldValue, newValue) -> updateBtcSyncProgress());
- bisqSetup.setFilterWarningHandler(warning -> {
- new Popup<>().warning(warning).show();
- });
+ bisqSetup.setFilterWarningHandler(warning -> new Popup<>().warning(warning).show());
}
private void setupP2PNumPeersWatcher() {
@@ -483,7 +479,9 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
cryptoCurrencyAccount.init();
cryptoCurrencyAccount.setAccountName("ETH dummy");// Don't translate only for dev
cryptoCurrencyAccount.setAddress("0x" + new Random().nextInt(1000000));
- cryptoCurrencyAccount.setSingleTradeCurrency(CurrencyUtil.getCryptoCurrency("ETH").get());
+ Optional eth = CurrencyUtil.getCryptoCurrency("ETH");
+ eth.ifPresent(cryptoCurrencyAccount::setSingleTradeCurrency);
+
user.addPaymentAccount(cryptoCurrencyAccount);
}
}
@@ -593,10 +591,6 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
return marketPricePresentation.getIsFiatCurrencyPriceFeedSelected();
}
- BooleanProperty getIsCryptoCurrencyPriceFeedSelected() {
- return marketPricePresentation.getIsCryptoCurrencyPriceFeedSelected();
- }
-
BooleanProperty getIsExternallyProvidedPrice() {
return marketPricePresentation.getIsExternallyProvidedPrice();
}
@@ -621,21 +615,19 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener {
return daoPresentation.getShowDaoUpdatesNotification();
}
- private void maybeAddDaoLaunchWindowToQueue() {
- if (DevEnv.isDaoActivated()) {
- String daoLaunchPopupKey = "daoLaunchPopup";
- if (DontShowAgainLookup.showAgain(daoLaunchPopupKey)) {
- DaoLaunchWindow daoLaunchWindow = new DaoLaunchWindow()
- .headLine(Res.get("popup.dao.launch.headline"))
- .closeButtonText(Res.get("shared.dismiss"))
- .actionButtonText(Res.get("shared.learnMore"))
- .onAction(() -> GUIUtil.openWebPage("https://docs.bisq.network/dao.html"))
- .buttonAlignment(HPos.CENTER);
- daoLaunchWindow.setDisplayOrderPriority(1);
- popupQueue.add(daoLaunchWindow);
+ public BooleanProperty getShowAccountUpdatesNotification() {
+ return accountPresentation.getShowAccountUpdatesNotification();
+ }
- DontShowAgainLookup.dontShowAgain(daoLaunchPopupKey, true);
- }
+ private void maybeAddNewTradeProtocolLaunchWindowToQueue() {
+ String newTradeProtocolWithAccountSigningLaunchPopupKey = "newTradeProtocolWithAccountSigningLaunchPopup";
+ if (DontShowAgainLookup.showAgain(newTradeProtocolWithAccountSigningLaunchPopupKey)) {
+ NewTradeProtocolLaunchWindow newTradeProtocolLaunchWindow = new NewTradeProtocolLaunchWindow()
+ .headLine(Res.get("popup.news.launch.headline"));
+ newTradeProtocolLaunchWindow.setDisplayOrderPriority(1);
+ popupQueue.add(newTradeProtocolLaunchWindow);
+
+ DontShowAgainLookup.dontShowAgain(newTradeProtocolWithAccountSigningLaunchPopupKey, true);
}
}
diff --git a/desktop/src/main/java/bisq/desktop/main/account/AccountView.java b/desktop/src/main/java/bisq/desktop/main/account/AccountView.java
index 0c9dc8c8e2..692f13c536 100644
--- a/desktop/src/main/java/bisq/desktop/main/account/AccountView.java
+++ b/desktop/src/main/java/bisq/desktop/main/account/AccountView.java
@@ -32,9 +32,12 @@ import bisq.desktop.main.account.content.password.PasswordView;
import bisq.desktop.main.account.content.seedwords.SeedWordsView;
import bisq.desktop.main.account.register.arbitrator.ArbitratorRegistrationView;
import bisq.desktop.main.account.register.mediator.MediatorRegistrationView;
+import bisq.desktop.main.account.register.refundagent.RefundAgentRegistrationView;
import bisq.desktop.main.overlays.popups.Popup;
+import bisq.desktop.main.presentation.AccountPresentation;
import bisq.core.locale.Res;
+import bisq.core.user.DontShowAgainLookup;
import bisq.common.app.DevEnv;
import bisq.common.util.Utilities;
@@ -73,8 +76,10 @@ public class AccountView extends ActivatableView {
private Tab selectedTab;
private Tab arbitratorRegistrationTab;
private Tab mediatorRegistrationTab;
+ private Tab refundAgentRegistrationTab;
private ArbitratorRegistrationView arbitratorRegistrationView;
private MediatorRegistrationView mediatorRegistrationView;
+ private RefundAgentRegistrationView refundAgentRegistrationView;
private Scene scene;
private EventHandler keyEventEventHandler;
private ListChangeListener tabListChangeListener;
@@ -103,6 +108,8 @@ public class AccountView extends ActivatableView {
navigation.navigateTo(MainView.class, AccountView.class, FiatAccountsView.class);
} else if (mediatorRegistrationTab == null && viewPath.get(2).equals(MediatorRegistrationView.class)) {
navigation.navigateTo(MainView.class, AccountView.class, FiatAccountsView.class);
+ } else if (refundAgentRegistrationTab == null && viewPath.get(2).equals(RefundAgentRegistrationView.class)) {
+ navigation.navigateTo(MainView.class, AccountView.class, FiatAccountsView.class);
} else {
loadView(viewPath.tip());
}
@@ -116,6 +123,9 @@ public class AccountView extends ActivatableView {
if (mediatorRegistrationTab != null) {
root.getTabs().remove(mediatorRegistrationTab);
}
+ if (refundAgentRegistrationTab != null) {
+ root.getTabs().remove(refundAgentRegistrationTab);
+ }
arbitratorRegistrationTab = new Tab(Res.get("account.tab.arbitratorRegistration").toUpperCase());
arbitratorRegistrationTab.setClosable(true);
root.getTabs().add(arbitratorRegistrationTab);
@@ -124,10 +134,24 @@ public class AccountView extends ActivatableView {
if (arbitratorRegistrationTab != null) {
root.getTabs().remove(arbitratorRegistrationTab);
}
+ if (refundAgentRegistrationTab != null) {
+ root.getTabs().remove(refundAgentRegistrationTab);
+ }
mediatorRegistrationTab = new Tab(Res.get("account.tab.mediatorRegistration").toUpperCase());
mediatorRegistrationTab.setClosable(true);
root.getTabs().add(mediatorRegistrationTab);
navigation.navigateTo(MainView.class, AccountView.class, MediatorRegistrationView.class);
+ } else if (Utilities.isAltOrCtrlPressed(KeyCode.N, event) && refundAgentRegistrationTab == null) {
+ if (arbitratorRegistrationTab != null) {
+ root.getTabs().remove(arbitratorRegistrationTab);
+ }
+ if (mediatorRegistrationTab != null) {
+ root.getTabs().remove(mediatorRegistrationTab);
+ }
+ refundAgentRegistrationTab = new Tab(Res.get("account.tab.refundAgentRegistration").toUpperCase());
+ refundAgentRegistrationTab.setClosable(true);
+ root.getTabs().add(refundAgentRegistrationTab);
+ navigation.navigateTo(MainView.class, AccountView.class, RefundAgentRegistrationView.class);
}
};
@@ -136,6 +160,8 @@ public class AccountView extends ActivatableView