If you are using a wallet that supports OpenAlias (like the 'official' CLI and GUI wallets), you can simply put `fund@haveno.exchange` as the "receiver" address.
-
-### Bitcoin
-
-
-
- 1AKq3CE1yBAnxGmHXbNFfNYStcByNDc5gQ
-
diff --git a/apitest/src/test/java/haveno/apitest/method/MethodTest.java b/apitest/src/test/java/haveno/apitest/method/MethodTest.java
index 739c7c03c7..01c7a3bfd3 100644
--- a/apitest/src/test/java/haveno/apitest/method/MethodTest.java
+++ b/apitest/src/test/java/haveno/apitest/method/MethodTest.java
@@ -43,7 +43,7 @@ import java.util.stream.Collectors;
import static haveno.apitest.config.ApiTestConfig.BTC;
import static haveno.apitest.config.ApiTestRateMeterInterceptorConfig.getTestRateMeterInterceptorConfig;
import static haveno.cli.table.builder.TableType.BTC_BALANCE_TBL;
-import static haveno.core.xmr.wallet.Restrictions.getDefaultBuyerSecurityDepositAsPercent;
+import static haveno.core.xmr.wallet.Restrictions.getDefaultSecurityDepositAsPercent;
import static java.lang.String.format;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Arrays.stream;
@@ -157,8 +157,8 @@ public class MethodTest extends ApiTestCase {
return haveno.core.payment.PaymentAccount.fromProto(paymentAccount, CORE_PROTO_RESOLVER);
}
- public static final Supplier defaultBuyerSecurityDepositPct = () -> {
- var defaultPct = BigDecimal.valueOf(getDefaultBuyerSecurityDepositAsPercent());
+ public static final Supplier defaultSecurityDepositPct = () -> {
+ var defaultPct = BigDecimal.valueOf(getDefaultSecurityDepositAsPercent());
if (defaultPct.precision() != 2)
throw new IllegalStateException(format(
"Unexpected decimal precision, expected 2 but actual is %d%n."
diff --git a/apitest/src/test/java/haveno/apitest/method/offer/CancelOfferTest.java b/apitest/src/test/java/haveno/apitest/method/offer/CancelOfferTest.java
index a7776dd683..1867605507 100644
--- a/apitest/src/test/java/haveno/apitest/method/offer/CancelOfferTest.java
+++ b/apitest/src/test/java/haveno/apitest/method/offer/CancelOfferTest.java
@@ -47,7 +47,7 @@ public class CancelOfferTest extends AbstractOfferTest {
10000000L,
10000000L,
0.00,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
paymentAccountId,
NO_TRIGGER_PRICE);
};
diff --git a/apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingFixedPriceTest.java b/apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingFixedPriceTest.java
index 38d83f696d..49c01d5ae4 100644
--- a/apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingFixedPriceTest.java
+++ b/apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingFixedPriceTest.java
@@ -49,7 +49,7 @@ public class CreateOfferUsingFixedPriceTest extends AbstractOfferTest {
10_000_000L,
10_000_000L,
"36000",
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
audAccount.getId());
log.debug("Offer #1:\n{}", toOfferTable.apply(newOffer));
assertTrue(newOffer.getIsMyOffer());
@@ -97,7 +97,7 @@ public class CreateOfferUsingFixedPriceTest extends AbstractOfferTest {
10_000_000L,
10_000_000L,
"30000.1234",
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
usdAccount.getId());
log.debug("Offer #2:\n{}", toOfferTable.apply(newOffer));
assertTrue(newOffer.getIsMyOffer());
@@ -145,7 +145,7 @@ public class CreateOfferUsingFixedPriceTest extends AbstractOfferTest {
10_000_000L,
5_000_000L,
"29500.1234",
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
eurAccount.getId());
log.debug("Offer #3:\n{}", toOfferTable.apply(newOffer));
assertTrue(newOffer.getIsMyOffer());
diff --git a/apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java b/apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java
index cc6f53acdc..f4dff640c1 100644
--- a/apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java
+++ b/apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java
@@ -66,7 +66,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractOfferTest {
10_000_000L,
10_000_000L,
priceMarginPctInput,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
usdAccount.getId(),
NO_TRIGGER_PRICE);
log.debug("Offer #1:\n{}", toOfferTable.apply(newOffer));
@@ -114,7 +114,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractOfferTest {
10_000_000L,
10_000_000L,
priceMarginPctInput,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
nzdAccount.getId(),
NO_TRIGGER_PRICE);
log.debug("Offer #2:\n{}", toOfferTable.apply(newOffer));
@@ -162,7 +162,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractOfferTest {
10_000_000L,
5_000_000L,
priceMarginPctInput,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
gbpAccount.getId(),
NO_TRIGGER_PRICE);
log.debug("Offer #3:\n{}", toOfferTable.apply(newOffer));
@@ -210,7 +210,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractOfferTest {
10_000_000L,
5_000_000L,
priceMarginPctInput,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
brlAccount.getId(),
NO_TRIGGER_PRICE);
log.debug("Offer #4:\n{}", toOfferTable.apply(newOffer));
@@ -259,7 +259,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractOfferTest {
10_000_000L,
5_000_000L,
0.0,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
usdAccount.getId(),
triggerPrice);
assertTrue(newOffer.getIsMyOffer());
diff --git a/apitest/src/test/java/haveno/apitest/method/offer/CreateXMROffersTest.java b/apitest/src/test/java/haveno/apitest/method/offer/CreateXMROffersTest.java
index 4b7032c86f..8571c0c59d 100644
--- a/apitest/src/test/java/haveno/apitest/method/offer/CreateXMROffersTest.java
+++ b/apitest/src/test/java/haveno/apitest/method/offer/CreateXMROffersTest.java
@@ -62,7 +62,7 @@ public class CreateXMROffersTest extends AbstractOfferTest {
100_000_000L,
75_000_000L,
"0.005", // FIXED PRICE IN BTC FOR 1 XMR
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
alicesXmrAcct.getId());
log.debug("Sell XMR (Buy BTC) offer:\n{}", toOfferTable.apply(newOffer));
assertTrue(newOffer.getIsMyOffer());
@@ -108,7 +108,7 @@ public class CreateXMROffersTest extends AbstractOfferTest {
100_000_000L,
50_000_000L,
"0.005", // FIXED PRICE IN BTC (satoshis) FOR 1 XMR
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
alicesXmrAcct.getId());
log.debug("Buy XMR (Sell BTC) offer:\n{}", toOfferTable.apply(newOffer));
assertTrue(newOffer.getIsMyOffer());
@@ -156,7 +156,7 @@ public class CreateXMROffersTest extends AbstractOfferTest {
100_000_000L,
75_000_000L,
priceMarginPctInput,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
alicesXmrAcct.getId(),
triggerPrice);
log.debug("Pending Sell XMR (Buy BTC) offer:\n{}", toOfferTable.apply(newOffer));
@@ -211,7 +211,7 @@ public class CreateXMROffersTest extends AbstractOfferTest {
100_000_000L,
50_000_000L,
priceMarginPctInput,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
alicesXmrAcct.getId(),
NO_TRIGGER_PRICE);
log.debug("Buy XMR (Sell BTC) offer:\n{}", toOfferTable.apply(newOffer));
diff --git a/apitest/src/test/java/haveno/apitest/method/offer/ValidateCreateOfferTest.java b/apitest/src/test/java/haveno/apitest/method/offer/ValidateCreateOfferTest.java
index f299801c5a..e8745c1b2c 100644
--- a/apitest/src/test/java/haveno/apitest/method/offer/ValidateCreateOfferTest.java
+++ b/apitest/src/test/java/haveno/apitest/method/offer/ValidateCreateOfferTest.java
@@ -47,7 +47,7 @@ public class ValidateCreateOfferTest extends AbstractOfferTest {
100000000000L, // exceeds amount limit
100000000000L,
"10000.0000",
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
usdAccount.getId()));
assertEquals("UNKNOWN: An error occurred at task: ValidateOffer", exception.getMessage());
}
@@ -63,7 +63,7 @@ public class ValidateCreateOfferTest extends AbstractOfferTest {
10000000L,
10000000L,
"40000.0000",
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
chfAccount.getId()));
String expectedError = format("UNKNOWN: cannot create EUR offer with payment account %s", chfAccount.getId());
assertEquals(expectedError, exception.getMessage());
@@ -80,7 +80,7 @@ public class ValidateCreateOfferTest extends AbstractOfferTest {
10000000L,
10000000L,
"63000.0000",
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
audAccount.getId()));
String expectedError = format("UNKNOWN: cannot create CAD offer with payment account %s", audAccount.getId());
assertEquals(expectedError, exception.getMessage());
diff --git a/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferTest.java b/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferTest.java
index fee6e798ba..abbec38ff6 100644
--- a/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferTest.java
+++ b/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferTest.java
@@ -52,7 +52,7 @@ public class TakeBuyBTCOfferTest extends AbstractTradeTest {
12_500_000L,
12_500_000L, // min-amount = amount
0.00,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
alicesUsdAccount.getId(),
NO_TRIGGER_PRICE);
var offerId = alicesOffer.getId();
diff --git a/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferWithNationalBankAcctTest.java b/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferWithNationalBankAcctTest.java
index 10be976c8b..3199a6b053 100644
--- a/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferWithNationalBankAcctTest.java
+++ b/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferWithNationalBankAcctTest.java
@@ -96,7 +96,7 @@ public class TakeBuyBTCOfferWithNationalBankAcctTest extends AbstractTradeTest {
1_000_000L,
1_000_000L, // min-amount = amount
0.00,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
alicesPaymentAccount.getId(),
NO_TRIGGER_PRICE);
var offerId = alicesOffer.getId();
diff --git a/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyXMROfferTest.java b/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyXMROfferTest.java
index 40289e1d50..f61203400b 100644
--- a/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyXMROfferTest.java
+++ b/apitest/src/test/java/haveno/apitest/method/trade/TakeBuyXMROfferTest.java
@@ -65,7 +65,7 @@ public class TakeBuyXMROfferTest extends AbstractTradeTest {
15_000_000L,
7_500_000L,
"0.00455500", // FIXED PRICE IN BTC (satoshis) FOR 1 XMR
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
alicesXmrAcct.getId());
log.debug("Alice's BUY XMR (SELL BTC) Offer:\n{}", new TableBuilder(OFFER_TBL, alicesOffer).build());
genBtcBlocksThenWait(1, 5000);
diff --git a/apitest/src/test/java/haveno/apitest/method/trade/TakeSellBTCOfferTest.java b/apitest/src/test/java/haveno/apitest/method/trade/TakeSellBTCOfferTest.java
index a425759717..4f43c21cd7 100644
--- a/apitest/src/test/java/haveno/apitest/method/trade/TakeSellBTCOfferTest.java
+++ b/apitest/src/test/java/haveno/apitest/method/trade/TakeSellBTCOfferTest.java
@@ -58,7 +58,7 @@ public class TakeSellBTCOfferTest extends AbstractTradeTest {
12_500_000L,
12_500_000L, // min-amount = amount
0.00,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
alicesUsdAccount.getId(),
NO_TRIGGER_PRICE);
var offerId = alicesOffer.getId();
diff --git a/apitest/src/test/java/haveno/apitest/method/trade/TakeSellXMROfferTest.java b/apitest/src/test/java/haveno/apitest/method/trade/TakeSellXMROfferTest.java
index 68daa64050..9a769b5f04 100644
--- a/apitest/src/test/java/haveno/apitest/method/trade/TakeSellXMROfferTest.java
+++ b/apitest/src/test/java/haveno/apitest/method/trade/TakeSellXMROfferTest.java
@@ -71,7 +71,7 @@ public class TakeSellXMROfferTest extends AbstractTradeTest {
20_000_000L,
10_500_000L,
priceMarginPctInput,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
alicesXmrAcct.getId(),
NO_TRIGGER_PRICE);
log.debug("Alice's SELL XMR (BUY BTC) Offer:\n{}", new TableBuilder(OFFER_TBL, alicesOffer).build());
diff --git a/apitest/src/test/java/haveno/apitest/scenario/LongRunningOfferDeactivationTest.java b/apitest/src/test/java/haveno/apitest/scenario/LongRunningOfferDeactivationTest.java
index 13b72ff79f..356b77ef8a 100644
--- a/apitest/src/test/java/haveno/apitest/scenario/LongRunningOfferDeactivationTest.java
+++ b/apitest/src/test/java/haveno/apitest/scenario/LongRunningOfferDeactivationTest.java
@@ -57,7 +57,7 @@ public class LongRunningOfferDeactivationTest extends AbstractOfferTest {
1_000_000,
1_000_000,
0.00,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
paymentAcct.getId(),
triggerPrice);
log.info("SELL offer {} created with margin based price {}.",
@@ -103,7 +103,7 @@ public class LongRunningOfferDeactivationTest extends AbstractOfferTest {
1_000_000,
1_000_000,
0.00,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
paymentAcct.getId(),
triggerPrice);
log.info("BUY offer {} created with margin based price {}.",
diff --git a/apitest/src/test/java/haveno/apitest/scenario/bot/RandomOffer.java b/apitest/src/test/java/haveno/apitest/scenario/bot/RandomOffer.java
index eebaec8b04..4e8b86afac 100644
--- a/apitest/src/test/java/haveno/apitest/scenario/bot/RandomOffer.java
+++ b/apitest/src/test/java/haveno/apitest/scenario/bot/RandomOffer.java
@@ -28,7 +28,7 @@ import java.text.DecimalFormat;
import java.util.Objects;
import java.util.function.Supplier;
-import static haveno.apitest.method.offer.AbstractOfferTest.defaultBuyerSecurityDepositPct;
+import static haveno.apitest.method.offer.AbstractOfferTest.defaultSecurityDepositPct;
import static haveno.cli.CurrencyFormat.formatInternalFiatPrice;
import static haveno.cli.CurrencyFormat.formatSatoshis;
import static haveno.common.util.MathUtils.scaleDownByPowerOf10;
@@ -119,7 +119,7 @@ public class RandomOffer {
amount,
minAmount,
priceMargin,
- defaultBuyerSecurityDepositPct.get(),
+ defaultSecurityDepositPct.get(),
"0" /*no trigger price*/);
} else {
this.offer = botClient.createOfferAtFixedPrice(paymentAccount,
@@ -128,7 +128,7 @@ public class RandomOffer {
amount,
minAmount,
fixedOfferPrice,
- defaultBuyerSecurityDepositPct.get());
+ defaultSecurityDepositPct.get());
}
this.id = offer.getId();
return this;
diff --git a/assets/src/main/java/haveno/asset/package-info.java b/assets/src/main/java/haveno/asset/package-info.java
index a50b986115..6eeaf4095f 100644
--- a/assets/src/main/java/haveno/asset/package-info.java
+++ b/assets/src/main/java/haveno/asset/package-info.java
@@ -21,7 +21,7 @@
* {@link haveno.asset.Token} and {@link haveno.asset.Erc20Token}, as well as concrete
* implementations of each, such as {@link haveno.asset.coins.Bitcoin} itself, cryptos like
* {@link haveno.asset.coins.Litecoin} and {@link haveno.asset.coins.Ether} and tokens like
- * {@link haveno.asset.tokens.DaiStablecoin}.
+ * {@link haveno.asset.tokens.DaiStablecoinERC20}.
*
* The purpose of this package is to provide everything necessary for registering
* ("listing") new assets and managing / accessing those assets within, e.g. the Haveno
diff --git a/assets/src/main/java/haveno/asset/tokens/DaiStablecoin.java b/assets/src/main/java/haveno/asset/tokens/DaiStablecoinERC20.java
similarity index 85%
rename from assets/src/main/java/haveno/asset/tokens/DaiStablecoin.java
rename to assets/src/main/java/haveno/asset/tokens/DaiStablecoinERC20.java
index e9cc01f74f..8c1e84e871 100644
--- a/assets/src/main/java/haveno/asset/tokens/DaiStablecoin.java
+++ b/assets/src/main/java/haveno/asset/tokens/DaiStablecoinERC20.java
@@ -19,9 +19,9 @@ package haveno.asset.tokens;
import haveno.asset.Erc20Token;
-public class DaiStablecoin extends Erc20Token {
+public class DaiStablecoinERC20 extends Erc20Token {
- public DaiStablecoin() {
- super("Dai Stablecoin", "DAI");
+ public DaiStablecoinERC20() {
+ super("Dai Stablecoin", "DAI-ERC20");
}
}
diff --git a/assets/src/main/resources/META-INF/services/haveno.asset.Asset b/assets/src/main/resources/META-INF/services/haveno.asset.Asset
index 709b951227..80b9cd036d 100644
--- a/assets/src/main/resources/META-INF/services/haveno.asset.Asset
+++ b/assets/src/main/resources/META-INF/services/haveno.asset.Asset
@@ -9,4 +9,5 @@ haveno.asset.coins.Litecoin
haveno.asset.coins.Monero
haveno.asset.tokens.TetherUSDERC20
haveno.asset.tokens.TetherUSDTRC20
-haveno.asset.tokens.USDCoinERC20
\ No newline at end of file
+haveno.asset.tokens.USDCoinERC20
+haveno.asset.tokens.DaiStablecoinERC20
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index d35c6bd05c..74e776cb2b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -49,7 +49,7 @@ configure(subprojects) {
gsonVersion = '2.8.5'
guavaVersion = '32.1.1-jre'
guiceVersion = '7.0.0'
- moneroJavaVersion = '0.8.33'
+ moneroJavaVersion = '0.8.36'
httpclient5Version = '5.0'
hamcrestVersion = '2.2'
httpclientVersion = '4.5.12'
@@ -71,7 +71,7 @@ configure(subprojects) {
loggingVersion = '1.2'
lombokVersion = '1.18.30'
mockitoVersion = '5.10.0'
- netlayerVersion = 'e2ce2a142c' // Tor browser version 13.0.15 and tor binary version: 0.4.8.11
+ netlayerVersion = '700ec94f0f' // Tor browser version 14.0.3 and tor binary version: 0.4.8.13
protobufVersion = '3.19.1'
protocVersion = protobufVersion
pushyVersion = '0.13.2'
@@ -457,14 +457,14 @@ configure(project(':core')) {
doLast {
// get monero binaries download url
Map moneroBinaries = [
- 'linux-x86_64' : 'https://github.com/haveno-dex/monero/releases/download/release4/monero-bins-haveno-linux-x86_64.tar.gz',
- 'linux-x86_64-sha256' : '0810808292fd5ad595a46a7fcc8ecb28d251d80f8d75c0e7a7d51afbeb413b68',
- 'linux-aarch64' : 'https://github.com/haveno-dex/monero/releases/download/release4/monero-bins-haveno-linux-aarch64.tar.gz',
- 'linux-aarch64-sha256' : '61222ee8e2021aaf59ab8813543afc5548f484190ee9360bc9cfa8fdf21cc1de',
- 'mac' : 'https://github.com/haveno-dex/monero/releases/download/release4/monero-bins-haveno-mac.tar.gz',
- 'mac-sha256' : '5debb8d8d8dd63809e8351368a11aa85c47987f1a8a8f2dcca343e60bcff3287',
- 'windows' : 'https://github.com/haveno-dex/monero/releases/download/release4/monero-bins-haveno-windows.zip',
- 'windows-sha256' : 'd7c14f029db37ae2a8bc6b74c35f572283257df5fbcc8cc97b704d1a97be9888'
+ 'linux-x86_64' : 'https://github.com/haveno-dex/monero/releases/download/release5/monero-bins-haveno-linux-x86_64.tar.gz',
+ 'linux-x86_64-sha256' : '92003b6d9104e8fe3c4dff292b782ed9b82b157aaff95200fda35e5c3dcb733a',
+ 'linux-aarch64' : 'https://github.com/haveno-dex/monero/releases/download/release5/monero-bins-haveno-linux-aarch64.tar.gz',
+ 'linux-aarch64-sha256' : '18b069c6c474ce18efea261c875a4d54022520e888712b2a56524d9c92f133b1',
+ 'mac' : 'https://github.com/haveno-dex/monero/releases/download/release5/monero-bins-haveno-mac.tar.gz',
+ 'mac-sha256' : 'd308352191cd5a9e5e3932ad15869e033e22e209de459f4fd6460b111377dae2',
+ 'windows' : 'https://github.com/haveno-dex/monero/releases/download/release5/monero-bins-haveno-windows.zip',
+ 'windows-sha256' : '9c9e1994d4738e2a89ca28bef343bcad460ea6c06e0dd40de8278ab3033bd6c7'
]
String osKey
@@ -506,16 +506,16 @@ configure(project(':core')) {
} else {
ext.extractArchiveTarGz(moneroArchiveFile, localnetDir)
}
+ }
- // add the current platform's monero dependencies into the resources folder for installation
- copy {
- from "${monerodFile}"
- into "${project(':core').projectDir}/src/main/resources/bin"
- }
- copy {
- from "${moneroRpcFile}"
- into "${project(':core').projectDir}/src/main/resources/bin"
- }
+ // add the current platform's monero dependencies into the resources folder for installation
+ copy {
+ from "${monerodFile}"
+ into "${project(':core').projectDir}/src/main/resources/bin"
+ }
+ copy {
+ from "${moneroRpcFile}"
+ into "${project(':core').projectDir}/src/main/resources/bin"
}
}
@@ -610,7 +610,7 @@ configure(project(':desktop')) {
apply plugin: 'com.github.johnrengelman.shadow'
apply from: 'package/package.gradle'
- version = '1.0.14-SNAPSHOT'
+ version = '1.0.18-SNAPSHOT'
jar.manifest.attributes(
"Implementation-Title": project.name,
diff --git a/cli/src/main/java/haveno/cli/request/OffersServiceRequest.java b/cli/src/main/java/haveno/cli/request/OffersServiceRequest.java
index eaa0cac150..2fcb3426d1 100644
--- a/cli/src/main/java/haveno/cli/request/OffersServiceRequest.java
+++ b/cli/src/main/java/haveno/cli/request/OffersServiceRequest.java
@@ -81,7 +81,7 @@ public class OffersServiceRequest {
.setUseMarketBasedPrice(useMarketBasedPrice)
.setPrice(fixedPrice)
.setMarketPriceMarginPct(marketPriceMarginPct)
- .setBuyerSecurityDepositPct(securityDepositPct)
+ .setSecurityDepositPct(securityDepositPct)
.setPaymentAccountId(paymentAcctId)
.setTriggerPrice(triggerPrice)
.build();
diff --git a/common/src/main/java/haveno/common/app/Capabilities.java b/common/src/main/java/haveno/common/app/Capabilities.java
index 39266a25c6..5bb3bd0bc4 100644
--- a/common/src/main/java/haveno/common/app/Capabilities.java
+++ b/common/src/main/java/haveno/common/app/Capabilities.java
@@ -59,8 +59,10 @@ public class Capabilities {
}
public Capabilities(Collection capabilities) {
- synchronized (this.capabilities) {
- this.capabilities.addAll(capabilities);
+ synchronized (capabilities) {
+ synchronized (this.capabilities) {
+ this.capabilities.addAll(capabilities);
+ }
}
}
@@ -73,9 +75,11 @@ public class Capabilities {
}
public void set(Collection capabilities) {
- synchronized (this.capabilities) {
- this.capabilities.clear();
- this.capabilities.addAll(capabilities);
+ synchronized (capabilities) {
+ synchronized (this.capabilities) {
+ this.capabilities.clear();
+ this.capabilities.addAll(capabilities);
+ }
}
}
@@ -87,15 +91,19 @@ public class Capabilities {
public void addAll(Capabilities capabilities) {
if (capabilities != null) {
- synchronized (this.capabilities) {
- this.capabilities.addAll(capabilities.capabilities);
+ synchronized (capabilities.capabilities) {
+ synchronized (this.capabilities) {
+ this.capabilities.addAll(capabilities.capabilities);
+ }
}
}
}
public boolean containsAll(final Set requiredItems) {
- synchronized (this.capabilities) {
- return capabilities.containsAll(requiredItems);
+ synchronized(requiredItems) {
+ synchronized (this.capabilities) {
+ return capabilities.containsAll(requiredItems);
+ }
}
}
@@ -129,7 +137,9 @@ public class Capabilities {
* @return int list of Capability ordinals
*/
public static List toIntList(Capabilities capabilities) {
- return capabilities.capabilities.stream().map(Enum::ordinal).sorted().collect(Collectors.toList());
+ synchronized (capabilities.capabilities) {
+ return capabilities.capabilities.stream().map(Enum::ordinal).sorted().collect(Collectors.toList());
+ }
}
/**
@@ -139,11 +149,13 @@ public class Capabilities {
* @return a {@link Capabilities} object
*/
public static Capabilities fromIntList(List capabilities) {
- return new Capabilities(capabilities.stream()
- .filter(integer -> integer < Capability.values().length)
- .filter(integer -> integer >= 0)
- .map(integer -> Capability.values()[integer])
- .collect(Collectors.toSet()));
+ synchronized (capabilities) {
+ return new Capabilities(capabilities.stream()
+ .filter(integer -> integer < Capability.values().length)
+ .filter(integer -> integer >= 0)
+ .map(integer -> Capability.values()[integer])
+ .collect(Collectors.toSet()));
+ }
}
/**
@@ -181,7 +193,9 @@ public class Capabilities {
}
public static boolean hasMandatoryCapability(Capabilities capabilities, Capability mandatoryCapability) {
- return capabilities.capabilities.stream().anyMatch(c -> c == mandatoryCapability);
+ synchronized (capabilities.capabilities) {
+ return capabilities.capabilities.stream().anyMatch(c -> c == mandatoryCapability);
+ }
}
@Override
@@ -211,8 +225,10 @@ public class Capabilities {
// Neither would support removal of past capabilities, a use case we never had so far and which might have
// backward compatibility issues, so we should treat capabilities as an append-only data structure.
public int findHighestCapability(Capabilities capabilities) {
- return (int) capabilities.capabilities.stream()
- .mapToLong(e -> (long) e.ordinal())
- .sum();
+ synchronized (capabilities.capabilities) {
+ return (int) capabilities.capabilities.stream()
+ .mapToLong(e -> (long) e.ordinal())
+ .sum();
+ }
}
}
diff --git a/common/src/main/java/haveno/common/app/Version.java b/common/src/main/java/haveno/common/app/Version.java
index 2b4b01b036..d39016dc31 100644
--- a/common/src/main/java/haveno/common/app/Version.java
+++ b/common/src/main/java/haveno/common/app/Version.java
@@ -28,7 +28,7 @@ import static com.google.common.base.Preconditions.checkArgument;
public class Version {
// The application versions
// We use semantic versioning with major, minor and patch
- public static final String VERSION = "1.0.14";
+ public static final String VERSION = "1.0.18";
/**
* Holds a list of the tagged resource files for optimizing the getData requests.
diff --git a/common/src/main/java/haveno/common/config/Config.java b/common/src/main/java/haveno/common/config/Config.java
index 92359c76f9..b162e211b4 100644
--- a/common/src/main/java/haveno/common/config/Config.java
+++ b/common/src/main/java/haveno/common/config/Config.java
@@ -117,6 +117,8 @@ public class Config {
public static final String BTC_FEE_INFO = "bitcoinFeeInfo";
public static final String BYPASS_MEMPOOL_VALIDATION = "bypassMempoolValidation";
public static final String PASSWORD_REQUIRED = "passwordRequired";
+ public static final String UPDATE_XMR_BINARIES = "updateXmrBinaries";
+ public static final String XMR_BLOCKCHAIN_PATH = "xmrBlockchainPath";
// Default values for certain options
public static final int UNSPECIFIED_PORT = -1;
@@ -204,6 +206,8 @@ public class Config {
public final boolean republishMailboxEntries;
public final boolean bypassMempoolValidation;
public final boolean passwordRequired;
+ public final boolean updateXmrBinaries;
+ public final String xmrBlockchainPath;
// Properties derived from options but not exposed as options themselves
public final File torDir;
@@ -621,6 +625,20 @@ public class Config {
.ofType(boolean.class)
.defaultsTo(false);
+ ArgumentAcceptingOptionSpec updateXmrBinariesOpt =
+ parser.accepts(UPDATE_XMR_BINARIES,
+ "Update Monero binaries if applicable")
+ .withRequiredArg()
+ .ofType(boolean.class)
+ .defaultsTo(true);
+
+ ArgumentAcceptingOptionSpec xmrBlockchainPathOpt =
+ parser.accepts(XMR_BLOCKCHAIN_PATH,
+ "Path to Monero blockchain when using local Monero node")
+ .withRequiredArg()
+ .ofType(String.class)
+ .defaultsTo("");
+
try {
CompositeOptionSet options = new CompositeOptionSet();
@@ -733,6 +751,8 @@ public class Config {
this.republishMailboxEntries = options.valueOf(republishMailboxEntriesOpt);
this.bypassMempoolValidation = options.valueOf(bypassMempoolValidationOpt);
this.passwordRequired = options.valueOf(passwordRequiredOpt);
+ this.updateXmrBinaries = options.valueOf(updateXmrBinariesOpt);
+ this.xmrBlockchainPath = options.valueOf(xmrBlockchainPathOpt);
} catch (OptionException ex) {
throw new ConfigException("problem parsing option '%s': %s",
ex.options().get(0),
@@ -742,11 +762,11 @@ public class Config {
}
// Create all appDataDir subdirectories and assign to their respective properties
- File btcNetworkDir = mkdir(appDataDir, baseCurrencyNetwork.name().toLowerCase());
- this.keyStorageDir = mkdir(btcNetworkDir, "keys");
- this.storageDir = mkdir(btcNetworkDir, "db");
- this.torDir = mkdir(btcNetworkDir, "tor");
- this.walletDir = mkdir(btcNetworkDir, "wallet");
+ File xmrNetworkDir = mkdir(appDataDir, baseCurrencyNetwork.name().toLowerCase());
+ this.keyStorageDir = mkdir(xmrNetworkDir, "keys");
+ this.storageDir = mkdir(xmrNetworkDir, "db");
+ this.torDir = mkdir(xmrNetworkDir, "tor");
+ this.walletDir = mkdir(xmrNetworkDir, "wallet");
// Assign values to special-case static fields
APP_DATA_DIR_VALUE = appDataDir;
diff --git a/common/src/main/java/haveno/common/crypto/KeyRing.java b/common/src/main/java/haveno/common/crypto/KeyRing.java
index 89552c7c74..580b3b285a 100644
--- a/common/src/main/java/haveno/common/crypto/KeyRing.java
+++ b/common/src/main/java/haveno/common/crypto/KeyRing.java
@@ -110,7 +110,7 @@ public final class KeyRing {
* @param password The password to unlock the keys or to generate new keys, nullable.
*/
public void generateKeys(String password) {
- if (isUnlocked()) throw new Error("Current keyring must be closed to generate new keys");
+ if (isUnlocked()) throw new IllegalStateException("Current keyring must be closed to generate new keys");
symmetricKey = Encryption.generateSecretKey(256);
signatureKeyPair = Sig.generateKeyPair();
encryptionKeyPair = Encryption.generateKeyPair();
diff --git a/core/src/main/java/haveno/core/account/witness/AccountAgeWitnessService.java b/core/src/main/java/haveno/core/account/witness/AccountAgeWitnessService.java
index 4d91d75eff..978b6dd715 100644
--- a/core/src/main/java/haveno/core/account/witness/AccountAgeWitnessService.java
+++ b/core/src/main/java/haveno/core/account/witness/AccountAgeWitnessService.java
@@ -40,6 +40,7 @@ import haveno.core.offer.OfferDirection;
import haveno.core.offer.OfferRestrictions;
import haveno.core.payment.ChargeBackRisk;
import haveno.core.payment.PaymentAccount;
+import haveno.core.payment.TradeLimits;
import haveno.core.payment.payload.PaymentAccountPayload;
import haveno.core.payment.payload.PaymentMethod;
import haveno.core.support.dispute.Dispute;
@@ -498,10 +499,15 @@ public class AccountAgeWitnessService {
return getAccountAge(getMyWitness(paymentAccountPayload), new Date());
}
- public long getMyTradeLimit(PaymentAccount paymentAccount, String currencyCode, OfferDirection direction) {
+ public long getMyTradeLimit(PaymentAccount paymentAccount, String currencyCode, OfferDirection direction, boolean buyerAsTakerWithoutDeposit) {
if (paymentAccount == null)
return 0;
+ if (buyerAsTakerWithoutDeposit) {
+ TradeLimits tradeLimits = new TradeLimits();
+ return tradeLimits.getMaxTradeLimitBuyerAsTakerWithoutDeposit().longValueExact();
+ }
+
AccountAgeWitness accountAgeWitness = getMyWitness(paymentAccount.getPaymentAccountPayload());
BigInteger maxTradeLimit = paymentAccount.getPaymentMethod().getMaxTradeLimit(currencyCode);
if (hasTradeLimitException(accountAgeWitness)) {
diff --git a/core/src/main/java/haveno/core/api/CoreApi.java b/core/src/main/java/haveno/core/api/CoreApi.java
index 14ec0f6d08..99fb3bc74f 100644
--- a/core/src/main/java/haveno/core/api/CoreApi.java
+++ b/core/src/main/java/haveno/core/api/CoreApi.java
@@ -239,8 +239,8 @@ public class CoreApi {
xmrConnectionService.stopCheckingConnection();
}
- public MoneroRpcConnection getBestAvailableXmrConnection() {
- return xmrConnectionService.getBestAvailableConnection();
+ public MoneroRpcConnection getBestXmrConnection() {
+ return xmrConnectionService.getBestConnection();
}
public void setXmrConnectionAutoSwitch(boolean autoSwitch) {
@@ -419,10 +419,13 @@ public class CoreApi {
double marketPriceMargin,
long amountAsLong,
long minAmountAsLong,
- double buyerSecurityDeposit,
+ double securityDepositPct,
String triggerPriceAsString,
boolean reserveExactAmount,
String paymentAccountId,
+ boolean isPrivateOffer,
+ boolean buyerAsTakerWithoutDeposit,
+ String extraInfo,
Consumer resultHandler,
ErrorMessageHandler errorMessageHandler) {
coreOffersService.postOffer(currencyCode,
@@ -432,10 +435,13 @@ public class CoreApi {
marketPriceMargin,
amountAsLong,
minAmountAsLong,
- buyerSecurityDeposit,
+ securityDepositPct,
triggerPriceAsString,
reserveExactAmount,
paymentAccountId,
+ isPrivateOffer,
+ buyerAsTakerWithoutDeposit,
+ extraInfo,
resultHandler,
errorMessageHandler);
}
@@ -448,8 +454,11 @@ public class CoreApi {
double marketPriceMargin,
BigInteger amount,
BigInteger minAmount,
- double buyerSecurityDeposit,
- PaymentAccount paymentAccount) {
+ double securityDepositPct,
+ PaymentAccount paymentAccount,
+ boolean isPrivateOffer,
+ boolean buyerAsTakerWithoutDeposit,
+ String extraInfo) {
return coreOffersService.editOffer(offerId,
currencyCode,
direction,
@@ -458,8 +467,11 @@ public class CoreApi {
marketPriceMargin,
amount,
minAmount,
- buyerSecurityDeposit,
- paymentAccount);
+ securityDepositPct,
+ paymentAccount,
+ isPrivateOffer,
+ buyerAsTakerWithoutDeposit,
+ extraInfo);
}
public void cancelOffer(String id, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
@@ -535,9 +547,11 @@ public class CoreApi {
public void takeOffer(String offerId,
String paymentAccountId,
long amountAsLong,
+ String challenge,
Consumer resultHandler,
ErrorMessageHandler errorMessageHandler) {
Offer offer = coreOffersService.getOffer(offerId);
+ offer.setChallenge(challenge);
coreTradesService.takeOffer(offer, paymentAccountId, amountAsLong, resultHandler, errorMessageHandler);
}
diff --git a/core/src/main/java/haveno/core/api/CoreDisputesService.java b/core/src/main/java/haveno/core/api/CoreDisputesService.java
index f193287edc..f4bb4c803d 100644
--- a/core/src/main/java/haveno/core/api/CoreDisputesService.java
+++ b/core/src/main/java/haveno/core/api/CoreDisputesService.java
@@ -62,11 +62,12 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class CoreDisputesService {
- public enum DisputePayout {
+ // TODO: persist in DisputeResult?
+ public enum PayoutSuggestion {
BUYER_GETS_TRADE_AMOUNT,
- BUYER_GETS_ALL, // used in desktop
+ BUYER_GETS_ALL,
SELLER_GETS_TRADE_AMOUNT,
- SELLER_GETS_ALL, // used in desktop
+ SELLER_GETS_ALL,
CUSTOM
}
@@ -172,17 +173,17 @@ public class CoreDisputesService {
// create dispute result
var closeDate = new Date();
var winnerDisputeResult = createDisputeResult(winningDispute, winner, reason, summaryNotes, closeDate);
- DisputePayout payout;
+ PayoutSuggestion payoutSuggestion;
if (customWinnerAmount > 0) {
- payout = DisputePayout.CUSTOM;
+ payoutSuggestion = PayoutSuggestion.CUSTOM;
} else if (winner == DisputeResult.Winner.BUYER) {
- payout = DisputePayout.BUYER_GETS_TRADE_AMOUNT;
+ payoutSuggestion = PayoutSuggestion.BUYER_GETS_TRADE_AMOUNT;
} else if (winner == DisputeResult.Winner.SELLER) {
- payout = DisputePayout.SELLER_GETS_TRADE_AMOUNT;
+ payoutSuggestion = PayoutSuggestion.SELLER_GETS_TRADE_AMOUNT;
} else {
throw new IllegalStateException("Unexpected DisputeResult.Winner: " + winner);
}
- applyPayoutAmountsToDisputeResult(payout, winningDispute, winnerDisputeResult, customWinnerAmount);
+ applyPayoutAmountsToDisputeResult(payoutSuggestion, winningDispute, winnerDisputeResult, customWinnerAmount);
// close winning dispute ticket
closeDisputeTicket(arbitrationManager, winningDispute, winnerDisputeResult, () -> {
@@ -227,26 +228,26 @@ public class CoreDisputesService {
* Sets payout amounts given a payout type. If custom is selected, the winner gets a custom amount, and the peer
* receives the remaining amount minus the mining fee.
*/
- public void applyPayoutAmountsToDisputeResult(DisputePayout payout, Dispute dispute, DisputeResult disputeResult, long customWinnerAmount) {
+ public void applyPayoutAmountsToDisputeResult(PayoutSuggestion payoutSuggestion, Dispute dispute, DisputeResult disputeResult, long customWinnerAmount) {
Contract contract = dispute.getContract();
Trade trade = tradeManager.getTrade(dispute.getTradeId());
BigInteger buyerSecurityDeposit = trade.getBuyer().getSecurityDeposit();
BigInteger sellerSecurityDeposit = trade.getSeller().getSecurityDeposit();
BigInteger tradeAmount = contract.getTradeAmount();
disputeResult.setSubtractFeeFrom(DisputeResult.SubtractFeeFrom.BUYER_AND_SELLER);
- if (payout == DisputePayout.BUYER_GETS_TRADE_AMOUNT) {
+ if (payoutSuggestion == PayoutSuggestion.BUYER_GETS_TRADE_AMOUNT) {
disputeResult.setBuyerPayoutAmountBeforeCost(tradeAmount.add(buyerSecurityDeposit));
disputeResult.setSellerPayoutAmountBeforeCost(sellerSecurityDeposit);
- } else if (payout == DisputePayout.BUYER_GETS_ALL) {
+ } else if (payoutSuggestion == PayoutSuggestion.BUYER_GETS_ALL) {
disputeResult.setBuyerPayoutAmountBeforeCost(tradeAmount.add(buyerSecurityDeposit).add(sellerSecurityDeposit)); // TODO (woodser): apply min payout to incentivize loser? (see post v1.1.7)
disputeResult.setSellerPayoutAmountBeforeCost(BigInteger.ZERO);
- } else if (payout == DisputePayout.SELLER_GETS_TRADE_AMOUNT) {
+ } else if (payoutSuggestion == PayoutSuggestion.SELLER_GETS_TRADE_AMOUNT) {
disputeResult.setBuyerPayoutAmountBeforeCost(buyerSecurityDeposit);
disputeResult.setSellerPayoutAmountBeforeCost(tradeAmount.add(sellerSecurityDeposit));
- } else if (payout == DisputePayout.SELLER_GETS_ALL) {
+ } else if (payoutSuggestion == PayoutSuggestion.SELLER_GETS_ALL) {
disputeResult.setBuyerPayoutAmountBeforeCost(BigInteger.ZERO);
disputeResult.setSellerPayoutAmountBeforeCost(tradeAmount.add(sellerSecurityDeposit).add(buyerSecurityDeposit));
- } else if (payout == DisputePayout.CUSTOM) {
+ } else if (payoutSuggestion == PayoutSuggestion.CUSTOM) {
if (customWinnerAmount > trade.getWallet().getBalance().longValueExact()) throw new RuntimeException("Winner payout is more than the trade wallet's balance");
long loserAmount = tradeAmount.add(buyerSecurityDeposit).add(sellerSecurityDeposit).subtract(BigInteger.valueOf(customWinnerAmount)).longValueExact();
if (loserAmount < 0) throw new RuntimeException("Loser payout cannot be negative");
diff --git a/core/src/main/java/haveno/core/api/CoreOffersService.java b/core/src/main/java/haveno/core/api/CoreOffersService.java
index 5bdd2f1605..a66388c040 100644
--- a/core/src/main/java/haveno/core/api/CoreOffersService.java
+++ b/core/src/main/java/haveno/core/api/CoreOffersService.java
@@ -172,10 +172,13 @@ public class CoreOffersService {
double marketPriceMargin,
long amountAsLong,
long minAmountAsLong,
- double securityDeposit,
+ double securityDepositPct,
String triggerPriceAsString,
boolean reserveExactAmount,
String paymentAccountId,
+ boolean isPrivateOffer,
+ boolean buyerAsTakerWithoutDeposit,
+ String extraInfo,
Consumer resultHandler,
ErrorMessageHandler errorMessageHandler) {
coreWalletsService.verifyWalletsAreAvailable();
@@ -199,8 +202,11 @@ public class CoreOffersService {
price,
useMarketBasedPrice,
exactMultiply(marketPriceMargin, 0.01),
- securityDeposit,
- paymentAccount);
+ securityDepositPct,
+ paymentAccount,
+ isPrivateOffer,
+ buyerAsTakerWithoutDeposit,
+ extraInfo);
verifyPaymentAccountIsValidForNewOffer(offer, paymentAccount);
@@ -223,8 +229,11 @@ public class CoreOffersService {
double marketPriceMargin,
BigInteger amount,
BigInteger minAmount,
- double buyerSecurityDeposit,
- PaymentAccount paymentAccount) {
+ double securityDepositPct,
+ PaymentAccount paymentAccount,
+ boolean isPrivateOffer,
+ boolean buyerAsTakerWithoutDeposit,
+ String extraInfo) {
return createOfferService.createAndGetOffer(offerId,
direction,
currencyCode.toUpperCase(),
@@ -233,8 +242,11 @@ public class CoreOffersService {
price,
useMarketBasedPrice,
exactMultiply(marketPriceMargin, 0.01),
- buyerSecurityDeposit,
- paymentAccount);
+ securityDepositPct,
+ paymentAccount,
+ isPrivateOffer,
+ buyerAsTakerWithoutDeposit,
+ extraInfo);
}
void cancelOffer(String id, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
diff --git a/core/src/main/java/haveno/core/api/CoreTradesService.java b/core/src/main/java/haveno/core/api/CoreTradesService.java
index 431ab9a652..14f10b4f00 100644
--- a/core/src/main/java/haveno/core/api/CoreTradesService.java
+++ b/core/src/main/java/haveno/core/api/CoreTradesService.java
@@ -132,7 +132,7 @@ class CoreTradesService {
// adjust amount for fixed-price offer (based on TakeOfferViewModel)
String currencyCode = offer.getCurrencyCode();
OfferDirection direction = offer.getOfferPayload().getDirection();
- long maxTradeLimit = offerUtil.getMaxTradeLimit(paymentAccount, currencyCode, direction);
+ long maxTradeLimit = offerUtil.getMaxTradeLimit(paymentAccount, currencyCode, direction, offer.hasBuyerAsTakerWithoutDeposit());
if (offer.getPrice() != null) {
if (PaymentMethod.isRoundedForAtmCash(paymentAccount.getPaymentMethod().getId())) {
amount = CoinUtil.getRoundedAtmCashAmount(amount, offer.getPrice(), maxTradeLimit);
diff --git a/core/src/main/java/haveno/core/api/XmrConnectionService.java b/core/src/main/java/haveno/core/api/XmrConnectionService.java
index 664daaca8a..88d0117f8e 100644
--- a/core/src/main/java/haveno/core/api/XmrConnectionService.java
+++ b/core/src/main/java/haveno/core/api/XmrConnectionService.java
@@ -255,18 +255,17 @@ public final class XmrConnectionService {
updatePolling();
}
- public MoneroRpcConnection getBestAvailableConnection() {
- accountService.checkAccountOpen();
- List ignoredConnections = new ArrayList();
- addLocalNodeIfIgnored(ignoredConnections);
- return connectionManager.getBestAvailableConnection(ignoredConnections.toArray(new MoneroRpcConnection[0]));
+ public MoneroRpcConnection getBestConnection() {
+ return getBestConnection(new ArrayList());
}
- private MoneroRpcConnection getBestAvailableConnection(Collection ignoredConnections) {
+ private MoneroRpcConnection getBestConnection(Collection ignoredConnections) {
accountService.checkAccountOpen();
Set ignoredConnectionsSet = new HashSet<>(ignoredConnections);
addLocalNodeIfIgnored(ignoredConnectionsSet);
- return connectionManager.getBestAvailableConnection(ignoredConnectionsSet.toArray(new MoneroRpcConnection[0]));
+ MoneroRpcConnection bestConnection = connectionManager.getBestAvailableConnection(ignoredConnectionsSet.toArray(new MoneroRpcConnection[0])); // checks connections
+ if (bestConnection == null && connectionManager.getConnections().size() == 1 && !ignoredConnectionsSet.contains(connectionManager.getConnections().get(0))) bestConnection = connectionManager.getConnections().get(0);
+ return bestConnection;
}
private void addLocalNodeIfIgnored(Collection ignoredConnections) {
@@ -278,7 +277,7 @@ public final class XmrConnectionService {
log.info("Skipping switch to best Monero connection because connection is fixed or auto switch is disabled");
return;
}
- MoneroRpcConnection bestConnection = getBestAvailableConnection();
+ MoneroRpcConnection bestConnection = getBestConnection();
if (bestConnection != null) setConnection(bestConnection);
}
@@ -329,7 +328,7 @@ public final class XmrConnectionService {
if (currentConnection != null) excludedConnections.add(currentConnection);
// get connection to switch to
- MoneroRpcConnection bestConnection = getBestAvailableConnection(excludedConnections);
+ MoneroRpcConnection bestConnection = getBestConnection(excludedConnections);
// remove from excluded connections after period
UserThread.runAfter(() -> {
@@ -337,7 +336,7 @@ public final class XmrConnectionService {
}, EXCLUDE_CONNECTION_SECONDS);
// return if no connection to switch to
- if (bestConnection == null) {
+ if (bestConnection == null || !Boolean.TRUE.equals(bestConnection.isConnected())) {
log.warn("No connection to switch to");
return false;
}
@@ -545,7 +544,7 @@ public final class XmrConnectionService {
if (isConnected) {
setConnection(connection.getUri());
} else if (getConnection() != null && getConnection().getUri().equals(connection.getUri())) {
- MoneroRpcConnection bestConnection = getBestAvailableConnection();
+ MoneroRpcConnection bestConnection = getBestConnection();
if (bestConnection != null) setConnection(bestConnection); // switch to best connection
}
}
@@ -610,7 +609,7 @@ public final class XmrConnectionService {
// update connection
if (connectionManager.getConnection() == null || connectionManager.getAutoSwitch()) {
- MoneroRpcConnection bestConnection = getBestAvailableConnection();
+ MoneroRpcConnection bestConnection = getBestConnection();
if (bestConnection != null) setConnection(bestConnection);
}
} else if (!isInitialized) {
@@ -654,8 +653,7 @@ public final class XmrConnectionService {
private void onConnectionChanged(MoneroRpcConnection currentConnection) {
if (isShutDownStarted || !accountService.isAccountOpen()) return;
if (currentConnection == null) {
- log.warn("Setting daemon connection to null");
- Thread.dumpStack();
+ log.warn("Setting daemon connection to null", new Throwable("Stack trace"));
}
synchronized (lock) {
if (currentConnection == null) {
@@ -726,8 +724,8 @@ public final class XmrConnectionService {
// poll daemon
if (daemon == null) switchToBestConnection();
- if (daemon == null) throw new RuntimeException("No connection to Monero daemon");
try {
+ if (daemon == null) throw new RuntimeException("No connection to Monero daemon");
lastInfo = daemon.getInfo();
} catch (Exception e) {
@@ -754,6 +752,7 @@ public final class XmrConnectionService {
// switch to best connection
switchToBestConnection();
+ if (daemon == null) throw new RuntimeException("No connection to Monero daemon after error handling");
lastInfo = daemon.getInfo(); // caught internally if still fails
}
diff --git a/core/src/main/java/haveno/core/api/XmrLocalNode.java b/core/src/main/java/haveno/core/api/XmrLocalNode.java
index cd5ed266f1..5a424dad38 100644
--- a/core/src/main/java/haveno/core/api/XmrLocalNode.java
+++ b/core/src/main/java/haveno/core/api/XmrLocalNode.java
@@ -166,11 +166,18 @@ public class XmrLocalNode {
var args = new ArrayList<>(MONEROD_ARGS);
- var dataDir = settings.getBlockchainPath();
- if (dataDir == null || dataDir.isEmpty()) {
- dataDir = MONEROD_DATADIR;
+ var dataDir = "";
+ if (config.xmrBlockchainPath == null || config.xmrBlockchainPath.isEmpty()) {
+ dataDir = settings.getBlockchainPath();
+ if (dataDir == null || dataDir.isEmpty()) {
+ dataDir = MONEROD_DATADIR;
+ }
+ } else {
+ dataDir = config.xmrBlockchainPath; // startup config overrides settings
+ }
+ if (dataDir != null && !dataDir.isEmpty()) {
+ args.add("--data-dir=" + dataDir);
}
- if (dataDir != null) args.add("--data-dir=" + dataDir);
var bootstrapUrl = settings.getBootstrapUrl();
if (bootstrapUrl != null && !bootstrapUrl.isEmpty()) {
diff --git a/core/src/main/java/haveno/core/api/model/OfferInfo.java b/core/src/main/java/haveno/core/api/model/OfferInfo.java
index b489aaa8bb..76de24401a 100644
--- a/core/src/main/java/haveno/core/api/model/OfferInfo.java
+++ b/core/src/main/java/haveno/core/api/model/OfferInfo.java
@@ -78,6 +78,9 @@ public class OfferInfo implements Payload {
@Nullable
private final String splitOutputTxHash;
private final long splitOutputTxFee;
+ private final boolean isPrivateOffer;
+ private final String challenge;
+ private final String extraInfo;
public OfferInfo(OfferInfoBuilder builder) {
this.id = builder.getId();
@@ -111,6 +114,9 @@ public class OfferInfo implements Payload {
this.arbitratorSigner = builder.getArbitratorSigner();
this.splitOutputTxHash = builder.getSplitOutputTxHash();
this.splitOutputTxFee = builder.getSplitOutputTxFee();
+ this.isPrivateOffer = builder.isPrivateOffer();
+ this.challenge = builder.getChallenge();
+ this.extraInfo = builder.getExtraInfo();
}
public static OfferInfo toOfferInfo(Offer offer) {
@@ -137,6 +143,7 @@ public class OfferInfo implements Payload {
.withIsActivated(isActivated)
.withSplitOutputTxHash(openOffer.getSplitOutputTxHash())
.withSplitOutputTxFee(openOffer.getSplitOutputTxFee())
+ .withChallenge(openOffer.getChallenge())
.build();
}
@@ -177,7 +184,10 @@ public class OfferInfo implements Payload {
.withPubKeyRing(offer.getOfferPayload().getPubKeyRing().toString())
.withVersionNumber(offer.getOfferPayload().getVersionNr())
.withProtocolVersion(offer.getOfferPayload().getProtocolVersion())
- .withArbitratorSigner(offer.getOfferPayload().getArbitratorSigner() == null ? null : offer.getOfferPayload().getArbitratorSigner().getFullAddress());
+ .withArbitratorSigner(offer.getOfferPayload().getArbitratorSigner() == null ? null : offer.getOfferPayload().getArbitratorSigner().getFullAddress())
+ .withIsPrivateOffer(offer.isPrivateOffer())
+ .withChallenge(offer.getChallenge())
+ .withExtraInfo(offer.getCombinedExtraInfo());
}
///////////////////////////////////////////////////////////////////////////////////////////
@@ -215,9 +225,12 @@ public class OfferInfo implements Payload {
.setPubKeyRing(pubKeyRing)
.setVersionNr(versionNumber)
.setProtocolVersion(protocolVersion)
- .setSplitOutputTxFee(splitOutputTxFee);
+ .setSplitOutputTxFee(splitOutputTxFee)
+ .setIsPrivateOffer(isPrivateOffer);
Optional.ofNullable(arbitratorSigner).ifPresent(builder::setArbitratorSigner);
Optional.ofNullable(splitOutputTxHash).ifPresent(builder::setSplitOutputTxHash);
+ Optional.ofNullable(challenge).ifPresent(builder::setChallenge);
+ Optional.ofNullable(extraInfo).ifPresent(builder::setExtraInfo);
return builder.build();
}
@@ -255,6 +268,9 @@ public class OfferInfo implements Payload {
.withArbitratorSigner(proto.getArbitratorSigner())
.withSplitOutputTxHash(proto.getSplitOutputTxHash())
.withSplitOutputTxFee(proto.getSplitOutputTxFee())
+ .withIsPrivateOffer(proto.getIsPrivateOffer())
+ .withChallenge(proto.getChallenge())
+ .withExtraInfo(proto.getExtraInfo())
.build();
}
}
diff --git a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java
index 6650265fbb..6b1b494047 100644
--- a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java
+++ b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java
@@ -77,7 +77,8 @@ public final class PaymentAccountForm implements PersistablePayload {
AUSTRALIA_PAYID,
CASH_APP,
PAYPAL,
- VENMO;
+ VENMO,
+ PAYSAFE;
public static PaymentAccountForm.FormId fromProto(protobuf.PaymentAccountForm.FormId formId) {
return ProtoUtil.enumFromProto(PaymentAccountForm.FormId.class, formId.name());
diff --git a/core/src/main/java/haveno/core/api/model/TradeInfo.java b/core/src/main/java/haveno/core/api/model/TradeInfo.java
index fa94fd27f2..8df26368ba 100644
--- a/core/src/main/java/haveno/core/api/model/TradeInfo.java
+++ b/core/src/main/java/haveno/core/api/model/TradeInfo.java
@@ -172,14 +172,14 @@ public class TradeInfo implements Payload {
.withAmount(trade.getAmount().longValueExact())
.withMakerFee(trade.getMakerFee().longValueExact())
.withTakerFee(trade.getTakerFee().longValueExact())
- .withBuyerSecurityDeposit(trade.getBuyer().getSecurityDeposit() == null ? -1 : trade.getBuyer().getSecurityDeposit().longValueExact())
- .withSellerSecurityDeposit(trade.getSeller().getSecurityDeposit() == null ? -1 : trade.getSeller().getSecurityDeposit().longValueExact())
- .withBuyerDepositTxFee(trade.getBuyer().getDepositTxFee() == null ? -1 : trade.getBuyer().getDepositTxFee().longValueExact())
- .withSellerDepositTxFee(trade.getSeller().getDepositTxFee() == null ? -1 : trade.getSeller().getDepositTxFee().longValueExact())
- .withBuyerPayoutTxFee(trade.getBuyer().getPayoutTxFee() == null ? -1 : trade.getBuyer().getPayoutTxFee().longValueExact())
- .withSellerPayoutTxFee(trade.getSeller().getPayoutTxFee() == null ? -1 : trade.getSeller().getPayoutTxFee().longValueExact())
- .withBuyerPayoutAmount(trade.getBuyer().getPayoutAmount() == null ? -1 : trade.getBuyer().getPayoutAmount().longValueExact())
- .withSellerPayoutAmount(trade.getSeller().getPayoutAmount() == null ? -1 : trade.getSeller().getPayoutAmount().longValueExact())
+ .withBuyerSecurityDeposit(trade.getBuyer().getSecurityDeposit().longValueExact())
+ .withSellerSecurityDeposit(trade.getSeller().getSecurityDeposit().longValueExact())
+ .withBuyerDepositTxFee(trade.getBuyer().getDepositTxFee().longValueExact())
+ .withSellerDepositTxFee(trade.getSeller().getDepositTxFee().longValueExact())
+ .withBuyerPayoutTxFee(trade.getBuyer().getPayoutTxFee().longValueExact())
+ .withSellerPayoutTxFee(trade.getSeller().getPayoutTxFee().longValueExact())
+ .withBuyerPayoutAmount(trade.getBuyer().getPayoutAmount().longValueExact())
+ .withSellerPayoutAmount(trade.getSeller().getPayoutAmount().longValueExact())
.withTotalTxFee(trade.getTotalTxFee().longValueExact())
.withPrice(toPreciseTradePrice.apply(trade))
.withVolume(toRoundedVolume.apply(trade))
diff --git a/core/src/main/java/haveno/core/api/model/builder/OfferInfoBuilder.java b/core/src/main/java/haveno/core/api/model/builder/OfferInfoBuilder.java
index 35d532f67f..23e403fcd2 100644
--- a/core/src/main/java/haveno/core/api/model/builder/OfferInfoBuilder.java
+++ b/core/src/main/java/haveno/core/api/model/builder/OfferInfoBuilder.java
@@ -63,6 +63,9 @@ public final class OfferInfoBuilder {
private String arbitratorSigner;
private String splitOutputTxHash;
private long splitOutputTxFee;
+ private boolean isPrivateOffer;
+ private String challenge;
+ private String extraInfo;
public OfferInfoBuilder withId(String id) {
this.id = id;
@@ -234,6 +237,21 @@ public final class OfferInfoBuilder {
return this;
}
+ public OfferInfoBuilder withIsPrivateOffer(boolean isPrivateOffer) {
+ this.isPrivateOffer = isPrivateOffer;
+ return this;
+ }
+
+ public OfferInfoBuilder withChallenge(String challenge) {
+ this.challenge = challenge;
+ return this;
+ }
+
+ public OfferInfoBuilder withExtraInfo(String extraInfo) {
+ this.extraInfo = extraInfo;
+ return this;
+ }
+
public OfferInfo build() {
return new OfferInfo(this);
}
diff --git a/core/src/main/java/haveno/core/app/HavenoSetup.java b/core/src/main/java/haveno/core/app/HavenoSetup.java
index a291da5001..eee13f3eec 100644
--- a/core/src/main/java/haveno/core/app/HavenoSetup.java
+++ b/core/src/main/java/haveno/core/app/HavenoSetup.java
@@ -369,7 +369,7 @@ public class HavenoSetup {
// install monerod
File monerodFile = new File(XmrLocalNode.MONEROD_PATH);
String monerodResourcePath = "bin/" + XmrLocalNode.MONEROD_NAME;
- if (!monerodFile.exists() || !FileUtil.resourceEqualToFile(monerodResourcePath, monerodFile)) {
+ if (!monerodFile.exists() || (config.updateXmrBinaries && !FileUtil.resourceEqualToFile(monerodResourcePath, monerodFile))) {
log.info("Installing monerod");
monerodFile.getParentFile().mkdirs();
FileUtil.resourceToFile("bin/" + XmrLocalNode.MONEROD_NAME, monerodFile);
@@ -379,7 +379,7 @@ public class HavenoSetup {
// install monero-wallet-rpc
File moneroWalletRpcFile = new File(XmrWalletService.MONERO_WALLET_RPC_PATH);
String moneroWalletRpcResourcePath = "bin/" + XmrWalletService.MONERO_WALLET_RPC_NAME;
- if (!moneroWalletRpcFile.exists() || !FileUtil.resourceEqualToFile(moneroWalletRpcResourcePath, moneroWalletRpcFile)) {
+ if (!moneroWalletRpcFile.exists() || (config.updateXmrBinaries && !FileUtil.resourceEqualToFile(moneroWalletRpcResourcePath, moneroWalletRpcFile))) {
log.info("Installing monero-wallet-rpc");
moneroWalletRpcFile.getParentFile().mkdirs();
FileUtil.resourceToFile(moneroWalletRpcResourcePath, moneroWalletRpcFile);
diff --git a/core/src/main/java/haveno/core/locale/CurrencyUtil.java b/core/src/main/java/haveno/core/locale/CurrencyUtil.java
index bd66667da5..6ed42b6234 100644
--- a/core/src/main/java/haveno/core/locale/CurrencyUtil.java
+++ b/core/src/main/java/haveno/core/locale/CurrencyUtil.java
@@ -200,7 +200,9 @@ public class CurrencyUtil {
result.add(new CryptoCurrency("BCH", "Bitcoin Cash"));
result.add(new CryptoCurrency("ETH", "Ether"));
result.add(new CryptoCurrency("LTC", "Litecoin"));
+ result.add(new CryptoCurrency("DAI-ERC20", "Dai Stablecoin (ERC20)"));
result.add(new CryptoCurrency("USDT-ERC20", "Tether USD (ERC20)"));
+ result.add(new CryptoCurrency("USDT-TRC20", "Tether USD (TRC20)"));
result.add(new CryptoCurrency("USDC-ERC20", "USD Coin (ERC20)"));
result.sort(TradeCurrency::compareTo);
return result;
@@ -297,7 +299,7 @@ public class CurrencyUtil {
if (currencyCode != null && isCryptoCurrencyMap.containsKey(currencyCode.toUpperCase())) {
return isCryptoCurrencyMap.get(currencyCode.toUpperCase());
}
- if (isCryptoCurrencyBase(currencyCode)) {
+ if (isCryptoCurrencyCodeBase(currencyCode)) {
return true;
}
@@ -326,10 +328,10 @@ public class CurrencyUtil {
return isCryptoCurrency;
}
- private static boolean isCryptoCurrencyBase(String currencyCode) {
+ private static boolean isCryptoCurrencyCodeBase(String currencyCode) {
if (currencyCode == null) return false;
currencyCode = currencyCode.toUpperCase();
- return currencyCode.equals("USDT") || currencyCode.equals("USDC");
+ return currencyCode.equals("USDT") || currencyCode.equals("USDC") || currencyCode.equals("DAI");
}
public static String getCurrencyCodeBase(String currencyCode) {
@@ -337,6 +339,7 @@ public class CurrencyUtil {
currencyCode = currencyCode.toUpperCase();
if (currencyCode.contains("USDT")) return "USDT";
if (currencyCode.contains("USDC")) return "USDC";
+ if (currencyCode.contains("DAI")) return "DAI";
return currencyCode;
}
diff --git a/core/src/main/java/haveno/core/offer/CreateOfferService.java b/core/src/main/java/haveno/core/offer/CreateOfferService.java
index afd4366a3b..bca446827c 100644
--- a/core/src/main/java/haveno/core/offer/CreateOfferService.java
+++ b/core/src/main/java/haveno/core/offer/CreateOfferService.java
@@ -33,10 +33,8 @@ import haveno.core.provider.price.PriceFeedService;
import haveno.core.support.dispute.arbitration.arbitrator.ArbitratorManager;
import haveno.core.trade.HavenoUtils;
import haveno.core.trade.statistics.TradeStatisticsManager;
-import haveno.core.user.Preferences;
import haveno.core.user.User;
import haveno.core.util.coin.CoinUtil;
-import haveno.core.xmr.wallet.Restrictions;
import haveno.core.xmr.wallet.XmrWalletService;
import haveno.network.p2p.NodeAddress;
import haveno.network.p2p.P2PService;
@@ -102,9 +100,11 @@ public class CreateOfferService {
Price fixedPrice,
boolean useMarketBasedPrice,
double marketPriceMargin,
- double securityDepositAsDouble,
- PaymentAccount paymentAccount) {
-
+ double securityDepositPct,
+ PaymentAccount paymentAccount,
+ boolean isPrivateOffer,
+ boolean buyerAsTakerWithoutDeposit,
+ String extraInfo) {
log.info("create and get offer with offerId={}, " +
"currencyCode={}, " +
"direction={}, " +
@@ -113,7 +113,10 @@ public class CreateOfferService {
"marketPriceMargin={}, " +
"amount={}, " +
"minAmount={}, " +
- "securityDeposit={}",
+ "securityDepositPct={}, " +
+ "isPrivateOffer={}, " +
+ "buyerAsTakerWithoutDeposit={}, " +
+ "extraInfo={}",
offerId,
currencyCode,
direction,
@@ -122,7 +125,19 @@ public class CreateOfferService {
marketPriceMargin,
amount,
minAmount,
- securityDepositAsDouble);
+ securityDepositPct,
+ isPrivateOffer,
+ buyerAsTakerWithoutDeposit,
+ extraInfo);
+
+ // must nullify empty string so contracts match
+ if ("".equals(extraInfo)) extraInfo = null;
+
+ // verify buyer as taker security deposit
+ boolean isBuyerMaker = offerUtil.isBuyOffer(direction);
+ if (!isBuyerMaker && !isPrivateOffer && buyerAsTakerWithoutDeposit) {
+ throw new IllegalArgumentException("Buyer as taker deposit is required for public offers");
+ }
// verify fixed price xor market price with margin
if (fixedPrice != null) {
@@ -130,25 +145,29 @@ public class CreateOfferService {
if (marketPriceMargin != 0) throw new IllegalArgumentException("Cannot set market price margin with fixed price");
}
- long creationTime = new Date().getTime();
- NodeAddress makerAddress = p2PService.getAddress();
+ // verify price
boolean useMarketBasedPriceValue = fixedPrice == null &&
useMarketBasedPrice &&
isMarketPriceAvailable(currencyCode) &&
!PaymentMethod.isFixedPriceOnly(paymentAccount.getPaymentMethod().getId());
-
- // verify price
if (fixedPrice == null && !useMarketBasedPriceValue) {
throw new IllegalArgumentException("Must provide fixed price");
}
- // adjust amount and min amount for fixed-price offer
- long maxTradeLimit = offerUtil.getMaxTradeLimit(paymentAccount, currencyCode, direction);
- if (fixedPrice != null) {
- amount = CoinUtil.getRoundedAmount(amount, fixedPrice, maxTradeLimit, currencyCode, paymentAccount.getPaymentMethod().getId());
- minAmount = CoinUtil.getRoundedAmount(minAmount, fixedPrice, maxTradeLimit, currencyCode, paymentAccount.getPaymentMethod().getId());
+ // adjust amount and min amount
+ amount = CoinUtil.getRoundedAmount(amount, fixedPrice, null, currencyCode, paymentAccount.getPaymentMethod().getId());
+ minAmount = CoinUtil.getRoundedAmount(minAmount, fixedPrice, null, currencyCode, paymentAccount.getPaymentMethod().getId());
+
+ // generate one-time challenge for private offer
+ String challenge = null;
+ String challengeHash = null;
+ if (isPrivateOffer) {
+ challenge = HavenoUtils.generateChallenge();
+ challengeHash = HavenoUtils.getChallengeHash(challenge);
}
+ long creationTime = new Date().getTime();
+ NodeAddress makerAddress = p2PService.getAddress();
long priceAsLong = fixedPrice != null ? fixedPrice.getValue() : 0L;
double marketPriceMarginParam = useMarketBasedPriceValue ? marketPriceMargin : 0;
long amountAsLong = amount != null ? amount.longValueExact() : 0L;
@@ -161,21 +180,16 @@ public class CreateOfferService {
String bankId = PaymentAccountUtil.getBankId(paymentAccount);
List acceptedBanks = PaymentAccountUtil.getAcceptedBanks(paymentAccount);
long maxTradePeriod = paymentAccount.getMaxTradePeriod();
-
- // reserved for future use cases
- // Use null values if not set
- boolean isPrivateOffer = false;
+ boolean hasBuyerAsTakerWithoutDeposit = !isBuyerMaker && isPrivateOffer && buyerAsTakerWithoutDeposit;
+ long maxTradeLimit = offerUtil.getMaxTradeLimit(paymentAccount, currencyCode, direction, hasBuyerAsTakerWithoutDeposit);
boolean useAutoClose = false;
boolean useReOpenAfterAutoClose = false;
long lowerClosePrice = 0;
long upperClosePrice = 0;
- String hashOfChallenge = null;
- Map extraDataMap = offerUtil.getExtraDataMap(paymentAccount,
- currencyCode,
- direction);
+ Map extraDataMap = offerUtil.getExtraDataMap(paymentAccount, currencyCode, direction);
offerUtil.validateOfferData(
- securityDepositAsDouble,
+ securityDepositPct,
paymentAccount,
currencyCode);
@@ -189,11 +203,11 @@ public class CreateOfferService {
useMarketBasedPriceValue,
amountAsLong,
minAmountAsLong,
- HavenoUtils.MAKER_FEE_PCT,
- HavenoUtils.TAKER_FEE_PCT,
+ hasBuyerAsTakerWithoutDeposit ? HavenoUtils.MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT : HavenoUtils.MAKER_FEE_PCT,
+ hasBuyerAsTakerWithoutDeposit ? 0d : HavenoUtils.TAKER_FEE_PCT,
HavenoUtils.PENALTY_FEE_PCT,
- securityDepositAsDouble,
- securityDepositAsDouble,
+ hasBuyerAsTakerWithoutDeposit ? 0d : securityDepositPct, // buyer as taker security deposit is optional for private offers
+ securityDepositPct,
baseCurrencyCode,
counterCurrencyCode,
paymentAccount.getPaymentMethod().getId(),
@@ -211,46 +225,19 @@ public class CreateOfferService {
upperClosePrice,
lowerClosePrice,
isPrivateOffer,
- hashOfChallenge,
+ challengeHash,
extraDataMap,
Version.TRADE_PROTOCOL_VERSION,
null,
null,
- null);
+ null,
+ extraInfo);
Offer offer = new Offer(offerPayload);
offer.setPriceFeedService(priceFeedService);
+ offer.setChallenge(challenge);
return offer;
}
- public BigInteger getReservedFundsForOffer(OfferDirection direction,
- BigInteger amount,
- double buyerSecurityDeposit,
- double sellerSecurityDeposit) {
-
- BigInteger reservedFundsForOffer = getSecurityDeposit(direction,
- amount,
- buyerSecurityDeposit,
- sellerSecurityDeposit);
- if (!offerUtil.isBuyOffer(direction))
- reservedFundsForOffer = reservedFundsForOffer.add(amount);
-
- return reservedFundsForOffer;
- }
-
- public BigInteger getSecurityDeposit(OfferDirection direction,
- BigInteger amount,
- double buyerSecurityDeposit,
- double sellerSecurityDeposit) {
- return offerUtil.isBuyOffer(direction) ?
- getBuyerSecurityDeposit(amount, buyerSecurityDeposit) :
- getSellerSecurityDeposit(amount, sellerSecurityDeposit);
- }
-
- public double getSellerSecurityDepositAsDouble(double buyerSecurityDeposit) {
- return Preferences.USE_SYMMETRIC_SECURITY_DEPOSIT ? buyerSecurityDeposit :
- Restrictions.getSellerSecurityDepositAsPercent();
- }
-
///////////////////////////////////////////////////////////////////////////////////////////
// Private
///////////////////////////////////////////////////////////////////////////////////////////
@@ -259,26 +246,4 @@ public class CreateOfferService {
MarketPrice marketPrice = priceFeedService.getMarketPrice(currencyCode);
return marketPrice != null && marketPrice.isExternallyProvidedPrice();
}
-
- private BigInteger getBuyerSecurityDeposit(BigInteger amount, double buyerSecurityDeposit) {
- BigInteger percentOfAmount = CoinUtil.getPercentOfAmount(buyerSecurityDeposit, amount);
- return getBoundedBuyerSecurityDeposit(percentOfAmount);
- }
-
- private BigInteger getSellerSecurityDeposit(BigInteger amount, double sellerSecurityDeposit) {
- BigInteger percentOfAmount = CoinUtil.getPercentOfAmount(sellerSecurityDeposit, amount);
- return getBoundedSellerSecurityDeposit(percentOfAmount);
- }
-
- private BigInteger getBoundedBuyerSecurityDeposit(BigInteger value) {
- // We need to ensure that for small amount values we don't get a too low BTC amount. We limit it with using the
- // MinBuyerSecurityDeposit from Restrictions.
- return Restrictions.getMinBuyerSecurityDeposit().max(value);
- }
-
- private BigInteger getBoundedSellerSecurityDeposit(BigInteger value) {
- // We need to ensure that for small amount values we don't get a too low BTC amount. We limit it with using the
- // MinSellerSecurityDeposit from Restrictions.
- return Restrictions.getMinSellerSecurityDeposit().max(value);
- }
}
diff --git a/core/src/main/java/haveno/core/offer/Offer.java b/core/src/main/java/haveno/core/offer/Offer.java
index 675fbeb550..fac72f827d 100644
--- a/core/src/main/java/haveno/core/offer/Offer.java
+++ b/core/src/main/java/haveno/core/offer/Offer.java
@@ -115,6 +115,12 @@ public class Offer implements NetworkPayload, PersistablePayload {
@Setter
transient private boolean isReservedFundsSpent;
+ @JsonExclude
+ @Getter
+ @Setter
+ @Nullable
+ transient private String challenge;
+
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
@@ -337,6 +343,18 @@ public class Offer implements NetworkPayload, PersistablePayload {
return offerPayload.getSellerSecurityDepositPct();
}
+ public boolean isPrivateOffer() {
+ return offerPayload.isPrivateOffer();
+ }
+
+ public String getChallengeHash() {
+ return offerPayload.getChallengeHash();
+ }
+
+ public boolean hasBuyerAsTakerWithoutDeposit() {
+ return getDirection() == OfferDirection.SELL && getBuyerSecurityDepositPct() == 0;
+ }
+
public BigInteger getMaxTradeLimit() {
return BigInteger.valueOf(offerPayload.getMaxTradeLimit());
}
@@ -403,7 +421,23 @@ public class Offer implements NetworkPayload, PersistablePayload {
return "";
}
- public String getExtraInfo() {
+ public String getCombinedExtraInfo() {
+ StringBuilder sb = new StringBuilder();
+ if (getOfferExtraInfo() != null && !getOfferExtraInfo().isEmpty()) {
+ sb.append(getOfferExtraInfo());
+ }
+ if (getPaymentAccountExtraInfo() != null && !getPaymentAccountExtraInfo().isEmpty()) {
+ if (sb.length() > 0) sb.append("\n\n");
+ sb.append(getPaymentAccountExtraInfo());
+ }
+ return sb.toString();
+ }
+
+ public String getOfferExtraInfo() {
+ return offerPayload.getExtraInfo();
+ }
+
+ public String getPaymentAccountExtraInfo() {
if (getExtraDataMap() != null && getExtraDataMap().containsKey(OfferPayload.F2F_EXTRA_INFO))
return getExtraDataMap().get(OfferPayload.F2F_EXTRA_INFO);
else if (getExtraDataMap() != null && getExtraDataMap().containsKey(OfferPayload.PAY_BY_MAIL_EXTRA_INFO))
@@ -414,6 +448,8 @@ public class Offer implements NetworkPayload, PersistablePayload {
return getExtraDataMap().get(OfferPayload.PAYPAL_EXTRA_INFO);
else if (getExtraDataMap() != null && getExtraDataMap().containsKey(OfferPayload.CASHAPP_EXTRA_INFO))
return getExtraDataMap().get(OfferPayload.CASHAPP_EXTRA_INFO);
+ else if (getExtraDataMap() != null && getExtraDataMap().containsKey(OfferPayload.CASH_AT_ATM_EXTRA_INFO))
+ return getExtraDataMap().get(OfferPayload.CASH_AT_ATM_EXTRA_INFO);
else
return "";
}
diff --git a/core/src/main/java/haveno/core/offer/OfferFilterService.java b/core/src/main/java/haveno/core/offer/OfferFilterService.java
index 51ac8cdee7..e64a1ee6eb 100644
--- a/core/src/main/java/haveno/core/offer/OfferFilterService.java
+++ b/core/src/main/java/haveno/core/offer/OfferFilterService.java
@@ -201,7 +201,7 @@ public class OfferFilterService {
accountAgeWitnessService);
long myTradeLimit = accountOptional
.map(paymentAccount -> accountAgeWitnessService.getMyTradeLimit(paymentAccount,
- offer.getCurrencyCode(), offer.getMirroredDirection()))
+ offer.getCurrencyCode(), offer.getMirroredDirection(), offer.hasBuyerAsTakerWithoutDeposit()))
.orElse(0L);
long offerMinAmount = offer.getMinAmount().longValueExact();
log.debug("isInsufficientTradeLimit accountOptional={}, myTradeLimit={}, offerMinAmount={}, ",
diff --git a/core/src/main/java/haveno/core/offer/OfferPayload.java b/core/src/main/java/haveno/core/offer/OfferPayload.java
index fa05685dee..8da91b4b15 100644
--- a/core/src/main/java/haveno/core/offer/OfferPayload.java
+++ b/core/src/main/java/haveno/core/offer/OfferPayload.java
@@ -102,6 +102,7 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
public static final String PAY_BY_MAIL_EXTRA_INFO = "payByMailExtraInfo";
public static final String AUSTRALIA_PAYID_EXTRA_INFO = "australiaPayidExtraInfo";
public static final String PAYPAL_EXTRA_INFO = "payPalExtraInfo";
+ public static final String CASH_AT_ATM_EXTRA_INFO = "cashAtAtmExtraInfo";
// Comma separated list of ordinal of a haveno.common.app.Capability. E.g. ordinal of
// Capability.SIGNED_ACCOUNT_AGE_WITNESS is 11 and Capability.MEDIATION is 12 so if we want to signal that maker
@@ -156,7 +157,9 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
// Reserved for possible future use to support private trades where the taker needs to have an accessKey
private final boolean isPrivateOffer;
@Nullable
- private final String hashOfChallenge;
+ private final String challengeHash;
+ @Nullable
+ private final String extraInfo;
///////////////////////////////////////////////////////////////////////////////////////////
@@ -195,12 +198,13 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
long lowerClosePrice,
long upperClosePrice,
boolean isPrivateOffer,
- @Nullable String hashOfChallenge,
+ @Nullable String challengeHash,
@Nullable Map extraDataMap,
int protocolVersion,
@Nullable NodeAddress arbitratorSigner,
@Nullable byte[] arbitratorSignature,
- @Nullable List reserveTxKeyImages) {
+ @Nullable List reserveTxKeyImages,
+ @Nullable String extraInfo) {
this.id = id;
this.date = date;
this.ownerNodeAddress = ownerNodeAddress;
@@ -238,7 +242,8 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
this.lowerClosePrice = lowerClosePrice;
this.upperClosePrice = upperClosePrice;
this.isPrivateOffer = isPrivateOffer;
- this.hashOfChallenge = hashOfChallenge;
+ this.challengeHash = challengeHash;
+ this.extraInfo = extraInfo;
}
public byte[] getHash() {
@@ -284,12 +289,13 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
lowerClosePrice,
upperClosePrice,
isPrivateOffer,
- hashOfChallenge,
+ challengeHash,
extraDataMap,
protocolVersion,
arbitratorSigner,
null,
- reserveTxKeyImages
+ reserveTxKeyImages,
+ null
);
return signee.getHash();
@@ -328,12 +334,17 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
public BigInteger getBuyerSecurityDepositForTradeAmount(BigInteger tradeAmount) {
BigInteger securityDepositUnadjusted = HavenoUtils.multiply(tradeAmount, getBuyerSecurityDepositPct());
- return Restrictions.getMinBuyerSecurityDeposit().max(securityDepositUnadjusted);
+ boolean isBuyerTaker = getDirection() == OfferDirection.SELL;
+ if (isPrivateOffer() && isBuyerTaker) {
+ return securityDepositUnadjusted;
+ } else {
+ return Restrictions.getMinSecurityDeposit().max(securityDepositUnadjusted);
+ }
}
public BigInteger getSellerSecurityDepositForTradeAmount(BigInteger tradeAmount) {
BigInteger securityDepositUnadjusted = HavenoUtils.multiply(tradeAmount, getSellerSecurityDepositPct());
- return Restrictions.getMinSellerSecurityDeposit().max(securityDepositUnadjusted);
+ return Restrictions.getMinSecurityDeposit().max(securityDepositUnadjusted);
}
///////////////////////////////////////////////////////////////////////////////////////////
@@ -376,11 +387,12 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
Optional.ofNullable(bankId).ifPresent(builder::setBankId);
Optional.ofNullable(acceptedBankIds).ifPresent(builder::addAllAcceptedBankIds);
Optional.ofNullable(acceptedCountryCodes).ifPresent(builder::addAllAcceptedCountryCodes);
- Optional.ofNullable(hashOfChallenge).ifPresent(builder::setHashOfChallenge);
+ Optional.ofNullable(challengeHash).ifPresent(builder::setChallengeHash);
Optional.ofNullable(extraDataMap).ifPresent(builder::putAllExtraData);
Optional.ofNullable(arbitratorSigner).ifPresent(e -> builder.setArbitratorSigner(arbitratorSigner.toProtoMessage()));
Optional.ofNullable(arbitratorSignature).ifPresent(e -> builder.setArbitratorSignature(ByteString.copyFrom(e)));
Optional.ofNullable(reserveTxKeyImages).ifPresent(builder::addAllReserveTxKeyImages);
+ Optional.ofNullable(extraInfo).ifPresent(builder::setExtraInfo);
return protobuf.StoragePayload.newBuilder().setOfferPayload(builder).build();
}
@@ -392,7 +404,6 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
null : new ArrayList<>(proto.getAcceptedCountryCodesList());
List reserveTxKeyImages = proto.getReserveTxKeyImagesList().isEmpty() ?
null : new ArrayList<>(proto.getReserveTxKeyImagesList());
- String hashOfChallenge = ProtoUtil.stringOrNullFromProto(proto.getHashOfChallenge());
Map extraDataMapMap = CollectionUtils.isEmpty(proto.getExtraDataMap()) ?
null : proto.getExtraDataMap();
@@ -428,12 +439,13 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
proto.getLowerClosePrice(),
proto.getUpperClosePrice(),
proto.getIsPrivateOffer(),
- hashOfChallenge,
+ ProtoUtil.stringOrNullFromProto(proto.getChallengeHash()),
extraDataMapMap,
proto.getProtocolVersion(),
proto.hasArbitratorSigner() ? NodeAddress.fromProto(proto.getArbitratorSigner()) : null,
ProtoUtil.byteArrayOrNullFromProto(proto.getArbitratorSignature()),
- reserveTxKeyImages);
+ reserveTxKeyImages,
+ ProtoUtil.stringOrNullFromProto(proto.getExtraInfo()));
}
@Override
@@ -475,14 +487,15 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
",\r\n lowerClosePrice=" + lowerClosePrice +
",\r\n upperClosePrice=" + upperClosePrice +
",\r\n isPrivateOffer=" + isPrivateOffer +
- ",\r\n hashOfChallenge='" + hashOfChallenge + '\'' +
+ ",\r\n challengeHash='" + challengeHash +
",\r\n arbitratorSigner=" + arbitratorSigner +
",\r\n arbitratorSignature=" + Utilities.bytesAsHexString(arbitratorSignature) +
+ ",\r\n extraInfo='" + extraInfo +
"\r\n} ";
}
// For backward compatibility we need to ensure same order for json fields as with 1.7.5. and earlier versions.
- // The json is used for the hash in the contract and change of oder would cause a different hash and
+ // The json is used for the hash in the contract and change of order would cause a different hash and
// therefore a failure during trade.
public static class JsonSerializer implements com.google.gson.JsonSerializer {
@Override
@@ -519,6 +532,8 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
object.add("protocolVersion", context.serialize(offerPayload.getProtocolVersion()));
object.add("arbitratorSigner", context.serialize(offerPayload.getArbitratorSigner()));
object.add("arbitratorSignature", context.serialize(offerPayload.getArbitratorSignature()));
+ object.add("extraInfo", context.serialize(offerPayload.getExtraInfo()));
+ // reserveTxKeyImages and challengeHash are purposely excluded because they are not relevant to existing trades and would break existing contracts
return object;
}
}
diff --git a/core/src/main/java/haveno/core/offer/OfferUtil.java b/core/src/main/java/haveno/core/offer/OfferUtil.java
index 72593ab5e7..2e2644630a 100644
--- a/core/src/main/java/haveno/core/offer/OfferUtil.java
+++ b/core/src/main/java/haveno/core/offer/OfferUtil.java
@@ -37,6 +37,7 @@ import haveno.core.monetary.Volume;
import static haveno.core.offer.OfferPayload.ACCOUNT_AGE_WITNESS_HASH;
import static haveno.core.offer.OfferPayload.AUSTRALIA_PAYID_EXTRA_INFO;
import static haveno.core.offer.OfferPayload.CAPABILITIES;
+import static haveno.core.offer.OfferPayload.CASH_AT_ATM_EXTRA_INFO;
import static haveno.core.offer.OfferPayload.CASHAPP_EXTRA_INFO;
import static haveno.core.offer.OfferPayload.F2F_CITY;
import static haveno.core.offer.OfferPayload.F2F_EXTRA_INFO;
@@ -48,6 +49,7 @@ import static haveno.core.offer.OfferPayload.XMR_AUTO_CONF_ENABLED_VALUE;
import haveno.core.payment.AustraliaPayidAccount;
import haveno.core.payment.CashAppAccount;
+import haveno.core.payment.CashAtAtmAccount;
import haveno.core.payment.F2FAccount;
import haveno.core.payment.PayByMailAccount;
import haveno.core.payment.PayPalAccount;
@@ -58,8 +60,8 @@ import haveno.core.trade.statistics.ReferralIdService;
import haveno.core.user.AutoConfirmSettings;
import haveno.core.user.Preferences;
import haveno.core.util.coin.CoinFormatter;
-import static haveno.core.xmr.wallet.Restrictions.getMaxBuyerSecurityDepositAsPercent;
-import static haveno.core.xmr.wallet.Restrictions.getMinBuyerSecurityDepositAsPercent;
+import static haveno.core.xmr.wallet.Restrictions.getMaxSecurityDepositAsPercent;
+import static haveno.core.xmr.wallet.Restrictions.getMinSecurityDepositAsPercent;
import haveno.network.p2p.P2PService;
import java.math.BigInteger;
import java.util.HashMap;
@@ -120,9 +122,10 @@ public class OfferUtil {
public long getMaxTradeLimit(PaymentAccount paymentAccount,
String currencyCode,
- OfferDirection direction) {
+ OfferDirection direction,
+ boolean buyerAsTakerWithoutDeposit) {
return paymentAccount != null
- ? accountAgeWitnessService.getMyTradeLimit(paymentAccount, currencyCode, direction)
+ ? accountAgeWitnessService.getMyTradeLimit(paymentAccount, currencyCode, direction, buyerAsTakerWithoutDeposit)
: 0;
}
@@ -216,6 +219,10 @@ public class OfferUtil {
extraDataMap.put(AUSTRALIA_PAYID_EXTRA_INFO, ((AustraliaPayidAccount) paymentAccount).getExtraInfo());
}
+ if (paymentAccount instanceof CashAtAtmAccount) {
+ extraDataMap.put(CASH_AT_ATM_EXTRA_INFO, ((CashAtAtmAccount) paymentAccount).getExtraInfo());
+ }
+
extraDataMap.put(CAPABILITIES, Capabilities.app.toStringList());
if (currencyCode.equals("XMR") && direction == OfferDirection.SELL) {
@@ -228,16 +235,16 @@ public class OfferUtil {
return extraDataMap.isEmpty() ? null : extraDataMap;
}
- public void validateOfferData(double buyerSecurityDeposit,
+ public void validateOfferData(double securityDeposit,
PaymentAccount paymentAccount,
String currencyCode) {
checkNotNull(p2PService.getAddress(), "Address must not be null");
- checkArgument(buyerSecurityDeposit <= getMaxBuyerSecurityDepositAsPercent(),
+ checkArgument(securityDeposit <= getMaxSecurityDepositAsPercent(),
"securityDeposit must not exceed " +
- getMaxBuyerSecurityDepositAsPercent());
- checkArgument(buyerSecurityDeposit >= getMinBuyerSecurityDepositAsPercent(),
+ getMaxSecurityDepositAsPercent());
+ checkArgument(securityDeposit >= getMinSecurityDepositAsPercent(),
"securityDeposit must not be less than " +
- getMinBuyerSecurityDepositAsPercent() + " but was " + buyerSecurityDeposit);
+ getMinSecurityDepositAsPercent() + " but was " + securityDeposit);
checkArgument(!filterManager.isCurrencyBanned(currencyCode),
Res.get("offerbook.warning.currencyBanned"));
checkArgument(!filterManager.isPaymentMethodBanned(paymentAccount.getPaymentMethod()),
diff --git a/core/src/main/java/haveno/core/offer/OpenOffer.java b/core/src/main/java/haveno/core/offer/OpenOffer.java
index b0df3e0e35..fc4365ecba 100644
--- a/core/src/main/java/haveno/core/offer/OpenOffer.java
+++ b/core/src/main/java/haveno/core/offer/OpenOffer.java
@@ -96,6 +96,9 @@ public final class OpenOffer implements Tradable {
@Getter
private String reserveTxKey;
@Getter
+ @Setter
+ private String challenge;
+ @Getter
private final long triggerPrice;
@Getter
@Setter
@@ -107,6 +110,9 @@ public final class OpenOffer implements Tradable {
@Getter
@Setter
transient int numProcessingAttempts = 0;
+ @Getter
+ @Setter
+ private boolean deactivatedByTrigger;
public OpenOffer(Offer offer) {
this(offer, 0, false);
@@ -120,6 +126,7 @@ public final class OpenOffer implements Tradable {
this.offer = offer;
this.triggerPrice = triggerPrice;
this.reserveExactAmount = reserveExactAmount;
+ this.challenge = offer.getChallenge();
state = State.PENDING;
}
@@ -137,6 +144,8 @@ public final class OpenOffer implements Tradable {
this.reserveTxHash = openOffer.reserveTxHash;
this.reserveTxHex = openOffer.reserveTxHex;
this.reserveTxKey = openOffer.reserveTxKey;
+ this.challenge = openOffer.challenge;
+ this.deactivatedByTrigger = openOffer.deactivatedByTrigger;
}
///////////////////////////////////////////////////////////////////////////////////////////
@@ -153,7 +162,9 @@ public final class OpenOffer implements Tradable {
long splitOutputTxFee,
@Nullable String reserveTxHash,
@Nullable String reserveTxHex,
- @Nullable String reserveTxKey) {
+ @Nullable String reserveTxKey,
+ @Nullable String challenge,
+ boolean deactivatedByTrigger) {
this.offer = offer;
this.state = state;
this.triggerPrice = triggerPrice;
@@ -164,6 +175,8 @@ public final class OpenOffer implements Tradable {
this.reserveTxHash = reserveTxHash;
this.reserveTxHex = reserveTxHex;
this.reserveTxKey = reserveTxKey;
+ this.challenge = challenge;
+ this.deactivatedByTrigger = deactivatedByTrigger;
// reset reserved state to available
if (this.state == State.RESERVED) setState(State.AVAILABLE);
@@ -176,7 +189,8 @@ public final class OpenOffer implements Tradable {
.setTriggerPrice(triggerPrice)
.setState(protobuf.OpenOffer.State.valueOf(state.name()))
.setSplitOutputTxFee(splitOutputTxFee)
- .setReserveExactAmount(reserveExactAmount);
+ .setReserveExactAmount(reserveExactAmount)
+ .setDeactivatedByTrigger(deactivatedByTrigger);
Optional.ofNullable(scheduledAmount).ifPresent(e -> builder.setScheduledAmount(scheduledAmount));
Optional.ofNullable(scheduledTxHashes).ifPresent(e -> builder.addAllScheduledTxHashes(scheduledTxHashes));
@@ -184,6 +198,7 @@ public final class OpenOffer implements Tradable {
Optional.ofNullable(reserveTxHash).ifPresent(e -> builder.setReserveTxHash(reserveTxHash));
Optional.ofNullable(reserveTxHex).ifPresent(e -> builder.setReserveTxHex(reserveTxHex));
Optional.ofNullable(reserveTxKey).ifPresent(e -> builder.setReserveTxKey(reserveTxKey));
+ Optional.ofNullable(challenge).ifPresent(e -> builder.setChallenge(challenge));
return protobuf.Tradable.newBuilder().setOpenOffer(builder).build();
}
@@ -199,7 +214,9 @@ public final class OpenOffer implements Tradable {
proto.getSplitOutputTxFee(),
ProtoUtil.stringOrNullFromProto(proto.getReserveTxHash()),
ProtoUtil.stringOrNullFromProto(proto.getReserveTxHex()),
- ProtoUtil.stringOrNullFromProto(proto.getReserveTxKey()));
+ ProtoUtil.stringOrNullFromProto(proto.getReserveTxKey()),
+ ProtoUtil.stringOrNullFromProto(proto.getChallenge()),
+ proto.getDeactivatedByTrigger());
return openOffer;
}
@@ -226,6 +243,14 @@ public final class OpenOffer implements Tradable {
public void setState(State state) {
this.state = state;
stateProperty.set(state);
+ if (state == State.AVAILABLE) {
+ deactivatedByTrigger = false;
+ }
+ }
+
+ public void deactivate(boolean deactivatedByTrigger) {
+ this.deactivatedByTrigger = deactivatedByTrigger;
+ setState(State.DEACTIVATED);
}
public ReadOnlyObjectProperty stateProperty() {
diff --git a/core/src/main/java/haveno/core/offer/OpenOfferManager.java b/core/src/main/java/haveno/core/offer/OpenOfferManager.java
index c8390a5af0..5df08a38ba 100644
--- a/core/src/main/java/haveno/core/offer/OpenOfferManager.java
+++ b/core/src/main/java/haveno/core/offer/OpenOfferManager.java
@@ -79,6 +79,7 @@ import haveno.core.util.JsonUtil;
import haveno.core.util.Validator;
import haveno.core.xmr.model.XmrAddressEntry;
import haveno.core.xmr.wallet.BtcWalletService;
+import haveno.core.xmr.wallet.Restrictions;
import haveno.core.xmr.wallet.XmrKeyImageListener;
import haveno.core.xmr.wallet.XmrKeyImagePoller;
import haveno.core.xmr.wallet.TradeWalletService;
@@ -114,7 +115,6 @@ import lombok.Getter;
import monero.common.MoneroRpcConnection;
import monero.daemon.model.MoneroKeyImageSpentStatus;
import monero.daemon.model.MoneroTx;
-import monero.wallet.model.MoneroIncomingTransfer;
import monero.wallet.model.MoneroOutputQuery;
import monero.wallet.model.MoneroOutputWallet;
import monero.wallet.model.MoneroTransferQuery;
@@ -595,6 +595,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
offerBookService.activateOffer(offer,
() -> {
openOffer.setState(OpenOffer.State.AVAILABLE);
+ applyTriggerState(openOffer);
requestPersistence();
log.debug("activateOpenOffer, offerId={}", offer.getId());
resultHandler.handleResult();
@@ -603,14 +604,22 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
}
}
+ private void applyTriggerState(OpenOffer openOffer) {
+ if (openOffer.getState() != OpenOffer.State.AVAILABLE) return;
+ if (TriggerPriceService.isTriggered(priceFeedService.getMarketPrice(openOffer.getOffer().getCurrencyCode()), openOffer)) {
+ openOffer.deactivate(true);
+ }
+ }
+
public void deactivateOpenOffer(OpenOffer openOffer,
+ boolean deactivatedByTrigger,
ResultHandler resultHandler,
ErrorMessageHandler errorMessageHandler) {
Offer offer = openOffer.getOffer();
if (openOffer.isAvailable()) {
offerBookService.deactivateOffer(offer.getOfferPayload(),
() -> {
- openOffer.setState(OpenOffer.State.DEACTIVATED);
+ openOffer.deactivate(deactivatedByTrigger);
requestPersistence();
log.debug("deactivateOpenOffer, offerId={}", offer.getId());
resultHandler.handleResult();
@@ -661,6 +670,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
if (openOffer.isAvailable()) {
deactivateOpenOffer(openOffer,
+ false,
resultHandler,
errorMessage -> {
offersToBeEdited.remove(openOffer.getId());
@@ -686,7 +696,12 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
removeOpenOffer(openOffer);
OpenOffer editedOpenOffer = new OpenOffer(editedOffer, triggerPrice, openOffer);
- editedOpenOffer.setState(originalState);
+ if (originalState == OpenOffer.State.DEACTIVATED && openOffer.isDeactivatedByTrigger()) {
+ editedOpenOffer.setState(OpenOffer.State.AVAILABLE);
+ applyTriggerState(editedOpenOffer);
+ } else {
+ editedOpenOffer.setState(originalState);
+ }
addOpenOffer(editedOpenOffer);
@@ -947,7 +962,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
if (openOffer.getScheduledTxHashes() != null) {
boolean scheduledTxsAvailable = true;
for (MoneroTxWallet tx : xmrWalletService.getTxs(openOffer.getScheduledTxHashes())) {
- if (!tx.isLocked() && !isOutputsAvailable(tx)) {
+ if (!tx.isLocked() && !hasSpendableAmount(tx)) {
scheduledTxsAvailable = false;
break;
}
@@ -1158,42 +1173,26 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
private void scheduleWithEarliestTxs(List openOffers, OpenOffer openOffer) {
- // check for sufficient balance - scheduled offers amount
+ // get earliest available or pending txs with sufficient spendable amount
BigInteger offerReserveAmount = openOffer.getOffer().getAmountNeeded();
- if (xmrWalletService.getBalance().subtract(getScheduledAmount(openOffers)).compareTo(offerReserveAmount) < 0) {
- throw new RuntimeException("Not enough money in Haveno wallet");
- }
-
- // get earliest available or pending txs with sufficient incoming amount
BigInteger scheduledAmount = BigInteger.ZERO;
Set scheduledTxs = new HashSet();
for (MoneroTxWallet tx : xmrWalletService.getTxs()) {
- // skip if no funds available
- BigInteger sentToSelfAmount = xmrWalletService.getAmountSentToSelf(tx); // amount sent to self always shows 0, so compute from destinations manually
- if (sentToSelfAmount.equals(BigInteger.ZERO) && (tx.getIncomingTransfers() == null || tx.getIncomingTransfers().isEmpty())) continue;
- if (!isOutputsAvailable(tx)) continue;
- if (isTxScheduledByOtherOffer(openOffers, openOffer, tx.getHash())) continue;
+ // get unscheduled spendable amount
+ BigInteger spendableAmount = getUnscheduledSpendableAmount(tx, openOffers);
- // schedule transaction if funds sent to self, because they are not included in incoming transfers // TODO: fix in libraries?
- if (sentToSelfAmount.compareTo(BigInteger.ZERO) > 0) {
- scheduledAmount = scheduledAmount.add(sentToSelfAmount);
- scheduledTxs.add(tx);
- } else if (tx.getIncomingTransfers() != null) {
+ // skip if no spendable amount
+ if (spendableAmount.equals(BigInteger.ZERO)) continue;
- // schedule transaction if incoming tranfers to account 0
- for (MoneroIncomingTransfer transfer : tx.getIncomingTransfers()) {
- if (transfer.getAccountIndex() == 0) {
- scheduledAmount = scheduledAmount.add(transfer.getAmount());
- scheduledTxs.add(tx);
- }
- }
- }
+ // schedule tx
+ scheduledAmount = scheduledAmount.add(spendableAmount);
+ scheduledTxs.add(tx);
// break if sufficient funds
if (scheduledAmount.compareTo(offerReserveAmount) >= 0) break;
}
- if (scheduledAmount.compareTo(offerReserveAmount) < 0) throw new RuntimeException("Not enough funds to schedule offer");
+ if (scheduledAmount.compareTo(offerReserveAmount) < 0) throw new RuntimeException("Not enough funds to create offer");
// schedule txs
openOffer.setScheduledTxHashes(scheduledTxs.stream().map(tx -> tx.getHash()).collect(Collectors.toList()));
@@ -1201,21 +1200,56 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
openOffer.setState(OpenOffer.State.PENDING);
}
- private BigInteger getScheduledAmount(List openOffers) {
- BigInteger scheduledAmount = BigInteger.ZERO;
+ private BigInteger getUnscheduledSpendableAmount(MoneroTxWallet tx, List openOffers) {
+ if (isScheduledWithUnknownAmount(tx, openOffers)) return BigInteger.ZERO;
+ return getSpendableAmount(tx).subtract(getSplitAmount(tx, openOffers)).max(BigInteger.ZERO);
+ }
+
+ private boolean isScheduledWithUnknownAmount(MoneroTxWallet tx, List openOffers) {
for (OpenOffer openOffer : openOffers) {
- if (openOffer.getState() != OpenOffer.State.PENDING) continue;
if (openOffer.getScheduledTxHashes() == null) continue;
- List fundingTxs = xmrWalletService.getTxs(openOffer.getScheduledTxHashes());
- for (MoneroTxWallet fundingTx : fundingTxs) {
- if (fundingTx.getIncomingTransfers() != null) {
- for (MoneroIncomingTransfer transfer : fundingTx.getIncomingTransfers()) {
- if (transfer.getAccountIndex() == 0) scheduledAmount = scheduledAmount.add(transfer.getAmount());
+ if (openOffer.getScheduledTxHashes().contains(tx.getHash()) && !tx.getHash().equals(openOffer.getSplitOutputTxHash())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private BigInteger getSplitAmount(MoneroTxWallet tx, List openOffers) {
+ for (OpenOffer openOffer : openOffers) {
+ if (openOffer.getSplitOutputTxHash() == null) continue;
+ if (!openOffer.getSplitOutputTxHash().equals(tx.getHash())) continue;
+ return openOffer.getOffer().getAmountNeeded();
+ }
+ return BigInteger.ZERO;
+ }
+
+ private BigInteger getSpendableAmount(MoneroTxWallet tx) {
+
+ // compute spendable amount from outputs if confirmed
+ if (tx.isConfirmed()) {
+ BigInteger spendableAmount = BigInteger.ZERO;
+ if (tx.getOutputsWallet() != null) {
+ for (MoneroOutputWallet output : tx.getOutputsWallet()) {
+ if (!output.isSpent() && !output.isFrozen() && output.getAccountIndex() == 0) {
+ spendableAmount = spendableAmount.add(output.getAmount());
}
}
}
+ return spendableAmount;
}
- return scheduledAmount;
+
+ // funds sent to self always show 0 incoming amount, so compute from destinations manually
+ // TODO: this excludes change output, so change is missing from spendable amount until confirmed
+ BigInteger sentToSelfAmount = xmrWalletService.getAmountSentToSelf(tx);
+ if (sentToSelfAmount.compareTo(BigInteger.ZERO) > 0) return sentToSelfAmount;
+
+ // if not confirmed and not sent to self, return incoming amount
+ return tx.getIncomingAmount() == null ? BigInteger.ZERO : tx.getIncomingAmount();
+ }
+
+ private boolean hasSpendableAmount(MoneroTxWallet tx) {
+ return getSpendableAmount(tx).compareTo(BigInteger.ZERO) > 0;
}
private boolean isTxScheduledByOtherOffer(List openOffers, OpenOffer openOffer, String txHash) {
@@ -1232,14 +1266,6 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
return false;
}
- private boolean isOutputsAvailable(MoneroTxWallet tx) {
- if (tx.getOutputsWallet() == null) return false;
- for (MoneroOutputWallet output : tx.getOutputsWallet()) {
- if (output.isSpent() || output.isFrozen()) return false;
- }
- return true;
- }
-
private void signAndPostOffer(OpenOffer openOffer,
boolean useSavingsWallet, // TODO: remove this?
TransactionResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
@@ -1307,7 +1333,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
NodeAddress thisAddress = p2PService.getNetworkNode().getNodeAddress();
if (thisArbitrator == null || !thisArbitrator.getNodeAddress().equals(thisAddress)) {
errorMessage = "Cannot sign offer because we are not a registered arbitrator";
- log.info(errorMessage);
+ log.warn(errorMessage);
sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
return;
}
@@ -1315,47 +1341,109 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
// verify arbitrator is signer of offer payload
if (!thisAddress.equals(request.getOfferPayload().getArbitratorSigner())) {
errorMessage = "Cannot sign offer because offer payload is for a different arbitrator";
- log.info(errorMessage);
+ log.warn(errorMessage);
sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
return;
}
- // verify maker's trade fee
+ // private offers must have challenge hash
Offer offer = new Offer(request.getOfferPayload());
- if (offer.getMakerFeePct() != HavenoUtils.MAKER_FEE_PCT) {
- errorMessage = "Wrong maker fee for offer " + request.offerId;
- log.info(errorMessage);
+ if (offer.isPrivateOffer() && (offer.getChallengeHash() == null || offer.getChallengeHash().length() == 0)) {
+ errorMessage = "Private offer must have challenge hash for offer " + request.offerId;
+ log.warn(errorMessage);
sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
return;
}
- // verify taker's trade fee
- if (offer.getTakerFeePct() != HavenoUtils.TAKER_FEE_PCT) {
- errorMessage = "Wrong taker fee for offer " + request.offerId;
- log.info(errorMessage);
- sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
- return;
+ // verify maker and taker fees
+ boolean hasBuyerAsTakerWithoutDeposit = offer.getDirection() == OfferDirection.SELL && offer.isPrivateOffer() && offer.getChallengeHash() != null && offer.getChallengeHash().length() > 0 && offer.getTakerFeePct() == 0;
+ if (hasBuyerAsTakerWithoutDeposit) {
+
+ // verify maker's trade fee
+ if (offer.getMakerFeePct() != HavenoUtils.MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT) {
+ errorMessage = "Wrong maker fee for offer " + request.offerId + ". Expected " + HavenoUtils.MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT + " but got " + offer.getMakerFeePct();
+ log.warn(errorMessage);
+ sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
+ return;
+ }
+
+ // verify taker's trade fee
+ if (offer.getTakerFeePct() != 0) {
+ errorMessage = "Wrong taker fee for offer " + request.offerId + ". Expected 0 but got " + offer.getTakerFeePct();
+ log.warn(errorMessage);
+ sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
+ return;
+ }
+
+ // verify maker security deposit
+ if (offer.getSellerSecurityDepositPct() != Restrictions.MIN_SECURITY_DEPOSIT_PCT) {
+ errorMessage = "Wrong seller security deposit for offer " + request.offerId + ". Expected " + Restrictions.MIN_SECURITY_DEPOSIT_PCT + " but got " + offer.getSellerSecurityDepositPct();
+ log.warn(errorMessage);
+ sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
+ return;
+ }
+
+ // verify taker's security deposit
+ if (offer.getBuyerSecurityDepositPct() != 0) {
+ errorMessage = "Wrong buyer security deposit for offer " + request.offerId + ". Expected 0 but got " + offer.getBuyerSecurityDepositPct();
+ log.warn(errorMessage);
+ sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
+ return;
+ }
+ } else {
+
+ // verify maker's trade fee
+ if (offer.getMakerFeePct() != HavenoUtils.MAKER_FEE_PCT) {
+ errorMessage = "Wrong maker fee for offer " + request.offerId + ". Expected " + HavenoUtils.MAKER_FEE_PCT + " but got " + offer.getMakerFeePct();
+ log.warn(errorMessage);
+ sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
+ return;
+ }
+
+ // verify taker's trade fee
+ if (offer.getTakerFeePct() != HavenoUtils.TAKER_FEE_PCT) {
+ errorMessage = "Wrong taker fee for offer " + request.offerId + ". Expected " + HavenoUtils.TAKER_FEE_PCT + " but got " + offer.getTakerFeePct();
+ log.warn(errorMessage);
+ sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
+ return;
+ }
+
+ // verify seller's security deposit
+ if (offer.getSellerSecurityDepositPct() < Restrictions.MIN_SECURITY_DEPOSIT_PCT) {
+ errorMessage = "Insufficient seller security deposit for offer " + request.offerId + ". Expected at least " + Restrictions.MIN_SECURITY_DEPOSIT_PCT + " but got " + offer.getSellerSecurityDepositPct();
+ log.warn(errorMessage);
+ sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
+ return;
+ }
+
+ // verify buyer's security deposit
+ if (offer.getBuyerSecurityDepositPct() < Restrictions.MIN_SECURITY_DEPOSIT_PCT) {
+ errorMessage = "Insufficient buyer security deposit for offer " + request.offerId + ". Expected at least " + Restrictions.MIN_SECURITY_DEPOSIT_PCT + " but got " + offer.getBuyerSecurityDepositPct();
+ log.warn(errorMessage);
+ sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
+ return;
+ }
+
+ // security deposits must be equal
+ if (offer.getBuyerSecurityDepositPct() != offer.getSellerSecurityDepositPct()) {
+ errorMessage = "Buyer and seller security deposits are not equal for offer " + request.offerId + ": " + offer.getSellerSecurityDepositPct() + " vs " + offer.getBuyerSecurityDepositPct();
+ log.warn(errorMessage);
+ sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
+ return;
+ }
}
// verify penalty fee
if (offer.getPenaltyFeePct() != HavenoUtils.PENALTY_FEE_PCT) {
errorMessage = "Wrong penalty fee for offer " + request.offerId;
- log.info(errorMessage);
- sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
- return;
- }
-
- // verify security deposits are equal
- if (offer.getBuyerSecurityDepositPct() != offer.getSellerSecurityDepositPct()) {
- errorMessage = "Buyer and seller security deposits are not equal for offer " + request.offerId;
- log.info(errorMessage);
+ log.warn(errorMessage);
sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
return;
}
// verify maker's reserve tx (double spend, trade fee, trade amount, mining fee)
BigInteger penaltyFee = HavenoUtils.multiply(offer.getAmount(), HavenoUtils.PENALTY_FEE_PCT);
- BigInteger maxTradeFee = HavenoUtils.multiply(offer.getAmount(), HavenoUtils.MAKER_FEE_PCT);
+ BigInteger maxTradeFee = HavenoUtils.multiply(offer.getAmount(), hasBuyerAsTakerWithoutDeposit ? HavenoUtils.MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT : HavenoUtils.MAKER_FEE_PCT);
BigInteger sendTradeAmount = offer.getDirection() == OfferDirection.BUY ? BigInteger.ZERO : offer.getAmount();
BigInteger securityDeposit = offer.getDirection() == OfferDirection.BUY ? offer.getMaxBuyerSecurityDeposit() : offer.getMaxSellerSecurityDeposit();
MoneroTx verifiedTx = xmrWalletService.verifyReserveTx(
@@ -1710,12 +1798,13 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
originalOfferPayload.getLowerClosePrice(),
originalOfferPayload.getUpperClosePrice(),
originalOfferPayload.isPrivateOffer(),
- originalOfferPayload.getHashOfChallenge(),
+ originalOfferPayload.getChallengeHash(),
updatedExtraDataMap,
protocolVersion,
originalOfferPayload.getArbitratorSigner(),
originalOfferPayload.getArbitratorSignature(),
- originalOfferPayload.getReserveTxKeyImages());
+ originalOfferPayload.getReserveTxKeyImages(),
+ originalOfferPayload.getExtraInfo());
// Save states from original data to use for the updated
Offer.State originalOfferState = originalOffer.getState();
diff --git a/core/src/main/java/haveno/core/offer/TriggerPriceService.java b/core/src/main/java/haveno/core/offer/TriggerPriceService.java
index 59705de064..18527b774c 100644
--- a/core/src/main/java/haveno/core/offer/TriggerPriceService.java
+++ b/core/src/main/java/haveno/core/offer/TriggerPriceService.java
@@ -92,12 +92,11 @@ public class TriggerPriceService {
.filter(marketPrice -> openOffersByCurrency.containsKey(marketPrice.getCurrencyCode()))
.forEach(marketPrice -> {
openOffersByCurrency.get(marketPrice.getCurrencyCode()).stream()
- .filter(openOffer -> !openOffer.isDeactivated())
.forEach(openOffer -> checkPriceThreshold(marketPrice, openOffer));
});
}
- public static boolean wasTriggered(MarketPrice marketPrice, OpenOffer openOffer) {
+ public static boolean isTriggered(MarketPrice marketPrice, OpenOffer openOffer) {
Price price = openOffer.getOffer().getPrice();
if (price == null || marketPrice == null) {
return false;
@@ -125,13 +124,12 @@ public class TriggerPriceService {
}
private void checkPriceThreshold(MarketPrice marketPrice, OpenOffer openOffer) {
- if (wasTriggered(marketPrice, openOffer)) {
- String currencyCode = openOffer.getOffer().getCurrencyCode();
- int smallestUnitExponent = CurrencyUtil.isTraditionalCurrency(currencyCode) ?
- TraditionalMoney.SMALLEST_UNIT_EXPONENT :
- CryptoMoney.SMALLEST_UNIT_EXPONENT;
- long triggerPrice = openOffer.getTriggerPrice();
+ String currencyCode = openOffer.getOffer().getCurrencyCode();
+ int smallestUnitExponent = CurrencyUtil.isTraditionalCurrency(currencyCode) ?
+ TraditionalMoney.SMALLEST_UNIT_EXPONENT :
+ CryptoMoney.SMALLEST_UNIT_EXPONENT;
+ if (openOffer.getState() == OpenOffer.State.AVAILABLE && isTriggered(marketPrice, openOffer)) {
log.info("Market price exceeded the trigger price of the open offer.\n" +
"We deactivate the open offer with ID {}.\nCurrency: {};\nOffer direction: {};\n" +
"Market price: {};\nTrigger price: {}",
@@ -139,14 +137,26 @@ public class TriggerPriceService {
currencyCode,
openOffer.getOffer().getDirection(),
marketPrice.getPrice(),
- MathUtils.scaleDownByPowerOf10(triggerPrice, smallestUnitExponent)
+ MathUtils.scaleDownByPowerOf10(openOffer.getTriggerPrice(), smallestUnitExponent)
);
- openOfferManager.deactivateOpenOffer(openOffer, () -> {
+ openOfferManager.deactivateOpenOffer(openOffer, true, () -> {
+ }, errorMessage -> {
+ });
+ } else if (openOffer.getState() == OpenOffer.State.DEACTIVATED && openOffer.isDeactivatedByTrigger() && !isTriggered(marketPrice, openOffer)) {
+ log.info("Market price is back within the trigger price of the open offer.\n" +
+ "We reactivate the open offer with ID {}.\nCurrency: {};\nOffer direction: {};\n" +
+ "Market price: {};\nTrigger price: {}",
+ openOffer.getOffer().getShortId(),
+ currencyCode,
+ openOffer.getOffer().getDirection(),
+ marketPrice.getPrice(),
+ MathUtils.scaleDownByPowerOf10(openOffer.getTriggerPrice(), smallestUnitExponent)
+ );
+
+ openOfferManager.activateOpenOffer(openOffer, () -> {
}, errorMessage -> {
});
- } else if (openOffer.getState() == OpenOffer.State.AVAILABLE) {
- // TODO: check if open offer's reserve tx is failed or double spend seen
}
}
diff --git a/core/src/main/java/haveno/core/offer/availability/tasks/SendOfferAvailabilityRequest.java b/core/src/main/java/haveno/core/offer/availability/tasks/SendOfferAvailabilityRequest.java
index 493ded6759..d6080e61e3 100644
--- a/core/src/main/java/haveno/core/offer/availability/tasks/SendOfferAvailabilityRequest.java
+++ b/core/src/main/java/haveno/core/offer/availability/tasks/SendOfferAvailabilityRequest.java
@@ -88,7 +88,8 @@ public class SendOfferAvailabilityRequest extends Task {
null, // reserve tx not sent from taker to maker
null,
null,
- payoutAddress);
+ payoutAddress,
+ null); // challenge is required when offer taken
// save trade request to later send to arbitrator
model.setTradeRequest(tradeRequest);
diff --git a/core/src/main/java/haveno/core/offer/placeoffer/tasks/MakerReserveOfferFunds.java b/core/src/main/java/haveno/core/offer/placeoffer/tasks/MakerReserveOfferFunds.java
index 4b44a8102d..0d9271a41e 100644
--- a/core/src/main/java/haveno/core/offer/placeoffer/tasks/MakerReserveOfferFunds.java
+++ b/core/src/main/java/haveno/core/offer/placeoffer/tasks/MakerReserveOfferFunds.java
@@ -33,6 +33,7 @@ import haveno.core.xmr.model.XmrAddressEntry;
import lombok.extern.slf4j.Slf4j;
import monero.common.MoneroRpcConnection;
import monero.daemon.model.MoneroOutput;
+import monero.wallet.model.MoneroOutputWallet;
import monero.wallet.model.MoneroTxWallet;
@Slf4j
@@ -62,7 +63,6 @@ public class MakerReserveOfferFunds extends Task {
model.getXmrWalletService().getXmrConnectionService().verifyConnection();
// create reserve tx
- MoneroTxWallet reserveTx = null;
synchronized (HavenoUtils.xmrWalletService.getWalletLock()) {
// reset protocol timeout
@@ -79,6 +79,7 @@ public class MakerReserveOfferFunds extends Task {
Integer preferredSubaddressIndex = fundingEntry == null ? null : fundingEntry.getSubaddressIndex();
// attempt creating reserve tx
+ MoneroTxWallet reserveTx = null;
try {
synchronized (HavenoUtils.getWalletFunctionLock()) {
for (int i = 0; i < TradeProtocol.MAX_ATTEMPTS; i++) {
@@ -121,6 +122,19 @@ public class MakerReserveOfferFunds extends Task {
openOffer.setReserveTxHex(reserveTx.getFullHex());
openOffer.setReserveTxKey(reserveTx.getKey());
offer.getOfferPayload().setReserveTxKeyImages(reservedKeyImages);
+
+ // reset offer funding address entry if unused
+ if (fundingEntry != null) {
+ List inputs = model.getXmrWalletService().getOutputs(reservedKeyImages);
+ boolean usesFundingEntry = false;
+ for (MoneroOutputWallet input : inputs) {
+ if (input.getAccountIndex() == 0 && input.getSubaddressIndex() == fundingEntry.getSubaddressIndex()) {
+ usesFundingEntry = true;
+ break;
+ }
+ }
+ if (!usesFundingEntry) model.getXmrWalletService().swapAddressEntryToAvailable(offer.getId(), XmrAddressEntry.Context.OFFER_FUNDING);
+ }
}
complete();
} catch (Throwable t) {
diff --git a/core/src/main/java/haveno/core/offer/placeoffer/tasks/ValidateOffer.java b/core/src/main/java/haveno/core/offer/placeoffer/tasks/ValidateOffer.java
index dfb1b2fa34..3b1a01beeb 100644
--- a/core/src/main/java/haveno/core/offer/placeoffer/tasks/ValidateOffer.java
+++ b/core/src/main/java/haveno/core/offer/placeoffer/tasks/ValidateOffer.java
@@ -21,6 +21,7 @@ import haveno.common.taskrunner.Task;
import haveno.common.taskrunner.TaskRunner;
import haveno.core.account.witness.AccountAgeWitnessService;
import haveno.core.offer.Offer;
+import haveno.core.offer.OfferDirection;
import haveno.core.offer.placeoffer.PlaceOfferModel;
import haveno.core.trade.HavenoUtils;
import haveno.core.trade.messages.TradeMessage;
@@ -63,8 +64,21 @@ public class ValidateOffer extends Task {
checkBINotNullOrZero(offer.getMaxTradeLimit(), "MaxTradeLimit");
if (offer.getMakerFeePct() < 0) throw new IllegalArgumentException("Maker fee must be >= 0% but was " + offer.getMakerFeePct());
if (offer.getTakerFeePct() < 0) throw new IllegalArgumentException("Taker fee must be >= 0% but was " + offer.getTakerFeePct());
- if (offer.getBuyerSecurityDepositPct() <= 0) throw new IllegalArgumentException("Buyer security deposit percent must be positive but was " + offer.getBuyerSecurityDepositPct());
- if (offer.getSellerSecurityDepositPct() <= 0) throw new IllegalArgumentException("Seller security deposit percent must be positive but was " + offer.getSellerSecurityDepositPct());
+ offer.isPrivateOffer();
+ if (offer.isPrivateOffer()) {
+ boolean isBuyerMaker = offer.getDirection() == OfferDirection.BUY;
+ if (isBuyerMaker) {
+ if (offer.getBuyerSecurityDepositPct() <= 0) throw new IllegalArgumentException("Buyer security deposit percent must be positive but was " + offer.getBuyerSecurityDepositPct());
+ if (offer.getSellerSecurityDepositPct() < 0) throw new IllegalArgumentException("Seller security deposit percent must be >= 0% but was " + offer.getSellerSecurityDepositPct());
+ } else {
+ if (offer.getBuyerSecurityDepositPct() < 0) throw new IllegalArgumentException("Buyer security deposit percent must be >= 0% but was " + offer.getBuyerSecurityDepositPct());
+ if (offer.getSellerSecurityDepositPct() <= 0) throw new IllegalArgumentException("Seller security deposit percent must be positive but was " + offer.getSellerSecurityDepositPct());
+ }
+ } else {
+ if (offer.getBuyerSecurityDepositPct() <= 0) throw new IllegalArgumentException("Buyer security deposit percent must be positive but was " + offer.getBuyerSecurityDepositPct());
+ if (offer.getSellerSecurityDepositPct() <= 0) throw new IllegalArgumentException("Seller security deposit percent must be positive but was " + offer.getSellerSecurityDepositPct());
+ }
+
// We remove those checks to be more flexible with future changes.
/*checkArgument(offer.getMakerFee().value >= FeeService.getMinMakerFee(offer.isCurrencyForMakerFeeBtc()).value,
@@ -82,9 +96,9 @@ public class ValidateOffer extends Task {
/*checkArgument(offer.getMinAmount().compareTo(ProposalConsensus.getMinTradeAmount()) >= 0,
"MinAmount is less than " + ProposalConsensus.getMinTradeAmount().toFriendlyString());*/
- long maxAmount = accountAgeWitnessService.getMyTradeLimit(user.getPaymentAccount(offer.getMakerPaymentAccountId()), offer.getCurrencyCode(), offer.getDirection());
+ long maxAmount = accountAgeWitnessService.getMyTradeLimit(user.getPaymentAccount(offer.getMakerPaymentAccountId()), offer.getCurrencyCode(), offer.getDirection(), offer.hasBuyerAsTakerWithoutDeposit());
checkArgument(offer.getAmount().longValueExact() <= maxAmount,
- "Amount is larger than " + HavenoUtils.atomicUnitsToXmr(offer.getPaymentMethod().getMaxTradeLimit(offer.getCurrencyCode())) + " XMR");
+ "Amount is larger than " + HavenoUtils.atomicUnitsToXmr(maxAmount) + " XMR");
checkArgument(offer.getAmount().compareTo(offer.getMinAmount()) >= 0, "MinAmount is larger than Amount");
checkNotNull(offer.getPrice(), "Price is null");
diff --git a/core/src/main/java/haveno/core/offer/takeoffer/TakeOfferModel.java b/core/src/main/java/haveno/core/offer/takeoffer/TakeOfferModel.java
index 85d0b99bcf..49c6da12e9 100644
--- a/core/src/main/java/haveno/core/offer/takeoffer/TakeOfferModel.java
+++ b/core/src/main/java/haveno/core/offer/takeoffer/TakeOfferModel.java
@@ -148,7 +148,8 @@ public class TakeOfferModel implements Model {
private long getMaxTradeLimit() {
return accountAgeWitnessService.getMyTradeLimit(paymentAccount,
offer.getCurrencyCode(),
- offer.getMirroredDirection());
+ offer.getMirroredDirection(),
+ offer.hasBuyerAsTakerWithoutDeposit());
}
@NotNull
diff --git a/core/src/main/java/haveno/core/payment/AliPayAccount.java b/core/src/main/java/haveno/core/payment/AliPayAccount.java
index b6f93b364d..1bff92b5cd 100644
--- a/core/src/main/java/haveno/core/payment/AliPayAccount.java
+++ b/core/src/main/java/haveno/core/payment/AliPayAccount.java
@@ -31,7 +31,34 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true)
public final class AliPayAccount extends PaymentAccount {
- public static final List SUPPORTED_CURRENCIES = List.of(new TraditionalCurrency("CNY"));
+ public static final List SUPPORTED_CURRENCIES = List.of(
+ new TraditionalCurrency("AED"),
+ new TraditionalCurrency("AUD"),
+ new TraditionalCurrency("CAD"),
+ new TraditionalCurrency("CHF"),
+ new TraditionalCurrency("CNY"),
+ new TraditionalCurrency("CZK"),
+ new TraditionalCurrency("DKK"),
+ new TraditionalCurrency("EUR"),
+ new TraditionalCurrency("GBP"),
+ new TraditionalCurrency("HKD"),
+ new TraditionalCurrency("IDR"),
+ new TraditionalCurrency("ILS"),
+ new TraditionalCurrency("JPY"),
+ new TraditionalCurrency("KRW"),
+ new TraditionalCurrency("LKR"),
+ new TraditionalCurrency("MUR"),
+ new TraditionalCurrency("MYR"),
+ new TraditionalCurrency("NOK"),
+ new TraditionalCurrency("NZD"),
+ new TraditionalCurrency("PHP"),
+ new TraditionalCurrency("RUB"),
+ new TraditionalCurrency("SEK"),
+ new TraditionalCurrency("SGD"),
+ new TraditionalCurrency("THB"),
+ new TraditionalCurrency("USD"),
+ new TraditionalCurrency("ZAR")
+ );
public AliPayAccount() {
super(PaymentMethod.ALI_PAY);
diff --git a/core/src/main/java/haveno/core/payment/F2FAccount.java b/core/src/main/java/haveno/core/payment/F2FAccount.java
index b75718ec68..a16b4daf6c 100644
--- a/core/src/main/java/haveno/core/payment/F2FAccount.java
+++ b/core/src/main/java/haveno/core/payment/F2FAccount.java
@@ -93,7 +93,7 @@ public final class F2FAccount extends CountryBasedPaymentAccount {
if (field.getId() == PaymentAccountFormField.FieldId.TRADE_CURRENCIES) field.setComponent(PaymentAccountFormField.Component.SELECT_ONE);
if (field.getId() == PaymentAccountFormField.FieldId.CITY) field.setLabel(Res.get("payment.f2f.city"));
if (field.getId() == PaymentAccountFormField.FieldId.CONTACT) field.setLabel(Res.get("payment.f2f.contact"));
- if (field.getId() == PaymentAccountFormField.FieldId.EXTRA_INFO) field.setLabel(Res.get("payment.shared.extraInfo.prompt"));
+ if (field.getId() == PaymentAccountFormField.FieldId.EXTRA_INFO) field.setLabel(Res.get("payment.shared.extraInfo.prompt.paymentAccount"));
return field;
}
}
diff --git a/core/src/main/java/haveno/core/payment/PaymentAccount.java b/core/src/main/java/haveno/core/payment/PaymentAccount.java
index a9e03d8016..8dda8fdedd 100644
--- a/core/src/main/java/haveno/core/payment/PaymentAccount.java
+++ b/core/src/main/java/haveno/core/payment/PaymentAccount.java
@@ -378,6 +378,7 @@ public abstract class PaymentAccount implements PersistablePayload {
@NonNull
public abstract List getInputFieldIds();
+ @SuppressWarnings("unchecked")
public PaymentAccountForm toForm() {
// convert to json map
@@ -387,7 +388,12 @@ public abstract class PaymentAccount implements PersistablePayload {
PaymentAccountForm form = new PaymentAccountForm(PaymentAccountForm.FormId.valueOf(paymentMethod.getId()));
for (PaymentAccountFormField.FieldId fieldId : getInputFieldIds()) {
PaymentAccountFormField field = getEmptyFormField(fieldId);
- field.setValue((String) jsonMap.get(HavenoUtils.toCamelCase(field.getId().toString())));
+ Object value = jsonMap.get(HavenoUtils.toCamelCase(field.getId().toString()));
+ if (value instanceof List) { // TODO: list should already be serialized to comma delimited string in PaymentAccount.toJson() (PaymentAccountTypeAdapter?)
+ field.setValue(String.join(",", (List) value));
+ } else {
+ field.setValue((String) value);
+ }
form.getFields().add(field);
}
return form;
diff --git a/core/src/main/java/haveno/core/payment/PaymentAccountFactory.java b/core/src/main/java/haveno/core/payment/PaymentAccountFactory.java
index 64c8bdbc52..d2f6ab2bbc 100644
--- a/core/src/main/java/haveno/core/payment/PaymentAccountFactory.java
+++ b/core/src/main/java/haveno/core/payment/PaymentAccountFactory.java
@@ -136,6 +136,8 @@ public class PaymentAccountFactory {
return new CashAppAccount();
case PaymentMethod.VENMO_ID:
return new VenmoAccount();
+ case PaymentMethod.PAYSAFE_ID:
+ return new PaysafeAccount();
// Cannot be deleted as it would break old trade history entries
case PaymentMethod.OK_PAY_ID:
diff --git a/core/src/main/java/haveno/core/payment/PaymentAccountTypeAdapter.java b/core/src/main/java/haveno/core/payment/PaymentAccountTypeAdapter.java
index 0160a1a736..0226fe4530 100644
--- a/core/src/main/java/haveno/core/payment/PaymentAccountTypeAdapter.java
+++ b/core/src/main/java/haveno/core/payment/PaymentAccountTypeAdapter.java
@@ -24,7 +24,6 @@ import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import haveno.core.locale.Country;
import haveno.core.locale.CountryUtil;
-import haveno.core.locale.TraditionalCurrency;
import haveno.core.locale.Res;
import haveno.core.locale.TradeCurrency;
import haveno.core.payment.payload.PaymentAccountPayload;
@@ -42,7 +41,6 @@ import java.util.Map;
import java.util.Optional;
import java.util.function.Predicate;
-import static com.google.common.base.Preconditions.checkNotNull;
import static haveno.common.util.ReflectionUtils.getSetterMethodForFieldInClassHierarchy;
import static haveno.common.util.ReflectionUtils.getVisibilityModifierAsString;
import static haveno.common.util.ReflectionUtils.handleSetFieldValueError;
@@ -50,7 +48,6 @@ import static haveno.common.util.ReflectionUtils.isSetterOnClass;
import static haveno.common.util.ReflectionUtils.loadFieldListForClassHierarchy;
import static haveno.common.util.Utilities.decodeFromHex;
import static haveno.core.locale.CountryUtil.findCountryByCode;
-import static haveno.core.locale.CurrencyUtil.getCurrencyByCountryCode;
import static haveno.core.locale.CurrencyUtil.getTradeCurrenciesInList;
import static haveno.core.locale.CurrencyUtil.getTradeCurrency;
import static haveno.core.payment.payload.PaymentMethod.MONEY_GRAM_ID;
@@ -435,8 +432,10 @@ class PaymentAccountTypeAdapter extends TypeAdapter {
if (account.isCountryBasedPaymentAccount()) {
((CountryBasedPaymentAccount) account).setCountry(country.get());
- TraditionalCurrency fiatCurrency = getCurrencyByCountryCode(checkNotNull(countryCode));
- account.setSingleTradeCurrency(fiatCurrency);
+
+ // TODO: applying single trade currency default can overwrite provided currencies, apply elsewhere?
+ // TraditionalCurrency fiatCurrency = getCurrencyByCountryCode(checkNotNull(countryCode));
+ // account.setSingleTradeCurrency(fiatCurrency);
} else if (account.hasPaymentMethodWithId(MONEY_GRAM_ID)) {
((MoneyGramAccount) account).setCountry(country.get());
} else {
diff --git a/core/src/main/java/haveno/core/payment/PaymentAccountUtil.java b/core/src/main/java/haveno/core/payment/PaymentAccountUtil.java
index 4d7b4ad0c4..11575aeb62 100644
--- a/core/src/main/java/haveno/core/payment/PaymentAccountUtil.java
+++ b/core/src/main/java/haveno/core/payment/PaymentAccountUtil.java
@@ -124,7 +124,7 @@ public class PaymentAccountUtil {
AccountAgeWitnessService accountAgeWitnessService) {
boolean hasChargebackRisk = hasChargebackRisk(offer.getPaymentMethod(), offer.getCurrencyCode());
boolean hasValidAccountAgeWitness = accountAgeWitnessService.getMyTradeLimit(paymentAccount,
- offer.getCurrencyCode(), offer.getMirroredDirection()) >= offer.getMinAmount().longValueExact();
+ offer.getCurrencyCode(), offer.getMirroredDirection(), offer.hasBuyerAsTakerWithoutDeposit()) >= offer.getMinAmount().longValueExact();
return !hasChargebackRisk || hasValidAccountAgeWitness;
}
diff --git a/core/src/main/java/haveno/core/payment/PaysafeAccount.java b/core/src/main/java/haveno/core/payment/PaysafeAccount.java
new file mode 100644
index 0000000000..531aa998b6
--- /dev/null
+++ b/core/src/main/java/haveno/core/payment/PaysafeAccount.java
@@ -0,0 +1,112 @@
+/*
+ * This file is part of Haveno.
+ *
+ * Haveno 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.
+ *
+ * Haveno 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 Haveno. If not, see .
+ */
+
+package haveno.core.payment;
+
+import haveno.core.api.model.PaymentAccountFormField;
+import haveno.core.locale.TraditionalCurrency;
+import haveno.core.locale.TradeCurrency;
+import haveno.core.payment.payload.PaymentAccountPayload;
+import haveno.core.payment.payload.PaymentMethod;
+import haveno.core.payment.payload.PaysafeAccountPayload;
+import lombok.EqualsAndHashCode;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+public final class PaysafeAccount extends PaymentAccount {
+
+ private static final List INPUT_FIELD_IDS = List.of(
+ PaymentAccountFormField.FieldId.ACCOUNT_NAME,
+ PaymentAccountFormField.FieldId.EMAIL,
+ PaymentAccountFormField.FieldId.TRADE_CURRENCIES,
+ PaymentAccountFormField.FieldId.SALT
+ );
+
+ // https://developer.paysafe.com/en/support/reference-information/codes/
+ public static final List SUPPORTED_CURRENCIES = List.of(
+ new TraditionalCurrency("AED"),
+ new TraditionalCurrency("ARS"),
+ new TraditionalCurrency("AUD"),
+ new TraditionalCurrency("BGN"),
+ new TraditionalCurrency("BRL"),
+ new TraditionalCurrency("CAD"),
+ new TraditionalCurrency("CHF"),
+ new TraditionalCurrency("CZK"),
+ new TraditionalCurrency("DKK"),
+ new TraditionalCurrency("EGP"),
+ new TraditionalCurrency("EUR"),
+ new TraditionalCurrency("GBP"),
+ new TraditionalCurrency("GEL"),
+ new TraditionalCurrency("HUF"),
+ new TraditionalCurrency("ILS"),
+ new TraditionalCurrency("INR"),
+ new TraditionalCurrency("JPY"),
+ new TraditionalCurrency("ISK"),
+ new TraditionalCurrency("KWD"),
+ new TraditionalCurrency("KRW"),
+ new TraditionalCurrency("MXN"),
+ new TraditionalCurrency("NOK"),
+ new TraditionalCurrency("NZD"),
+ new TraditionalCurrency("PEN"),
+ new TraditionalCurrency("PHP"),
+ new TraditionalCurrency("PLN"),
+ new TraditionalCurrency("RON"),
+ new TraditionalCurrency("RSD"),
+ new TraditionalCurrency("RUB"),
+ new TraditionalCurrency("SAR"),
+ new TraditionalCurrency("SEK"),
+ new TraditionalCurrency("TRY"),
+ new TraditionalCurrency("USD"),
+ new TraditionalCurrency("UYU")
+ );
+
+ public PaysafeAccount() {
+ super(PaymentMethod.PAYSAFE);
+ }
+
+ @Override
+ protected PaymentAccountPayload createPayload() {
+ return new PaysafeAccountPayload(paymentMethod.getId(), id);
+ }
+
+ @Override
+ public @NotNull List getSupportedCurrencies() {
+ return SUPPORTED_CURRENCIES;
+ }
+
+ @Override
+ public @NotNull List getInputFieldIds() {
+ return INPUT_FIELD_IDS;
+ }
+
+ public void setEmail(String accountId) {
+ ((PaysafeAccountPayload) paymentAccountPayload).setEmail(accountId);
+ }
+
+ public String getEmail() {
+ return ((PaysafeAccountPayload) paymentAccountPayload).getEmail();
+ }
+
+ @Override
+ protected PaymentAccountFormField getEmptyFormField(PaymentAccountFormField.FieldId fieldId) {
+ var field = super.getEmptyFormField(fieldId);
+ if (field.getId() == PaymentAccountFormField.FieldId.TRADE_CURRENCIES) field.setValue("");
+ return field;
+ }
+}
diff --git a/core/src/main/java/haveno/core/payment/TradeLimits.java b/core/src/main/java/haveno/core/payment/TradeLimits.java
index e2de303ed5..a33ce57ca4 100644
--- a/core/src/main/java/haveno/core/payment/TradeLimits.java
+++ b/core/src/main/java/haveno/core/payment/TradeLimits.java
@@ -30,7 +30,9 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
@Singleton
public class TradeLimits {
- private static final BigInteger MAX_TRADE_LIMIT = HavenoUtils.xmrToAtomicUnits(96.0); // max trade limit for lowest risk payment method. Others will get derived from that.
+ private static final BigInteger MAX_TRADE_LIMIT = HavenoUtils.xmrToAtomicUnits(528); // max trade limit for lowest risk payment method. Others will get derived from that.
+ private static final BigInteger MAX_TRADE_LIMIT_WITHOUT_BUYER_AS_TAKER_DEPOSIT = HavenoUtils.xmrToAtomicUnits(1.5); // max trade limit without deposit from buyer
+
@Nullable
@Getter
private static TradeLimits INSTANCE;
@@ -57,6 +59,15 @@ public class TradeLimits {
return MAX_TRADE_LIMIT;
}
+ /**
+ * The maximum trade limit without a buyer deposit.
+ *
+ * @return the maximum trade limit for a buyer without a deposit
+ */
+ public BigInteger getMaxTradeLimitBuyerAsTakerWithoutDeposit() {
+ return MAX_TRADE_LIMIT_WITHOUT_BUYER_AS_TAKER_DEPOSIT;
+ }
+
// We possibly rounded value for the first month gets multiplied by 4 to get the trade limit after the account
// age witness is not considered anymore (> 2 months).
diff --git a/core/src/main/java/haveno/core/payment/WeChatPayAccount.java b/core/src/main/java/haveno/core/payment/WeChatPayAccount.java
index e7099879ea..297968ef0c 100644
--- a/core/src/main/java/haveno/core/payment/WeChatPayAccount.java
+++ b/core/src/main/java/haveno/core/payment/WeChatPayAccount.java
@@ -31,11 +31,15 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true)
public final class WeChatPayAccount extends PaymentAccount {
- public static final List SUPPORTED_CURRENCIES = List.of(new TraditionalCurrency("CNY"));
+ public static final List SUPPORTED_CURRENCIES = List.of(
+ new TraditionalCurrency("CNY"),
+ new TraditionalCurrency("USD"),
+ new TraditionalCurrency("EUR"),
+ new TraditionalCurrency("GBP")
+ );
public WeChatPayAccount() {
super(PaymentMethod.WECHAT_PAY);
- setSingleTradeCurrency(SUPPORTED_CURRENCIES.get(0));
}
@Override
diff --git a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java
index cf75df3652..4a8246fe78 100644
--- a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java
+++ b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java
@@ -51,6 +51,7 @@ import haveno.core.payment.CashAppAccount;
import haveno.core.payment.CashAtAtmAccount;
import haveno.core.payment.PayByMailAccount;
import haveno.core.payment.PayPalAccount;
+import haveno.core.payment.PaysafeAccount;
import haveno.core.payment.CashDepositAccount;
import haveno.core.payment.CelPayAccount;
import haveno.core.payment.ZelleAccount;
@@ -124,13 +125,8 @@ public final class PaymentMethod implements PersistablePayload, Comparable paymentMethodIds.contains(paymentMethod.getId())).collect(Collectors.toList());
}
@@ -497,17 +497,21 @@ public final class PaymentMethod implements PersistablePayload, Comparable.
+ */
+
+package haveno.core.payment.payload;
+
+import com.google.protobuf.Message;
+import haveno.core.locale.Res;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@ToString
+@Setter
+@Getter
+@Slf4j
+public final class PaysafeAccountPayload extends PaymentAccountPayload {
+ private String email = "";
+
+ public PaysafeAccountPayload(String paymentMethod, String id) {
+ super(paymentMethod, id);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // PROTO BUFFER
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ private PaysafeAccountPayload(String paymentMethod,
+ String id,
+ String email,
+ long maxTradePeriod,
+ Map excludeFromJsonDataMap) {
+ super(paymentMethod,
+ id,
+ maxTradePeriod,
+ excludeFromJsonDataMap);
+
+ this.email = email;
+ }
+
+ @Override
+ public Message toProtoMessage() {
+ return getPaymentAccountPayloadBuilder()
+ .setPaysafeAccountPayload(protobuf.PaysafeAccountPayload.newBuilder().setEmail(email))
+ .build();
+ }
+
+ public static PaysafeAccountPayload fromProto(protobuf.PaymentAccountPayload proto) {
+ return new PaysafeAccountPayload(proto.getPaymentMethodId(),
+ proto.getId(),
+ proto.getPaysafeAccountPayload().getEmail(),
+ proto.getMaxTradePeriod(),
+ new HashMap<>(proto.getExcludeFromJsonDataMap()));
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // API
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ @Override
+ public String getPaymentDetails() {
+ return Res.get(paymentMethodId) + " - " + Res.getWithCol("payment.email") + " " + email;
+ }
+
+ @Override
+ public String getPaymentDetailsForTradePopup() {
+ return getPaymentDetails();
+ }
+
+ @Override
+ public byte[] getAgeWitnessInputData() {
+ return super.getAgeWitnessInputData(email.getBytes(StandardCharsets.UTF_8));
+ }
+}
diff --git a/core/src/main/java/haveno/core/payment/validation/SecurityDepositValidator.java b/core/src/main/java/haveno/core/payment/validation/SecurityDepositValidator.java
index 7bf873ce4f..4545a4e210 100644
--- a/core/src/main/java/haveno/core/payment/validation/SecurityDepositValidator.java
+++ b/core/src/main/java/haveno/core/payment/validation/SecurityDepositValidator.java
@@ -59,7 +59,7 @@ public class SecurityDepositValidator extends NumberValidator {
private ValidationResult validateIfNotTooLowPercentageValue(String input) {
try {
double percentage = ParsingUtils.parsePercentStringToDouble(input);
- double minPercentage = Restrictions.getMinBuyerSecurityDepositAsPercent();
+ double minPercentage = Restrictions.getMinSecurityDepositAsPercent();
if (percentage < minPercentage)
return new ValidationResult(false,
Res.get("validation.inputTooSmall", FormattingUtils.formatToPercentWithSymbol(minPercentage)));
@@ -73,7 +73,7 @@ public class SecurityDepositValidator extends NumberValidator {
private ValidationResult validateIfNotTooHighPercentageValue(String input) {
try {
double percentage = ParsingUtils.parsePercentStringToDouble(input);
- double maxPercentage = Restrictions.getMaxBuyerSecurityDepositAsPercent();
+ double maxPercentage = Restrictions.getMaxSecurityDepositAsPercent();
if (percentage > maxPercentage)
return new ValidationResult(false,
Res.get("validation.inputTooLarge", FormattingUtils.formatToPercentWithSymbol(maxPercentage)));
diff --git a/core/src/main/java/haveno/core/proto/CoreProtoResolver.java b/core/src/main/java/haveno/core/proto/CoreProtoResolver.java
index 504d59dc58..f7f8298308 100644
--- a/core/src/main/java/haveno/core/proto/CoreProtoResolver.java
+++ b/core/src/main/java/haveno/core/proto/CoreProtoResolver.java
@@ -54,6 +54,7 @@ import haveno.core.payment.payload.NequiAccountPayload;
import haveno.core.payment.payload.OKPayAccountPayload;
import haveno.core.payment.payload.PaxumAccountPayload;
import haveno.core.payment.payload.PaymentAccountPayload;
+import haveno.core.payment.payload.PaysafeAccountPayload;
import haveno.core.payment.payload.PayPalAccountPayload;
import haveno.core.payment.payload.PayseraAccountPayload;
import haveno.core.payment.payload.PaytmAccountPayload;
@@ -239,6 +240,8 @@ public class CoreProtoResolver implements ProtoResolver {
return VenmoAccountPayload.fromProto(proto);
case PAYPAL_ACCOUNT_PAYLOAD:
return PayPalAccountPayload.fromProto(proto);
+ case PAYSAFE_ACCOUNT_PAYLOAD:
+ return PaysafeAccountPayload.fromProto(proto);
default:
throw new ProtobufferRuntimeException("Unknown proto message case(PB.PaymentAccountPayload). messageCase=" + messageCase);
diff --git a/core/src/main/java/haveno/core/support/dispute/DisputeManager.java b/core/src/main/java/haveno/core/support/dispute/DisputeManager.java
index d6b2469744..64de6b3f2d 100644
--- a/core/src/main/java/haveno/core/support/dispute/DisputeManager.java
+++ b/core/src/main/java/haveno/core/support/dispute/DisputeManager.java
@@ -537,15 +537,21 @@ public abstract class DisputeManager> extends Sup
throw e;
}
- // try to validate payment account
+ // try to validate payment accounts
try {
- DisputeValidation.validatePaymentAccountPayload(dispute); // TODO: add field to dispute details: valid, invalid, missing
+ DisputeValidation.validatePaymentAccountPayloads(dispute); // TODO: add field to dispute details: valid, invalid, missing
} catch (Exception e) {
log.error(ExceptionUtils.getStackTrace(e));
trade.prependErrorMessage(e.getMessage());
throw e;
}
+ // set arbitrator's payment account payloads
+ if (trade.isArbitrator()) {
+ if (trade.getBuyer().getPaymentAccountPayload() == null) trade.getBuyer().setPaymentAccountPayload(dispute.getBuyerPaymentAccountPayload());
+ if (trade.getSeller().getPaymentAccountPayload() == null) trade.getSeller().setPaymentAccountPayload(dispute.getSellerPaymentAccountPayload());
+ }
+
// get sender
TradePeer sender;
if (reOpen) { // re-open can come from either peer
diff --git a/core/src/main/java/haveno/core/support/dispute/DisputeValidation.java b/core/src/main/java/haveno/core/support/dispute/DisputeValidation.java
index 4591a6fbc2..0905af4a1d 100644
--- a/core/src/main/java/haveno/core/support/dispute/DisputeValidation.java
+++ b/core/src/main/java/haveno/core/support/dispute/DisputeValidation.java
@@ -41,9 +41,12 @@ import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
public class DisputeValidation {
- public static void validatePaymentAccountPayload(Dispute dispute) throws ValidationException {
+ public static void validatePaymentAccountPayloads(Dispute dispute) throws ValidationException {
if (dispute.getSellerPaymentAccountPayload() == null) throw new ValidationException(dispute, "Seller's payment account payload is null in dispute opened for trade " + dispute.getTradeId());
- if (!Arrays.equals(dispute.getSellerPaymentAccountPayload().getHash(), dispute.getContract().getSellerPaymentAccountPayloadHash())) throw new ValidationException(dispute, "Hash of maker's payment account payload does not match contract");
+ if (!Arrays.equals(dispute.getSellerPaymentAccountPayload().getHash(), dispute.getContract().getSellerPaymentAccountPayloadHash())) throw new ValidationException(dispute, "Hash of seller's payment account payload does not match contract");
+ if (dispute.getBuyerPaymentAccountPayload() != null) {
+ if (!Arrays.equals(dispute.getBuyerPaymentAccountPayload().getHash(), dispute.getContract().getBuyerPaymentAccountPayloadHash())) throw new ValidationException(dispute, "Hash of buyer's payment account payload does not match contract");
+ }
}
public static void validateDisputeData(Dispute dispute) throws ValidationException {
diff --git a/core/src/main/java/haveno/core/trade/ArbitratorTrade.java b/core/src/main/java/haveno/core/trade/ArbitratorTrade.java
index 93f03dece5..ea179a655a 100644
--- a/core/src/main/java/haveno/core/trade/ArbitratorTrade.java
+++ b/core/src/main/java/haveno/core/trade/ArbitratorTrade.java
@@ -28,6 +28,8 @@ import lombok.extern.slf4j.Slf4j;
import java.math.BigInteger;
import java.util.UUID;
+import javax.annotation.Nullable;
+
/**
* Trade in the context of an arbitrator.
*/
@@ -42,8 +44,9 @@ public class ArbitratorTrade extends Trade {
String uid,
NodeAddress makerNodeAddress,
NodeAddress takerNodeAddress,
- NodeAddress arbitratorNodeAddress) {
- super(offer, tradeAmount, tradePrice, xmrWalletService, processModel, uid, makerNodeAddress, takerNodeAddress, arbitratorNodeAddress);
+ NodeAddress arbitratorNodeAddress,
+ @Nullable String challenge) {
+ super(offer, tradeAmount, tradePrice, xmrWalletService, processModel, uid, makerNodeAddress, takerNodeAddress, arbitratorNodeAddress, challenge);
}
@Override
@@ -81,7 +84,8 @@ public class ArbitratorTrade extends Trade {
uid,
proto.getProcessModel().getMaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getMaker().getNodeAddress()) : null,
proto.getProcessModel().getTaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getTaker().getNodeAddress()) : null,
- proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null),
+ proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null,
+ ProtoUtil.stringOrNullFromProto(proto.getChallenge())),
proto,
coreProtoResolver);
}
diff --git a/core/src/main/java/haveno/core/trade/BuyerAsMakerTrade.java b/core/src/main/java/haveno/core/trade/BuyerAsMakerTrade.java
index 99fad94ebe..ca38f1ca06 100644
--- a/core/src/main/java/haveno/core/trade/BuyerAsMakerTrade.java
+++ b/core/src/main/java/haveno/core/trade/BuyerAsMakerTrade.java
@@ -28,6 +28,8 @@ import lombok.extern.slf4j.Slf4j;
import java.math.BigInteger;
import java.util.UUID;
+import javax.annotation.Nullable;
+
@Slf4j
public final class BuyerAsMakerTrade extends BuyerTrade implements MakerTrade {
@@ -43,7 +45,8 @@ public final class BuyerAsMakerTrade extends BuyerTrade implements MakerTrade {
String uid,
NodeAddress makerNodeAddress,
NodeAddress takerNodeAddress,
- NodeAddress arbitratorNodeAddress) {
+ NodeAddress arbitratorNodeAddress,
+ @Nullable String challenge) {
super(offer,
tradeAmount,
tradePrice,
@@ -52,7 +55,8 @@ public final class BuyerAsMakerTrade extends BuyerTrade implements MakerTrade {
uid,
makerNodeAddress,
takerNodeAddress,
- arbitratorNodeAddress);
+ arbitratorNodeAddress,
+ challenge);
}
///////////////////////////////////////////////////////////////////////////////////////////
@@ -85,7 +89,8 @@ public final class BuyerAsMakerTrade extends BuyerTrade implements MakerTrade {
uid,
proto.getProcessModel().getMaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getMaker().getNodeAddress()) : null,
proto.getProcessModel().getTaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getTaker().getNodeAddress()) : null,
- proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null);
+ proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null,
+ ProtoUtil.stringOrNullFromProto(proto.getChallenge()));
trade.setPrice(proto.getPrice());
diff --git a/core/src/main/java/haveno/core/trade/BuyerAsTakerTrade.java b/core/src/main/java/haveno/core/trade/BuyerAsTakerTrade.java
index 1cb7b20d47..2b9501919c 100644
--- a/core/src/main/java/haveno/core/trade/BuyerAsTakerTrade.java
+++ b/core/src/main/java/haveno/core/trade/BuyerAsTakerTrade.java
@@ -44,7 +44,8 @@ public final class BuyerAsTakerTrade extends BuyerTrade implements TakerTrade {
String uid,
@Nullable NodeAddress makerNodeAddress,
@Nullable NodeAddress takerNodeAddress,
- @Nullable NodeAddress arbitratorNodeAddress) {
+ @Nullable NodeAddress arbitratorNodeAddress,
+ @Nullable String challenge) {
super(offer,
tradeAmount,
tradePrice,
@@ -53,7 +54,8 @@ public final class BuyerAsTakerTrade extends BuyerTrade implements TakerTrade {
uid,
makerNodeAddress,
takerNodeAddress,
- arbitratorNodeAddress);
+ arbitratorNodeAddress,
+ challenge);
}
@@ -87,7 +89,8 @@ public final class BuyerAsTakerTrade extends BuyerTrade implements TakerTrade {
uid,
proto.getProcessModel().getMaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getMaker().getNodeAddress()) : null,
proto.getProcessModel().getTaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getTaker().getNodeAddress()) : null,
- proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null),
+ proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null,
+ ProtoUtil.stringOrNullFromProto(proto.getChallenge())),
proto,
coreProtoResolver);
}
diff --git a/core/src/main/java/haveno/core/trade/BuyerTrade.java b/core/src/main/java/haveno/core/trade/BuyerTrade.java
index dbf73db101..9de8f1e03f 100644
--- a/core/src/main/java/haveno/core/trade/BuyerTrade.java
+++ b/core/src/main/java/haveno/core/trade/BuyerTrade.java
@@ -38,7 +38,8 @@ public abstract class BuyerTrade extends Trade {
String uid,
@Nullable NodeAddress takerNodeAddress,
@Nullable NodeAddress makerNodeAddress,
- @Nullable NodeAddress arbitratorNodeAddress) {
+ @Nullable NodeAddress arbitratorNodeAddress,
+ @Nullable String challenge) {
super(offer,
tradeAmount,
tradePrice,
@@ -47,7 +48,8 @@ public abstract class BuyerTrade extends Trade {
uid,
takerNodeAddress,
makerNodeAddress,
- arbitratorNodeAddress);
+ arbitratorNodeAddress,
+ challenge);
}
@Override
diff --git a/core/src/main/java/haveno/core/trade/Contract.java b/core/src/main/java/haveno/core/trade/Contract.java
index b0950c552f..9a88eaff56 100644
--- a/core/src/main/java/haveno/core/trade/Contract.java
+++ b/core/src/main/java/haveno/core/trade/Contract.java
@@ -36,6 +36,7 @@ package haveno.core.trade;
import com.google.protobuf.ByteString;
import haveno.common.crypto.PubKeyRing;
+import haveno.common.proto.ProtoUtil;
import haveno.common.proto.network.NetworkPayload;
import haveno.common.util.JsonExclude;
import haveno.common.util.Utilities;
@@ -53,6 +54,7 @@ import org.apache.commons.lang3.StringUtils;
import javax.annotation.Nullable;
import java.math.BigInteger;
+import java.util.Optional;
import static com.google.common.base.Preconditions.checkArgument;
@@ -79,6 +81,7 @@ public final class Contract implements NetworkPayload {
private final String makerPayoutAddressString;
private final String takerPayoutAddressString;
private final String makerDepositTxHash;
+ @Nullable
private final String takerDepositTxHash;
public Contract(OfferPayload offerPayload,
@@ -99,7 +102,7 @@ public final class Contract implements NetworkPayload {
String makerPayoutAddressString,
String takerPayoutAddressString,
String makerDepositTxHash,
- String takerDepositTxHash) {
+ @Nullable String takerDepositTxHash) {
this.offerPayload = offerPayload;
this.tradeAmount = tradeAmount;
this.tradePrice = tradePrice;
@@ -134,6 +137,31 @@ public final class Contract implements NetworkPayload {
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
+ @Override
+ public protobuf.Contract toProtoMessage() {
+ protobuf.Contract.Builder builder = protobuf.Contract.newBuilder()
+ .setOfferPayload(offerPayload.toProtoMessage().getOfferPayload())
+ .setTradeAmount(tradeAmount)
+ .setTradePrice(tradePrice)
+ .setBuyerNodeAddress(buyerNodeAddress.toProtoMessage())
+ .setSellerNodeAddress(sellerNodeAddress.toProtoMessage())
+ .setArbitratorNodeAddress(arbitratorNodeAddress.toProtoMessage())
+ .setIsBuyerMakerAndSellerTaker(isBuyerMakerAndSellerTaker)
+ .setMakerAccountId(makerAccountId)
+ .setTakerAccountId(takerAccountId)
+ .setMakerPaymentMethodId(makerPaymentMethodId)
+ .setTakerPaymentMethodId(takerPaymentMethodId)
+ .setMakerPaymentAccountPayloadHash(ByteString.copyFrom(makerPaymentAccountPayloadHash))
+ .setTakerPaymentAccountPayloadHash(ByteString.copyFrom(takerPaymentAccountPayloadHash))
+ .setMakerPubKeyRing(makerPubKeyRing.toProtoMessage())
+ .setTakerPubKeyRing(takerPubKeyRing.toProtoMessage())
+ .setMakerPayoutAddressString(makerPayoutAddressString)
+ .setTakerPayoutAddressString(takerPayoutAddressString)
+ .setMakerDepositTxHash(makerDepositTxHash);
+ Optional.ofNullable(takerDepositTxHash).ifPresent(builder::setTakerDepositTxHash);
+ return builder.build();
+ }
+
public static Contract fromProto(protobuf.Contract proto, CoreProtoResolver coreProtoResolver) {
return new Contract(OfferPayload.fromProto(proto.getOfferPayload()),
proto.getTradeAmount(),
@@ -153,32 +181,7 @@ public final class Contract implements NetworkPayload {
proto.getMakerPayoutAddressString(),
proto.getTakerPayoutAddressString(),
proto.getMakerDepositTxHash(),
- proto.getTakerDepositTxHash());
- }
-
- @Override
- public protobuf.Contract toProtoMessage() {
- return protobuf.Contract.newBuilder()
- .setOfferPayload(offerPayload.toProtoMessage().getOfferPayload())
- .setTradeAmount(tradeAmount)
- .setTradePrice(tradePrice)
- .setBuyerNodeAddress(buyerNodeAddress.toProtoMessage())
- .setSellerNodeAddress(sellerNodeAddress.toProtoMessage())
- .setArbitratorNodeAddress(arbitratorNodeAddress.toProtoMessage())
- .setIsBuyerMakerAndSellerTaker(isBuyerMakerAndSellerTaker)
- .setMakerAccountId(makerAccountId)
- .setTakerAccountId(takerAccountId)
- .setMakerPaymentMethodId(makerPaymentMethodId)
- .setTakerPaymentMethodId(takerPaymentMethodId)
- .setMakerPaymentAccountPayloadHash(ByteString.copyFrom(makerPaymentAccountPayloadHash))
- .setTakerPaymentAccountPayloadHash(ByteString.copyFrom(takerPaymentAccountPayloadHash))
- .setMakerPubKeyRing(makerPubKeyRing.toProtoMessage())
- .setTakerPubKeyRing(takerPubKeyRing.toProtoMessage())
- .setMakerPayoutAddressString(makerPayoutAddressString)
- .setTakerPayoutAddressString(takerPayoutAddressString)
- .setMakerDepositTxHash(makerDepositTxHash)
- .setTakerDepositTxHash(takerDepositTxHash)
- .build();
+ ProtoUtil.stringOrNullFromProto(proto.getTakerDepositTxHash()));
}
diff --git a/core/src/main/java/haveno/core/trade/HavenoUtils.java b/core/src/main/java/haveno/core/trade/HavenoUtils.java
index 06133e1689..d238d78843 100644
--- a/core/src/main/java/haveno/core/trade/HavenoUtils.java
+++ b/core/src/main/java/haveno/core/trade/HavenoUtils.java
@@ -28,6 +28,7 @@ import haveno.common.crypto.KeyRing;
import haveno.common.crypto.PubKeyRing;
import haveno.common.crypto.Sig;
import haveno.common.file.FileUtil;
+import haveno.common.util.Base64;
import haveno.common.util.Utilities;
import haveno.core.api.CoreNotificationService;
import haveno.core.api.XmrConnectionService;
@@ -48,7 +49,10 @@ import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
import java.security.PrivateKey;
+import java.security.SecureRandom;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
@@ -67,6 +71,7 @@ import javax.sound.sampled.SourceDataLine;
import lombok.extern.slf4j.Slf4j;
import monero.common.MoneroRpcConnection;
+import monero.common.MoneroUtils;
import monero.daemon.model.MoneroOutput;
import monero.wallet.model.MoneroDestination;
import monero.wallet.model.MoneroTxWallet;
@@ -87,13 +92,15 @@ public class HavenoUtils {
// configure fees
public static final boolean ARBITRATOR_ASSIGNS_TRADE_FEE_ADDRESS = true;
+ public static final double PENALTY_FEE_PCT = 0.02; // 2%
public static final double MAKER_FEE_PCT = 0.0015; // 0.15%
public static final double TAKER_FEE_PCT = 0.0075; // 0.75%
- public static final double PENALTY_FEE_PCT = 0.02; // 2%
+ public static final double MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT = MAKER_FEE_PCT + TAKER_FEE_PCT; // customize maker's fee when no deposit or fee from taker
// other configuration
public static final long LOG_POLL_ERROR_PERIOD_MS = 1000 * 60 * 4; // log poll errors up to once every 4 minutes
public static final long LOG_DAEMON_NOT_SYNCED_WARN_PERIOD_MS = 1000 * 30; // log warnings when daemon not synced once every 30s
+ public static final int PRIVATE_OFFER_PASSPHRASE_NUM_WORDS = 8; // number of words in a private offer passphrase
// synchronize requests to the daemon
private static boolean SYNC_DAEMON_REQUESTS = false; // sync long requests to daemon (e.g. refresh, update pool) // TODO: performance suffers by syncing daemon requests, but otherwise we sometimes get sporadic errors?
@@ -198,11 +205,11 @@ public class HavenoUtils {
}
public static double atomicUnitsToXmr(BigInteger atomicUnits) {
- return new BigDecimal(atomicUnits).divide(new BigDecimal(XMR_AU_MULTIPLIER)).doubleValue();
+ return MoneroUtils.atomicUnitsToXmr(atomicUnits);
}
public static BigInteger xmrToAtomicUnits(double xmr) {
- return new BigDecimal(xmr).multiply(new BigDecimal(XMR_AU_MULTIPLIER)).toBigInteger();
+ return MoneroUtils.xmrToAtomicUnits(xmr);
}
public static long xmrToCentineros(double xmr) {
@@ -214,11 +221,11 @@ public class HavenoUtils {
}
public static double divide(BigInteger auDividend, BigInteger auDivisor) {
- return atomicUnitsToXmr(auDividend) / atomicUnitsToXmr(auDivisor);
+ return MoneroUtils.divide(auDividend, auDivisor);
}
public static BigInteger multiply(BigInteger amount1, double amount2) {
- return amount1 == null ? null : new BigDecimal(amount1).multiply(BigDecimal.valueOf(amount2)).toBigInteger();
+ return MoneroUtils.multiply(amount1, amount2);
}
// ------------------------- FORMAT UTILS ---------------------------------
@@ -286,6 +293,41 @@ public class HavenoUtils {
// ------------------------ SIGNING AND VERIFYING -------------------------
+ public static String generateChallenge() {
+ try {
+
+ // load bip39 words
+ String fileName = "bip39_english.txt";
+ File bip39File = new File(havenoSetup.getConfig().appDataDir, fileName);
+ if (!bip39File.exists()) FileUtil.resourceToFile(fileName, bip39File);
+ List bip39Words = Files.readAllLines(bip39File.toPath(), StandardCharsets.UTF_8);
+
+ // select words randomly
+ List passphraseWords = new ArrayList();
+ SecureRandom secureRandom = new SecureRandom();
+ for (int i = 0; i < PRIVATE_OFFER_PASSPHRASE_NUM_WORDS; i++) {
+ passphraseWords.add(bip39Words.get(secureRandom.nextInt(bip39Words.size())));
+ }
+ return String.join(" ", passphraseWords);
+ } catch (Exception e) {
+ throw new IllegalStateException("Failed to generate challenge", e);
+ }
+ }
+
+ public static String getChallengeHash(String challenge) {
+ if (challenge == null) return null;
+
+ // tokenize passphrase
+ String[] words = challenge.toLowerCase().split(" ");
+
+ // collect first 4 letters of each word, which are unique in bip39
+ List prefixes = new ArrayList();
+ for (String word : words) prefixes.add(word.substring(0, Math.min(word.length(), 4)));
+
+ // hash the result
+ return Base64.encode(Hash.getSha256Hash(String.join(" ", prefixes).getBytes()));
+ }
+
public static byte[] sign(KeyRing keyRing, String message) {
return sign(keyRing.getSignatureKeyPair().getPrivate(), message);
}
diff --git a/core/src/main/java/haveno/core/trade/SellerAsMakerTrade.java b/core/src/main/java/haveno/core/trade/SellerAsMakerTrade.java
index c31c325342..07f4a16157 100644
--- a/core/src/main/java/haveno/core/trade/SellerAsMakerTrade.java
+++ b/core/src/main/java/haveno/core/trade/SellerAsMakerTrade.java
@@ -44,7 +44,8 @@ public final class SellerAsMakerTrade extends SellerTrade implements MakerTrade
String uid,
@Nullable NodeAddress makerNodeAddress,
@Nullable NodeAddress takerNodeAddress,
- @Nullable NodeAddress arbitratorNodeAddress) {
+ @Nullable NodeAddress arbitratorNodeAddress,
+ @Nullable String challenge) {
super(offer,
tradeAmount,
tradePrice,
@@ -53,7 +54,8 @@ public final class SellerAsMakerTrade extends SellerTrade implements MakerTrade
uid,
makerNodeAddress,
takerNodeAddress,
- arbitratorNodeAddress);
+ arbitratorNodeAddress,
+ challenge);
}
@@ -87,7 +89,8 @@ public final class SellerAsMakerTrade extends SellerTrade implements MakerTrade
uid,
proto.getProcessModel().getMaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getMaker().getNodeAddress()) : null,
proto.getProcessModel().getTaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getTaker().getNodeAddress()) : null,
- proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null);
+ proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null,
+ ProtoUtil.stringOrNullFromProto(proto.getChallenge()));
trade.setPrice(proto.getPrice());
diff --git a/core/src/main/java/haveno/core/trade/SellerAsTakerTrade.java b/core/src/main/java/haveno/core/trade/SellerAsTakerTrade.java
index afca9346d1..4b5e594a1e 100644
--- a/core/src/main/java/haveno/core/trade/SellerAsTakerTrade.java
+++ b/core/src/main/java/haveno/core/trade/SellerAsTakerTrade.java
@@ -44,7 +44,8 @@ public final class SellerAsTakerTrade extends SellerTrade implements TakerTrade
String uid,
@Nullable NodeAddress makerNodeAddress,
@Nullable NodeAddress takerNodeAddress,
- @Nullable NodeAddress arbitratorNodeAddress) {
+ @Nullable NodeAddress arbitratorNodeAddress,
+ @Nullable String challenge) {
super(offer,
tradeAmount,
tradePrice,
@@ -53,7 +54,8 @@ public final class SellerAsTakerTrade extends SellerTrade implements TakerTrade
uid,
makerNodeAddress,
takerNodeAddress,
- arbitratorNodeAddress);
+ arbitratorNodeAddress,
+ challenge);
}
@@ -87,7 +89,8 @@ public final class SellerAsTakerTrade extends SellerTrade implements TakerTrade
uid,
proto.getProcessModel().getMaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getMaker().getNodeAddress()) : null,
proto.getProcessModel().getTaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getTaker().getNodeAddress()) : null,
- proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null),
+ proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null,
+ ProtoUtil.stringOrNullFromProto(proto.getChallenge())),
proto,
coreProtoResolver);
}
diff --git a/core/src/main/java/haveno/core/trade/SellerTrade.java b/core/src/main/java/haveno/core/trade/SellerTrade.java
index 457ea10aed..fae3cce7a1 100644
--- a/core/src/main/java/haveno/core/trade/SellerTrade.java
+++ b/core/src/main/java/haveno/core/trade/SellerTrade.java
@@ -36,7 +36,8 @@ public abstract class SellerTrade extends Trade {
String uid,
@Nullable NodeAddress makerNodeAddress,
@Nullable NodeAddress takerNodeAddress,
- @Nullable NodeAddress arbitratorNodeAddress) {
+ @Nullable NodeAddress arbitratorNodeAddress,
+ @Nullable String challenge) {
super(offer,
tradeAmount,
tradePrice,
@@ -45,7 +46,8 @@ public abstract class SellerTrade extends Trade {
uid,
makerNodeAddress,
takerNodeAddress,
- arbitratorNodeAddress);
+ arbitratorNodeAddress,
+ challenge);
}
@Override
diff --git a/core/src/main/java/haveno/core/trade/Trade.java b/core/src/main/java/haveno/core/trade/Trade.java
index b540351179..6ad8e7aef3 100644
--- a/core/src/main/java/haveno/core/trade/Trade.java
+++ b/core/src/main/java/haveno/core/trade/Trade.java
@@ -486,6 +486,8 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
private IdlePayoutSyncer idlePayoutSyncer;
@Getter
private boolean isCompleted;
+ @Getter
+ private final String challenge;
///////////////////////////////////////////////////////////////////////////////////////////
// Constructors
@@ -500,7 +502,8 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
String uid,
@Nullable NodeAddress makerNodeAddress,
@Nullable NodeAddress takerNodeAddress,
- @Nullable NodeAddress arbitratorNodeAddress) {
+ @Nullable NodeAddress arbitratorNodeAddress,
+ @Nullable String challenge) {
super();
this.offer = offer;
this.amount = tradeAmount.longValueExact();
@@ -511,6 +514,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
this.uid = uid;
this.takeOfferDate = new Date().getTime();
this.tradeListeners = new ArrayList();
+ this.challenge = challenge;
getMaker().setNodeAddress(makerNodeAddress);
getTaker().setNodeAddress(takerNodeAddress);
@@ -534,7 +538,8 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
String uid,
@Nullable NodeAddress makerNodeAddress,
@Nullable NodeAddress takerNodeAddress,
- @Nullable NodeAddress arbitratorNodeAddress) {
+ @Nullable NodeAddress arbitratorNodeAddress,
+ @Nullable String challenge) {
this(offer,
tradeAmount,
@@ -544,7 +549,8 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
uid,
makerNodeAddress,
takerNodeAddress,
- arbitratorNodeAddress);
+ arbitratorNodeAddress,
+ challenge);
}
// TODO: remove these constructors
@@ -559,7 +565,8 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
NodeAddress arbitratorNodeAddress,
XmrWalletService xmrWalletService,
ProcessModel processModel,
- String uid) {
+ String uid,
+ @Nullable String challenge) {
this(offer,
tradeAmount,
@@ -569,7 +576,8 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
uid,
makerNodeAddress,
takerNodeAddress,
- arbitratorNodeAddress);
+ arbitratorNodeAddress,
+ challenge);
setAmount(tradeAmount);
}
@@ -649,6 +657,8 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
ThreadUtils.submitToPool(() -> {
if (newValue == Trade.Phase.DEPOSIT_REQUESTED) startPolling();
if (newValue == Trade.Phase.DEPOSITS_PUBLISHED) onDepositsPublished();
+ if (newValue == Trade.Phase.DEPOSITS_CONFIRMED) onDepositsConfirmed();
+ if (newValue == Trade.Phase.DEPOSITS_UNLOCKED) onDepositsUnlocked();
if (newValue == Trade.Phase.PAYMENT_SENT) onPaymentSent();
if (isDepositsPublished() && !isPayoutUnlocked()) updatePollPeriod();
if (isPaymentReceived()) {
@@ -722,7 +732,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
xmrWalletService.addWalletListener(idlePayoutSyncer);
}
- // TODO: buyer's payment sent message state property can become unsynced (after improper shut down?)
+ // TODO: buyer's payment sent message state property became unsynced if shut down while awaiting ack from seller. fixed in v1.0.19 so this check can be removed?
if (isBuyer()) {
MessageState expectedState = getPaymentSentMessageState();
if (expectedState != null && expectedState != processModel.getPaymentSentMessageStateProperty().get()) {
@@ -842,14 +852,6 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
}
}
- public boolean requestSwitchToNextBestConnection(MoneroRpcConnection sourceConnection) {
- if (xmrConnectionService.requestSwitchToNextBestConnection(sourceConnection)) {
- onConnectionChanged(xmrConnectionService.getConnection()); // change connection on same thread
- return true;
- }
- return false;
- }
-
public boolean isIdling() {
return this instanceof ArbitratorTrade && isDepositsConfirmed() && walletExists() && pollNormalStartTimeMs == null; // arbitrator idles trade after deposits confirm unless overriden
}
@@ -899,6 +901,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
}
}
+ @Override
public void requestSaveWallet() {
// save wallet off main thread
@@ -909,6 +912,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
}, getId());
}
+ @Override
public void saveWallet() {
synchronized (walletLock) {
if (!walletExists()) {
@@ -1233,7 +1237,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
Preconditions.checkNotNull(sellerPayoutAddress, "Seller payout address must not be null");
Preconditions.checkNotNull(buyerPayoutAddress, "Buyer payout address must not be null");
BigInteger sellerDepositAmount = getSeller().getDepositTx().getIncomingAmount();
- BigInteger buyerDepositAmount = getBuyer().getDepositTx().getIncomingAmount();
+ BigInteger buyerDepositAmount = hasBuyerAsTakerWithoutDeposit() ? BigInteger.ZERO : getBuyer().getDepositTx().getIncomingAmount();
BigInteger tradeAmount = getAmount();
BigInteger buyerPayoutAmount = buyerDepositAmount.add(tradeAmount);
BigInteger sellerPayoutAmount = sellerDepositAmount.subtract(tradeAmount);
@@ -1324,7 +1328,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
MoneroWallet wallet = getWallet();
Contract contract = getContract();
BigInteger sellerDepositAmount = getSeller().getDepositTx().getIncomingAmount();
- BigInteger buyerDepositAmount = getBuyer().getDepositTx().getIncomingAmount();
+ BigInteger buyerDepositAmount = hasBuyerAsTakerWithoutDeposit() ? BigInteger.ZERO : getBuyer().getDepositTx().getIncomingAmount();
BigInteger tradeAmount = getAmount();
// describe payout tx
@@ -2016,12 +2020,13 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
if (processModel.getPaymentSentMessageStateProperty().get() == MessageState.ACKNOWLEDGED) return MessageState.ACKNOWLEDGED;
switch (state) {
case BUYER_SENT_PAYMENT_SENT_MSG:
- case BUYER_SAW_ARRIVED_PAYMENT_SENT_MSG:
return MessageState.SENT;
+ case BUYER_SAW_ARRIVED_PAYMENT_SENT_MSG:
+ return MessageState.ARRIVED;
case BUYER_STORED_IN_MAILBOX_PAYMENT_SENT_MSG:
return MessageState.STORED_IN_MAILBOX;
case SELLER_RECEIVED_PAYMENT_SENT_MSG:
- return MessageState.ARRIVED;
+ return MessageState.ACKNOWLEDGED;
case BUYER_SEND_FAILED_PAYMENT_SENT_MSG:
return MessageState.FAILED;
default:
@@ -2091,9 +2096,9 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
final long tradeTime = getTakeOfferDate().getTime();
MoneroDaemon daemonRpc = xmrWalletService.getDaemon();
if (daemonRpc == null) throw new RuntimeException("Cannot set start time for trade " + getId() + " because it has no connection to monerod");
- if (getMakerDepositTx() == null || getTakerDepositTx() == null) throw new RuntimeException("Cannot set start time for trade " + getId() + " because its unlocked deposit tx is null. Is client connected to a daemon?");
+ if (getMakerDepositTx() == null || (getTakerDepositTx() == null && !hasBuyerAsTakerWithoutDeposit())) throw new RuntimeException("Cannot set start time for trade " + getId() + " because its unlocked deposit tx is null. Is client connected to a daemon?");
- long maxHeight = Math.max(getMakerDepositTx().getHeight(), getTakerDepositTx().getHeight());
+ long maxHeight = Math.max(getMakerDepositTx().getHeight(), hasBuyerAsTakerWithoutDeposit() ? 0l : getTakerDepositTx().getHeight());
long blockTime = daemonRpc.getBlockByHeight(maxHeight).getTimestamp();
// If block date is in future (Date in blocks can be off by +/- 2 hours) we use our current date.
@@ -2125,7 +2130,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
public boolean isDepositsPublished() {
if (isDepositFailed()) return false;
- return getState().getPhase().ordinal() >= Phase.DEPOSITS_PUBLISHED.ordinal() && getMaker().getDepositTxHash() != null && getTaker().getDepositTxHash() != null;
+ return getState().getPhase().ordinal() >= Phase.DEPOSITS_PUBLISHED.ordinal() && getMaker().getDepositTxHash() != null && (getTaker().getDepositTxHash() != null || hasBuyerAsTakerWithoutDeposit());
}
public boolean isFundsLockedIn() {
@@ -2277,7 +2282,11 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
}
public BigInteger getTakerFee() {
- return offer.getTakerFee(getAmount());
+ return hasBuyerAsTakerWithoutDeposit() ? BigInteger.ZERO : offer.getTakerFee(getAmount());
+ }
+
+ public BigInteger getSecurityDepositBeforeMiningFee() {
+ return isBuyer() ? getBuyerSecurityDepositBeforeMiningFee() : getSellerSecurityDepositBeforeMiningFee();
}
public BigInteger getBuyerSecurityDepositBeforeMiningFee() {
@@ -2288,6 +2297,14 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
return offer.getOfferPayload().getSellerSecurityDepositForTradeAmount(getAmount());
}
+ public boolean isBuyerAsTakerWithoutDeposit() {
+ return isBuyer() && isTaker() && BigInteger.ZERO.equals(getBuyerSecurityDepositBeforeMiningFee());
+ }
+
+ public boolean hasBuyerAsTakerWithoutDeposit() {
+ return getBuyer() == getTaker() && BigInteger.ZERO.equals(getBuyerSecurityDepositBeforeMiningFee());
+ }
+
@Override
public BigInteger getTotalTxFee() {
return getSelf().getDepositTxFee().add(getSelf().getPayoutTxFee()); // sum my tx fees
@@ -2303,7 +2320,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
}
public boolean isTxChainInvalid() {
- return processModel.getMaker().getDepositTxHash() == null || processModel.getTaker().getDepositTxHash() == null;
+ return processModel.getMaker().getDepositTxHash() == null || (processModel.getTaker().getDepositTxHash() == null && !hasBuyerAsTakerWithoutDeposit());
}
/**
@@ -2364,7 +2381,8 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
return tradeVolumeProperty;
}
- private void onConnectionChanged(MoneroRpcConnection connection) {
+ @Override
+ protected void onConnectionChanged(MoneroRpcConnection connection) {
synchronized (walletLock) {
// use current connection
@@ -2537,7 +2555,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
if (isPayoutUnlocked()) return;
// skip if deposit txs unknown or not requested
- if (processModel.getMaker().getDepositTxHash() == null || processModel.getTaker().getDepositTxHash() == null || !isDepositRequested()) return;
+ if (!isDepositRequested() || processModel.getMaker().getDepositTxHash() == null || (processModel.getTaker().getDepositTxHash() == null && !hasBuyerAsTakerWithoutDeposit())) return;
// skip if daemon not synced
if (xmrConnectionService.getTargetHeight() == null || !xmrConnectionService.isSyncedWithinTolerance()) return;
@@ -2553,7 +2571,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
// get txs from trade wallet
MoneroTxQuery query = new MoneroTxQuery().setIncludeOutputs(true);
- Boolean updatePool = !isDepositsConfirmed() && (getMaker().getDepositTx() == null || getTaker().getDepositTx() == null);
+ Boolean updatePool = !isDepositsConfirmed() && (getMaker().getDepositTx() == null || (getTaker().getDepositTx() == null && hasBuyerAsTakerWithoutDeposit()));
if (!updatePool) query.setInTxPool(false); // avoid updating from pool if possible
List txs;
if (!updatePool) txs = wallet.getTxs(query);
@@ -2565,22 +2583,22 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
}
}
setDepositTxs(txs);
- if (getMaker().getDepositTx() == null || getTaker().getDepositTx() == null) return; // skip if either deposit tx not seen
+ if (getMaker().getDepositTx() == null || (getTaker().getDepositTx() == null && !hasBuyerAsTakerWithoutDeposit())) return; // skip if either deposit tx not seen
setStateDepositsSeen();
// set actual security deposits
if (getBuyer().getSecurityDeposit().longValueExact() == 0) {
- BigInteger buyerSecurityDeposit = ((MoneroTxWallet) getBuyer().getDepositTx()).getIncomingAmount();
+ BigInteger buyerSecurityDeposit = hasBuyerAsTakerWithoutDeposit() ? BigInteger.ZERO : ((MoneroTxWallet) getBuyer().getDepositTx()).getIncomingAmount();
BigInteger sellerSecurityDeposit = ((MoneroTxWallet) getSeller().getDepositTx()).getIncomingAmount().subtract(getAmount());
getBuyer().setSecurityDeposit(buyerSecurityDeposit);
getSeller().setSecurityDeposit(sellerSecurityDeposit);
}
// check for deposit txs confirmation
- if (getMaker().getDepositTx().isConfirmed() && getTaker().getDepositTx().isConfirmed()) setStateDepositsConfirmed();
+ if (getMaker().getDepositTx().isConfirmed() && (hasBuyerAsTakerWithoutDeposit() || getTaker().getDepositTx().isConfirmed())) setStateDepositsConfirmed();
// check for deposit txs unlocked
- if (getMaker().getDepositTx().getNumConfirmations() >= XmrWalletService.NUM_BLOCKS_UNLOCK && getTaker().getDepositTx().getNumConfirmations() >= XmrWalletService.NUM_BLOCKS_UNLOCK) {
+ if (getMaker().getDepositTx().getNumConfirmations() >= XmrWalletService.NUM_BLOCKS_UNLOCK && (hasBuyerAsTakerWithoutDeposit() || getTaker().getDepositTx().getNumConfirmations() >= XmrWalletService.NUM_BLOCKS_UNLOCK)) {
setStateDepositsUnlocked();
}
}
@@ -2660,7 +2678,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
pollInProgress = false;
}
}
- requestSaveWallet();
+ saveWalletWithDelay();
}
}
@@ -2750,7 +2768,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
log.warn("Missing maker deposit tx for {} {}", getClass().getSimpleName(), getId());
return true;
}
- if (getTakerDepositTx() == null) {
+ if (getTakerDepositTx() == null && !hasBuyerAsTakerWithoutDeposit()) {
log.warn("Missing taker deposit tx for {} {}", getClass().getSimpleName(), getId());
return true;
}
@@ -2872,10 +2890,16 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
ThreadUtils.submitToPool(() -> xmrWalletService.freezeOutputs(getSelf().getReserveTxKeyImages()));
}
+ private void onDepositsConfirmed() {
+ HavenoUtils.notificationService.sendTradeNotification(this, Phase.DEPOSITS_CONFIRMED, "Trade Deposits Confirmed", "The deposit transactions have confirmed");
+ }
+
+ private void onDepositsUnlocked() {
+ HavenoUtils.notificationService.sendTradeNotification(this, Phase.DEPOSITS_UNLOCKED, "Trade Deposits Unlocked", "The deposit transactions have unlocked");
+ }
+
private void onPaymentSent() {
- if (this instanceof SellerTrade) {
- HavenoUtils.notificationService.sendTradeNotification(this, Phase.PAYMENT_SENT, "Payment Sent", "The buyer has sent the payment"); // TODO (woodser): use language translation
- }
+ HavenoUtils.notificationService.sendTradeNotification(this, Phase.PAYMENT_SENT, "Payment Sent", "The buyer has sent the payment");
}
///////////////////////////////////////////////////////////////////////////////////////////
@@ -2913,6 +2937,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
Optional.ofNullable(payoutTxHex).ifPresent(e -> builder.setPayoutTxHex(payoutTxHex));
Optional.ofNullable(payoutTxKey).ifPresent(e -> builder.setPayoutTxKey(payoutTxKey));
Optional.ofNullable(counterCurrencyExtraData).ifPresent(e -> builder.setCounterCurrencyExtraData(counterCurrencyExtraData));
+ Optional.ofNullable(challenge).ifPresent(e -> builder.setChallenge(challenge));
return builder.build();
}
@@ -2982,6 +3007,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
",\n refundResultState=" + refundResultState +
",\n refundResultStateProperty=" + refundResultStateProperty +
",\n isCompleted=" + isCompleted +
+ ",\n challenge='" + challenge + '\'' +
"\n}";
}
}
diff --git a/core/src/main/java/haveno/core/trade/TradeManager.java b/core/src/main/java/haveno/core/trade/TradeManager.java
index dc0427c4af..a3cca84912 100644
--- a/core/src/main/java/haveno/core/trade/TradeManager.java
+++ b/core/src/main/java/haveno/core/trade/TradeManager.java
@@ -561,6 +561,12 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
OpenOffer openOffer = openOfferOptional.get();
if (openOffer.getState() != OpenOffer.State.AVAILABLE) return;
Offer offer = openOffer.getOffer();
+
+ // validate challenge
+ if (openOffer.getChallenge() != null && !HavenoUtils.getChallengeHash(openOffer.getChallenge()).equals(HavenoUtils.getChallengeHash(request.getChallenge()))) {
+ log.warn("Ignoring InitTradeRequest to maker because challenge is incorrect, tradeId={}, sender={}", request.getOfferId(), sender);
+ return;
+ }
// ensure trade does not already exist
Optional tradeOptional = getOpenTrade(request.getOfferId());
@@ -583,7 +589,8 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
UUID.randomUUID().toString(),
request.getMakerNodeAddress(),
request.getTakerNodeAddress(),
- request.getArbitratorNodeAddress());
+ request.getArbitratorNodeAddress(),
+ openOffer.getChallenge());
else
trade = new SellerAsMakerTrade(offer,
BigInteger.valueOf(request.getTradeAmount()),
@@ -593,7 +600,8 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
UUID.randomUUID().toString(),
request.getMakerNodeAddress(),
request.getTakerNodeAddress(),
- request.getArbitratorNodeAddress());
+ request.getArbitratorNodeAddress(),
+ openOffer.getChallenge());
trade.getMaker().setPaymentAccountId(trade.getOffer().getOfferPayload().getMakerPaymentAccountId());
trade.getTaker().setPaymentAccountId(request.getTakerPaymentAccountId());
trade.getMaker().setPubKeyRing(trade.getOffer().getPubKeyRing());
@@ -646,6 +654,12 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
return;
}
+ // validate challenge hash
+ if (offer.getChallengeHash() != null && !offer.getChallengeHash().equals(HavenoUtils.getChallengeHash(request.getChallenge()))) {
+ log.warn("Ignoring InitTradeRequest to arbitrator because challenge hash is incorrect, tradeId={}, sender={}", request.getOfferId(), sender);
+ return;
+ }
+
// handle trade
Trade trade;
Optional tradeOptional = getOpenTrade(offer.getId());
@@ -679,7 +693,8 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
UUID.randomUUID().toString(),
request.getMakerNodeAddress(),
request.getTakerNodeAddress(),
- request.getArbitratorNodeAddress());
+ request.getArbitratorNodeAddress(),
+ request.getChallenge());
// set reserve tx hash if available
Optional signedOfferOptional = openOfferManager.getSignedOfferById(request.getOfferId());
@@ -873,7 +888,8 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
UUID.randomUUID().toString(),
offer.getMakerNodeAddress(),
P2PService.getMyNodeAddress(),
- null);
+ null,
+ offer.getChallenge());
} else {
trade = new BuyerAsTakerTrade(offer,
amount,
@@ -883,7 +899,8 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
UUID.randomUUID().toString(),
offer.getMakerNodeAddress(),
P2PService.getMyNodeAddress(),
- null);
+ null,
+ offer.getChallenge());
}
trade.getProcessModel().setUseSavingsWallet(useSavingsWallet);
trade.getProcessModel().setFundsNeededForTrade(fundsNeededForTrade.longValueExact());
@@ -994,7 +1011,6 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
if (tradeOptional.isPresent()) {
Trade trade = tradeOptional.get();
trade.setDisputeState(disputeState);
- onTradeCompleted(trade);
xmrWalletService.resetAddressEntriesForTrade(trade.getId());
requestPersistence();
}
@@ -1128,7 +1144,7 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
log.warn("We found a closed trade with locked up funds. " +
"That should never happen. trade ID={} ID={}, state={}, payoutState={}, disputeState={}", trade.getClass().getSimpleName(), trade.getId(), trade.getState(), trade.getPayoutState(), trade.getDisputeState());
}
- } else {
+ } else if (!trade.hasBuyerAsTakerWithoutDeposit()) {
log.warn("Closed trade with locked up funds missing taker deposit tx. {} ID={}, state={}, payoutState={}, disputeState={}", trade.getClass().getSimpleName(), trade.getId(), trade.getState(), trade.getPayoutState(), trade.getDisputeState());
tradeTxException.set(new TradeTxException(Res.get("error.closedTradeWithNoDepositTx", trade.getShortId())));
}
diff --git a/core/src/main/java/haveno/core/trade/messages/DepositRequest.java b/core/src/main/java/haveno/core/trade/messages/DepositRequest.java
index c743595ed4..b0ac60af85 100644
--- a/core/src/main/java/haveno/core/trade/messages/DepositRequest.java
+++ b/core/src/main/java/haveno/core/trade/messages/DepositRequest.java
@@ -33,7 +33,9 @@ import java.util.Optional;
public final class DepositRequest extends TradeMessage implements DirectMessage {
private final long currentDate;
private final byte[] contractSignature;
+ @Nullable
private final String depositTxHex;
+ @Nullable
private final String depositTxKey;
@Nullable
private final byte[] paymentAccountKey;
@@ -43,8 +45,8 @@ public final class DepositRequest extends TradeMessage implements DirectMessage
String messageVersion,
long currentDate,
byte[] contractSignature,
- String depositTxHex,
- String depositTxKey,
+ @Nullable String depositTxHex,
+ @Nullable String depositTxKey,
@Nullable byte[] paymentAccountKey) {
super(messageVersion, tradeId, uid);
this.currentDate = currentDate;
@@ -63,13 +65,12 @@ public final class DepositRequest extends TradeMessage implements DirectMessage
public protobuf.NetworkEnvelope toProtoNetworkEnvelope() {
protobuf.DepositRequest.Builder builder = protobuf.DepositRequest.newBuilder()
.setTradeId(offerId)
- .setUid(uid)
- .setDepositTxHex(depositTxHex)
- .setDepositTxKey(depositTxKey);
+ .setUid(uid);
builder.setCurrentDate(currentDate);
Optional.ofNullable(paymentAccountKey).ifPresent(e -> builder.setPaymentAccountKey(ByteString.copyFrom(e)));
+ Optional.ofNullable(depositTxHex).ifPresent(builder::setDepositTxHex);
+ Optional.ofNullable(depositTxKey).ifPresent(builder::setDepositTxKey);
Optional.ofNullable(contractSignature).ifPresent(e -> builder.setContractSignature(ByteString.copyFrom(e)));
-
return getNetworkEnvelopeBuilder().setDepositRequest(builder).build();
}
@@ -81,8 +82,8 @@ public final class DepositRequest extends TradeMessage implements DirectMessage
messageVersion,
proto.getCurrentDate(),
ProtoUtil.byteArrayOrNullFromProto(proto.getContractSignature()),
- proto.getDepositTxHex(),
- proto.getDepositTxKey(),
+ ProtoUtil.stringOrNullFromProto(proto.getDepositTxHex()),
+ ProtoUtil.stringOrNullFromProto(proto.getDepositTxKey()),
ProtoUtil.byteArrayOrNullFromProto(proto.getPaymentAccountKey()));
}
diff --git a/core/src/main/java/haveno/core/trade/messages/InitTradeRequest.java b/core/src/main/java/haveno/core/trade/messages/InitTradeRequest.java
index 4846487598..817162addd 100644
--- a/core/src/main/java/haveno/core/trade/messages/InitTradeRequest.java
+++ b/core/src/main/java/haveno/core/trade/messages/InitTradeRequest.java
@@ -58,6 +58,8 @@ public final class InitTradeRequest extends TradeMessage implements DirectMessag
private final String reserveTxKey;
@Nullable
private final String payoutAddress;
+ @Nullable
+ private final String challenge;
public InitTradeRequest(TradeProtocolVersion tradeProtocolVersion,
String offerId,
@@ -79,7 +81,8 @@ public final class InitTradeRequest extends TradeMessage implements DirectMessag
@Nullable String reserveTxHash,
@Nullable String reserveTxHex,
@Nullable String reserveTxKey,
- @Nullable String payoutAddress) {
+ @Nullable String payoutAddress,
+ @Nullable String challenge) {
super(messageVersion, offerId, uid);
this.tradeProtocolVersion = tradeProtocolVersion;
this.tradeAmount = tradeAmount;
@@ -99,6 +102,7 @@ public final class InitTradeRequest extends TradeMessage implements DirectMessag
this.reserveTxHex = reserveTxHex;
this.reserveTxKey = reserveTxKey;
this.payoutAddress = payoutAddress;
+ this.challenge = challenge;
}
@@ -129,6 +133,7 @@ public final class InitTradeRequest extends TradeMessage implements DirectMessag
Optional.ofNullable(reserveTxHex).ifPresent(e -> builder.setReserveTxHex(reserveTxHex));
Optional.ofNullable(reserveTxKey).ifPresent(e -> builder.setReserveTxKey(reserveTxKey));
Optional.ofNullable(payoutAddress).ifPresent(e -> builder.setPayoutAddress(payoutAddress));
+ Optional.ofNullable(challenge).ifPresent(e -> builder.setChallenge(challenge));
Optional.ofNullable(accountAgeWitnessSignatureOfOfferId).ifPresent(e -> builder.setAccountAgeWitnessSignatureOfOfferId(ByteString.copyFrom(e)));
builder.setCurrentDate(currentDate);
@@ -158,7 +163,8 @@ public final class InitTradeRequest extends TradeMessage implements DirectMessag
ProtoUtil.stringOrNullFromProto(proto.getReserveTxHash()),
ProtoUtil.stringOrNullFromProto(proto.getReserveTxHex()),
ProtoUtil.stringOrNullFromProto(proto.getReserveTxKey()),
- ProtoUtil.stringOrNullFromProto(proto.getPayoutAddress()));
+ ProtoUtil.stringOrNullFromProto(proto.getPayoutAddress()),
+ ProtoUtil.stringOrNullFromProto(proto.getChallenge()));
}
@Override
@@ -183,6 +189,7 @@ public final class InitTradeRequest extends TradeMessage implements DirectMessag
",\n reserveTxHex=" + reserveTxHex +
",\n reserveTxKey=" + reserveTxKey +
",\n payoutAddress=" + payoutAddress +
+ ",\n challenge=" + challenge +
"\n} " + super.toString();
}
}
diff --git a/core/src/main/java/haveno/core/trade/messages/SignContractRequest.java b/core/src/main/java/haveno/core/trade/messages/SignContractRequest.java
index 8945904421..ab82e13dec 100644
--- a/core/src/main/java/haveno/core/trade/messages/SignContractRequest.java
+++ b/core/src/main/java/haveno/core/trade/messages/SignContractRequest.java
@@ -35,7 +35,9 @@ public final class SignContractRequest extends TradeMessage implements DirectMes
private final String accountId;
private final byte[] paymentAccountPayloadHash;
private final String payoutAddress;
+ @Nullable
private final String depositTxHash;
+ @Nullable
private final byte[] accountAgeWitnessSignatureOfDepositHash;
public SignContractRequest(String tradeId,
@@ -45,7 +47,7 @@ public final class SignContractRequest extends TradeMessage implements DirectMes
String accountId,
byte[] paymentAccountPayloadHash,
String payoutAddress,
- String depositTxHash,
+ @Nullable String depositTxHash,
@Nullable byte[] accountAgeWitnessSignatureOfDepositHash) {
super(messageVersion, tradeId, uid);
this.currentDate = currentDate;
@@ -68,10 +70,9 @@ public final class SignContractRequest extends TradeMessage implements DirectMes
.setUid(uid)
.setAccountId(accountId)
.setPaymentAccountPayloadHash(ByteString.copyFrom(paymentAccountPayloadHash))
- .setPayoutAddress(payoutAddress)
- .setDepositTxHash(depositTxHash);
-
+ .setPayoutAddress(payoutAddress);
Optional.ofNullable(accountAgeWitnessSignatureOfDepositHash).ifPresent(e -> builder.setAccountAgeWitnessSignatureOfDepositHash(ByteString.copyFrom(e)));
+ Optional.ofNullable(depositTxHash).ifPresent(builder::setDepositTxHash);
builder.setCurrentDate(currentDate);
return getNetworkEnvelopeBuilder().setSignContractRequest(builder).build();
@@ -87,7 +88,7 @@ public final class SignContractRequest extends TradeMessage implements DirectMes
proto.getAccountId(),
proto.getPaymentAccountPayloadHash().toByteArray(),
proto.getPayoutAddress(),
- proto.getDepositTxHash(),
+ ProtoUtil.stringOrNullFromProto(proto.getDepositTxHash()),
ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessSignatureOfDepositHash()));
}
diff --git a/core/src/main/java/haveno/core/trade/protocol/TradePeer.java b/core/src/main/java/haveno/core/trade/protocol/TradePeer.java
index b076826b95..eeef2d4daf 100644
--- a/core/src/main/java/haveno/core/trade/protocol/TradePeer.java
+++ b/core/src/main/java/haveno/core/trade/protocol/TradePeer.java
@@ -158,7 +158,6 @@ public final class TradePeer implements PersistablePayload {
}
public BigInteger getSecurityDeposit() {
- if (depositTxHash == null) return null;
return BigInteger.valueOf(securityDeposit);
}
diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorProcessDepositRequest.java b/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorProcessDepositRequest.java
index 54ced82510..be9d528f35 100644
--- a/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorProcessDepositRequest.java
+++ b/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorProcessDepositRequest.java
@@ -36,8 +36,9 @@ import monero.daemon.model.MoneroSubmitTxResult;
import monero.daemon.model.MoneroTx;
import java.math.BigInteger;
-import java.util.Arrays;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.List;
import java.util.UUID;
@Slf4j
@@ -83,72 +84,86 @@ public class ArbitratorProcessDepositRequest extends TradeTask {
byte[] signature = request.getContractSignature();
// get trader info
- TradePeer trader = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
- if (trader == null) throw new RuntimeException(request.getClass().getSimpleName() + " is not from maker, taker, or arbitrator");
- PubKeyRing peerPubKeyRing = trader.getPubKeyRing();
+ TradePeer sender = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
+ if (sender == null) throw new RuntimeException(request.getClass().getSimpleName() + " is not from maker, taker, or arbitrator");
+ PubKeyRing senderPubKeyRing = sender.getPubKeyRing();
// verify signature
- if (!HavenoUtils.isSignatureValid(peerPubKeyRing, contractAsJson, signature)) {
+ if (!HavenoUtils.isSignatureValid(senderPubKeyRing, contractAsJson, signature)) {
throw new RuntimeException("Peer's contract signature is invalid");
}
// set peer's signature
- trader.setContractSignature(signature);
+ sender.setContractSignature(signature);
// collect expected values
Offer offer = trade.getOffer();
- boolean isFromTaker = trader == trade.getTaker();
- boolean isFromBuyer = trader == trade.getBuyer();
+ boolean isFromTaker = sender == trade.getTaker();
+ boolean isFromBuyer = sender == trade.getBuyer();
BigInteger tradeFee = isFromTaker ? trade.getTakerFee() : trade.getMakerFee();
BigInteger sendTradeAmount = isFromBuyer ? BigInteger.ZERO : trade.getAmount();
BigInteger securityDeposit = isFromBuyer ? trade.getBuyerSecurityDepositBeforeMiningFee() : trade.getSellerSecurityDepositBeforeMiningFee();
String depositAddress = processModel.getMultisigAddress();
+ sender.setSecurityDeposit(securityDeposit);
// verify deposit tx
- MoneroTx verifiedTx;
- try {
- verifiedTx = trade.getXmrWalletService().verifyDepositTx(
- offer.getId(),
- tradeFee,
- trade.getProcessModel().getTradeFeeAddress(),
- sendTradeAmount,
- securityDeposit,
- depositAddress,
- trader.getDepositTxHash(),
- request.getDepositTxHex(),
- request.getDepositTxKey(),
- null);
- } catch (Exception e) {
- throw new RuntimeException("Error processing deposit tx from " + (isFromTaker ? "taker " : "maker ") + trader.getNodeAddress() + ", offerId=" + offer.getId() + ": " + e.getMessage());
+ boolean isFromBuyerAsTakerWithoutDeposit = isFromBuyer && isFromTaker && trade.hasBuyerAsTakerWithoutDeposit();
+ if (!isFromBuyerAsTakerWithoutDeposit) {
+ MoneroTx verifiedTx;
+ try {
+ verifiedTx = trade.getXmrWalletService().verifyDepositTx(
+ offer.getId(),
+ tradeFee,
+ trade.getProcessModel().getTradeFeeAddress(),
+ sendTradeAmount,
+ securityDeposit,
+ depositAddress,
+ sender.getDepositTxHash(),
+ request.getDepositTxHex(),
+ request.getDepositTxKey(),
+ null);
+ } catch (Exception e) {
+ throw new RuntimeException("Error processing deposit tx from " + (isFromTaker ? "taker " : "maker ") + sender.getNodeAddress() + ", offerId=" + offer.getId() + ": " + e.getMessage());
+ }
+
+ // update trade state
+ sender.setSecurityDeposit(sender.getSecurityDeposit().subtract(verifiedTx.getFee())); // subtract mining fee from security deposit
+ sender.setDepositTxFee(verifiedTx.getFee());
+ sender.setDepositTxHex(request.getDepositTxHex());
+ sender.setDepositTxKey(request.getDepositTxKey());
}
// update trade state
- trader.setSecurityDeposit(securityDeposit.subtract(verifiedTx.getFee())); // subtract mining fee from security deposit
- trader.setDepositTxFee(verifiedTx.getFee());
- trader.setDepositTxHex(request.getDepositTxHex());
- trader.setDepositTxKey(request.getDepositTxKey());
- if (request.getPaymentAccountKey() != null) trader.setPaymentAccountKey(request.getPaymentAccountKey());
+ if (request.getPaymentAccountKey() != null) sender.setPaymentAccountKey(request.getPaymentAccountKey());
processModel.getTradeManager().requestPersistence();
- // relay deposit txs when both available
+ // relay deposit txs when both requests received
MoneroDaemon daemon = trade.getXmrWalletService().getDaemon();
- if (processModel.getMaker().getDepositTxHex() != null && processModel.getTaker().getDepositTxHex() != null) {
+ if (processModel.getMaker().getContractSignature() != null && processModel.getTaker().getContractSignature() != null) {
// check timeout and extend just before relaying
if (isTimedOut()) throw new RuntimeException("Trade protocol has timed out before relaying deposit txs for {} {}" + trade.getClass().getSimpleName() + " " + trade.getShortId());
trade.addInitProgressStep();
+ // relay deposit txs
boolean depositTxsRelayed = false;
+ List txHashes = new ArrayList<>();
try {
- // submit txs to pool but do not relay
+ // submit maker tx to pool but do not relay
MoneroSubmitTxResult makerResult = daemon.submitTxHex(processModel.getMaker().getDepositTxHex(), true);
- MoneroSubmitTxResult takerResult = daemon.submitTxHex(processModel.getTaker().getDepositTxHex(), true);
if (!makerResult.isGood()) throw new RuntimeException("Error submitting maker deposit tx: " + JsonUtils.serialize(makerResult));
- if (!takerResult.isGood()) throw new RuntimeException("Error submitting taker deposit tx: " + JsonUtils.serialize(takerResult));
+ txHashes.add(processModel.getMaker().getDepositTxHash());
+
+ // submit taker tx to pool but do not relay
+ if (!trade.hasBuyerAsTakerWithoutDeposit()) {
+ MoneroSubmitTxResult takerResult = daemon.submitTxHex(processModel.getTaker().getDepositTxHex(), true);
+ if (!takerResult.isGood()) throw new RuntimeException("Error submitting taker deposit tx: " + JsonUtils.serialize(takerResult));
+ txHashes.add(processModel.getTaker().getDepositTxHash());
+ }
// relay txs
- daemon.relayTxsByHash(Arrays.asList(processModel.getMaker().getDepositTxHash(), processModel.getTaker().getDepositTxHash()));
+ daemon.relayTxsByHash(txHashes);
depositTxsRelayed = true;
// update trade state
@@ -160,7 +175,7 @@ public class ArbitratorProcessDepositRequest extends TradeTask {
// flush txs from pool
try {
- daemon.flushTxPool(processModel.getMaker().getDepositTxHash(), processModel.getTaker().getDepositTxHash());
+ daemon.flushTxPool(txHashes);
} catch (Exception e2) {
log.warn("Error flushing deposit txs from pool for trade {}: {}\n", trade.getId(), e2.getMessage(), e2);
}
@@ -180,7 +195,7 @@ public class ArbitratorProcessDepositRequest extends TradeTask {
});
if (processModel.getMaker().getDepositTxHex() == null) log.info("Arbitrator waiting for deposit request from maker for trade " + trade.getId());
- if (processModel.getTaker().getDepositTxHex() == null) log.info("Arbitrator waiting for deposit request from taker for trade " + trade.getId());
+ if (processModel.getTaker().getDepositTxHex() == null && !trade.hasBuyerAsTakerWithoutDeposit()) log.info("Arbitrator waiting for deposit request from taker for trade " + trade.getId());
}
}
@@ -196,10 +211,9 @@ public class ArbitratorProcessDepositRequest extends TradeTask {
// log error
if (errorMessage != null) {
- log.warn("Sending deposit responses with error={}", errorMessage);
- Thread.dumpStack();
+ log.warn("Sending deposit responses with error={}", errorMessage, new Throwable("Stack trace"));
}
-
+
// create deposit response
DepositResponse response = new DepositResponse(
trade.getOffer().getId(),
diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorProcessReserveTx.java b/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorProcessReserveTx.java
index 10baac8567..18e97dd466 100644
--- a/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorProcessReserveTx.java
+++ b/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorProcessReserveTx.java
@@ -53,38 +53,44 @@ public class ArbitratorProcessReserveTx extends TradeTask {
TradePeer sender = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
boolean isFromMaker = sender == trade.getMaker();
boolean isFromBuyer = isFromMaker ? offer.getDirection() == OfferDirection.BUY : offer.getDirection() == OfferDirection.SELL;
+ sender = isFromMaker ? processModel.getMaker() : processModel.getTaker();
+ BigInteger securityDeposit = isFromMaker ? isFromBuyer ? offer.getMaxBuyerSecurityDeposit() : offer.getMaxSellerSecurityDeposit() : isFromBuyer ? trade.getBuyerSecurityDepositBeforeMiningFee() : trade.getSellerSecurityDepositBeforeMiningFee();
+ sender.setSecurityDeposit(securityDeposit);
// TODO (woodser): if signer online, should never be called by maker?
- // process reserve tx with expected values
- BigInteger penaltyFee = HavenoUtils.multiply(isFromMaker ? offer.getAmount() : trade.getAmount(), offer.getPenaltyFeePct());
- BigInteger tradeFee = isFromMaker ? offer.getMaxMakerFee() : trade.getTakerFee();
- BigInteger sendAmount = isFromBuyer ? BigInteger.ZERO : isFromMaker ? offer.getAmount() : trade.getAmount(); // maker reserve tx is for offer amount
- BigInteger securityDeposit = isFromMaker ? isFromBuyer ? offer.getMaxBuyerSecurityDeposit() : offer.getMaxSellerSecurityDeposit() : isFromBuyer ? trade.getBuyerSecurityDepositBeforeMiningFee() : trade.getSellerSecurityDepositBeforeMiningFee();
- MoneroTx verifiedTx;
- try {
- verifiedTx = trade.getXmrWalletService().verifyReserveTx(
- offer.getId(),
- penaltyFee,
- tradeFee,
- sendAmount,
- securityDeposit,
- request.getPayoutAddress(),
- request.getReserveTxHash(),
- request.getReserveTxHex(),
- request.getReserveTxKey(),
- null);
- } catch (Exception e) {
- log.error(ExceptionUtils.getStackTrace(e));
- throw new RuntimeException("Error processing reserve tx from " + (isFromMaker ? "maker " : "taker ") + processModel.getTempTradePeerNodeAddress() + ", offerId=" + offer.getId() + ": " + e.getMessage());
- }
+ // process reserve tx unless from buyer as taker without deposit
+ boolean isFromBuyerAsTakerWithoutDeposit = isFromBuyer && !isFromMaker && trade.hasBuyerAsTakerWithoutDeposit();
+ if (!isFromBuyerAsTakerWithoutDeposit) {
- // save reserve tx to model
- TradePeer trader = isFromMaker ? processModel.getMaker() : processModel.getTaker();
- trader.setSecurityDeposit(securityDeposit.subtract(verifiedTx.getFee())); // subtract mining fee from security deposit
- trader.setReserveTxHash(request.getReserveTxHash());
- trader.setReserveTxHex(request.getReserveTxHex());
- trader.setReserveTxKey(request.getReserveTxKey());
+ // process reserve tx with expected values
+ BigInteger penaltyFee = HavenoUtils.multiply(isFromMaker ? offer.getAmount() : trade.getAmount(), offer.getPenaltyFeePct());
+ BigInteger tradeFee = isFromMaker ? offer.getMaxMakerFee() : trade.getTakerFee();
+ BigInteger sendAmount = isFromBuyer ? BigInteger.ZERO : isFromMaker ? offer.getAmount() : trade.getAmount(); // maker reserve tx is for offer amount
+ MoneroTx verifiedTx;
+ try {
+ verifiedTx = trade.getXmrWalletService().verifyReserveTx(
+ offer.getId(),
+ penaltyFee,
+ tradeFee,
+ sendAmount,
+ securityDeposit,
+ request.getPayoutAddress(),
+ request.getReserveTxHash(),
+ request.getReserveTxHex(),
+ request.getReserveTxKey(),
+ null);
+ } catch (Exception e) {
+ log.error(ExceptionUtils.getStackTrace(e));
+ throw new RuntimeException("Error processing reserve tx from " + (isFromMaker ? "maker " : "taker ") + processModel.getTempTradePeerNodeAddress() + ", offerId=" + offer.getId() + ": " + e.getMessage());
+ }
+
+ // save reserve tx to model
+ sender.setSecurityDeposit(sender.getSecurityDeposit().subtract(verifiedTx.getFee())); // subtract mining fee from security deposit
+ sender.setReserveTxHash(request.getReserveTxHash());
+ sender.setReserveTxHex(request.getReserveTxHex());
+ sender.setReserveTxKey(request.getReserveTxKey());
+ }
// persist trade
processModel.getTradeManager().requestPersistence();
diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorSendInitTradeOrMultisigRequests.java b/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorSendInitTradeOrMultisigRequests.java
index 9ec7aebe28..a846077db4 100644
--- a/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorSendInitTradeOrMultisigRequests.java
+++ b/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorSendInitTradeOrMultisigRequests.java
@@ -78,6 +78,7 @@ public class ArbitratorSendInitTradeOrMultisigRequests extends TradeTask {
null,
null,
null,
+ null,
null);
// send request to taker
@@ -118,7 +119,7 @@ public class ArbitratorSendInitTradeOrMultisigRequests extends TradeTask {
// ensure arbitrator has reserve txs
if (processModel.getMaker().getReserveTxHash() == null) throw new RuntimeException("Arbitrator does not have maker's reserve tx after initializing trade");
- if (processModel.getTaker().getReserveTxHash() == null) throw new RuntimeException("Arbitrator does not have taker's reserve tx after initializing trade");
+ if (processModel.getTaker().getReserveTxHash() == null && !trade.hasBuyerAsTakerWithoutDeposit()) throw new RuntimeException("Arbitrator does not have taker's reserve tx after initializing trade");
// create wallet for multisig
MoneroWallet multisigWallet = trade.createWallet();
diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/BuyerPreparePaymentSentMessage.java b/core/src/main/java/haveno/core/trade/protocol/tasks/BuyerPreparePaymentSentMessage.java
index 8b739011d5..05fee1374a 100644
--- a/core/src/main/java/haveno/core/trade/protocol/tasks/BuyerPreparePaymentSentMessage.java
+++ b/core/src/main/java/haveno/core/trade/protocol/tasks/BuyerPreparePaymentSentMessage.java
@@ -74,7 +74,7 @@ public class BuyerPreparePaymentSentMessage extends TradeTask {
Preconditions.checkNotNull(trade.getSeller().getPaymentAccountPayload(), "Seller's payment account payload is null");
Preconditions.checkNotNull(trade.getAmount(), "trade.getTradeAmount() must not be null");
Preconditions.checkNotNull(trade.getMakerDepositTx(), "trade.getMakerDepositTx() must not be null");
- Preconditions.checkNotNull(trade.getTakerDepositTx(), "trade.getTakerDepositTx() must not be null");
+ if (!trade.hasBuyerAsTakerWithoutDeposit()) Preconditions.checkNotNull(trade.getTakerDepositTx(), "trade.getTakerDepositTx() must not be null");
checkNotNull(trade.getOffer(), "offer must not be null");
// create payout tx if we have seller's updated multisig hex
diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/MakerSendInitTradeRequestToArbitrator.java b/core/src/main/java/haveno/core/trade/protocol/tasks/MakerSendInitTradeRequestToArbitrator.java
index 91398e82e1..9f191131ec 100644
--- a/core/src/main/java/haveno/core/trade/protocol/tasks/MakerSendInitTradeRequestToArbitrator.java
+++ b/core/src/main/java/haveno/core/trade/protocol/tasks/MakerSendInitTradeRequestToArbitrator.java
@@ -138,7 +138,8 @@ public class MakerSendInitTradeRequestToArbitrator extends TradeTask {
trade.getSelf().getReserveTxHash(),
trade.getSelf().getReserveTxHex(),
trade.getSelf().getReserveTxKey(),
- model.getXmrWalletService().getOrCreateAddressEntry(trade.getOffer().getId(), XmrAddressEntry.Context.TRADE_PAYOUT).getAddressString());
+ model.getXmrWalletService().getOrCreateAddressEntry(trade.getOffer().getId(), XmrAddressEntry.Context.TRADE_PAYOUT).getAddressString(),
+ trade.getChallenge());
// send request to arbitrator
log.info("Sending {} with offerId {} and uid {} to arbitrator {}", arbitratorRequest.getClass().getSimpleName(), arbitratorRequest.getOfferId(), arbitratorRequest.getUid(), trade.getArbitrator().getNodeAddress());
diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/MaybeSendSignContractRequest.java b/core/src/main/java/haveno/core/trade/protocol/tasks/MaybeSendSignContractRequest.java
index 69d1620aea..e1c4cce5cc 100644
--- a/core/src/main/java/haveno/core/trade/protocol/tasks/MaybeSendSignContractRequest.java
+++ b/core/src/main/java/haveno/core/trade/protocol/tasks/MaybeSendSignContractRequest.java
@@ -83,7 +83,7 @@ public class MaybeSendSignContractRequest extends TradeTask {
if (isTimedOut()) throw new RuntimeException("Trade protocol has timed out while getting lock to create deposit tx, tradeId=" + trade.getShortId());
trade.startProtocolTimeout();
- // collect relevant info
+ // collect info
Integer subaddressIndex = null;
boolean reserveExactAmount = false;
if (trade instanceof MakerTrade) {
@@ -97,53 +97,60 @@ public class MaybeSendSignContractRequest extends TradeTask {
}
// attempt creating deposit tx
- try {
- synchronized (HavenoUtils.getWalletFunctionLock()) {
- for (int i = 0; i < TradeProtocol.MAX_ATTEMPTS; i++) {
- MoneroRpcConnection sourceConnection = trade.getXmrConnectionService().getConnection();
- try {
- depositTx = trade.getXmrWalletService().createDepositTx(trade, reserveExactAmount, subaddressIndex);
- } catch (Exception e) {
- log.warn("Error creating deposit tx, tradeId={}, attempt={}/{}, error={}", trade.getShortId(), i + 1, TradeProtocol.MAX_ATTEMPTS, e.getMessage());
- trade.getXmrWalletService().handleWalletError(e, sourceConnection);
+ if (!trade.isBuyerAsTakerWithoutDeposit()) {
+ try {
+ synchronized (HavenoUtils.getWalletFunctionLock()) {
+ for (int i = 0; i < TradeProtocol.MAX_ATTEMPTS; i++) {
+ MoneroRpcConnection sourceConnection = trade.getXmrConnectionService().getConnection();
+ try {
+ depositTx = trade.getXmrWalletService().createDepositTx(trade, reserveExactAmount, subaddressIndex);
+ } catch (Exception e) {
+ log.warn("Error creating deposit tx, tradeId={}, attempt={}/{}, error={}", trade.getShortId(), i + 1, TradeProtocol.MAX_ATTEMPTS, e.getMessage());
+ trade.getXmrWalletService().handleWalletError(e, sourceConnection);
+ if (isTimedOut()) throw new RuntimeException("Trade protocol has timed out while creating deposit tx, tradeId=" + trade.getShortId());
+ if (i == TradeProtocol.MAX_ATTEMPTS - 1) throw e;
+ HavenoUtils.waitFor(TradeProtocol.REPROCESS_DELAY_MS); // wait before retrying
+ }
+
+ // check for timeout
if (isTimedOut()) throw new RuntimeException("Trade protocol has timed out while creating deposit tx, tradeId=" + trade.getShortId());
- if (i == TradeProtocol.MAX_ATTEMPTS - 1) throw e;
- HavenoUtils.waitFor(TradeProtocol.REPROCESS_DELAY_MS); // wait before retrying
+ if (depositTx != null) break;
}
-
- // check for timeout
- if (isTimedOut()) throw new RuntimeException("Trade protocol has timed out while creating deposit tx, tradeId=" + trade.getShortId());
- if (depositTx != null) break;
}
+ } catch (Exception e) {
+
+ // thaw deposit inputs
+ if (depositTx != null) {
+ trade.getXmrWalletService().thawOutputs(HavenoUtils.getInputKeyImages(depositTx));
+ trade.getSelf().setReserveTxKeyImages(null);
+ }
+
+ // re-freeze maker offer inputs
+ if (trade instanceof MakerTrade) {
+ trade.getXmrWalletService().freezeOutputs(trade.getOffer().getOfferPayload().getReserveTxKeyImages());
+ }
+
+ throw e;
}
- } catch (Exception e) {
-
- // thaw deposit inputs
- if (depositTx != null) {
- trade.getXmrWalletService().thawOutputs(HavenoUtils.getInputKeyImages(depositTx));
- trade.getSelf().setReserveTxKeyImages(null);
- }
-
- // re-freeze maker offer inputs
- if (trade instanceof MakerTrade) {
- trade.getXmrWalletService().freezeOutputs(trade.getOffer().getOfferPayload().getReserveTxKeyImages());
- }
-
- throw e;
}
// reset protocol timeout
trade.addInitProgressStep();
// update trade state
- BigInteger securityDeposit = trade instanceof BuyerTrade ? trade.getBuyerSecurityDepositBeforeMiningFee() : trade.getSellerSecurityDepositBeforeMiningFee();
- trade.getSelf().setSecurityDeposit(securityDeposit.subtract(depositTx.getFee()));
- trade.getSelf().setDepositTx(depositTx);
- trade.getSelf().setDepositTxHash(depositTx.getHash());
- trade.getSelf().setDepositTxFee(depositTx.getFee());
- trade.getSelf().setReserveTxKeyImages(HavenoUtils.getInputKeyImages(depositTx));
trade.getSelf().setPayoutAddressString(trade.getXmrWalletService().getOrCreateAddressEntry(trade.getOffer().getId(), XmrAddressEntry.Context.TRADE_PAYOUT).getAddressString()); // TODO (woodser): allow custom payout address?
trade.getSelf().setPaymentAccountPayload(trade.getProcessModel().getPaymentAccountPayload(trade.getSelf().getPaymentAccountId()));
+ trade.getSelf().setPaymentAccountPayloadHash(trade.getSelf().getPaymentAccountPayload().getHash());
+ BigInteger securityDeposit = trade instanceof BuyerTrade ? trade.getBuyerSecurityDepositBeforeMiningFee() : trade.getSellerSecurityDepositBeforeMiningFee();
+ if (depositTx == null) {
+ trade.getSelf().setSecurityDeposit(securityDeposit);
+ } else {
+ trade.getSelf().setSecurityDeposit(securityDeposit.subtract(depositTx.getFee()));
+ trade.getSelf().setDepositTx(depositTx);
+ trade.getSelf().setDepositTxHash(depositTx.getHash());
+ trade.getSelf().setDepositTxFee(depositTx.getFee());
+ trade.getSelf().setReserveTxKeyImages(HavenoUtils.getInputKeyImages(depositTx));
+ }
}
// maker signs deposit hash nonce to avoid challenge protocol
@@ -161,7 +168,7 @@ public class MaybeSendSignContractRequest extends TradeTask {
trade.getProcessModel().getAccountId(),
trade.getSelf().getPaymentAccountPayload().getHash(),
trade.getSelf().getPayoutAddressString(),
- depositTx.getHash(),
+ depositTx == null ? null : depositTx.getHash(),
sig);
// send request to trading peer
diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessSignContractRequest.java b/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessSignContractRequest.java
index 8fc93df9a9..1ce805aca6 100644
--- a/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessSignContractRequest.java
+++ b/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessSignContractRequest.java
@@ -63,20 +63,20 @@ public class ProcessSignContractRequest extends TradeTask {
// extract fields from request
// TODO (woodser): verify request and from maker or taker
SignContractRequest request = (SignContractRequest) processModel.getTradeMessage();
- TradePeer trader = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
- trader.setDepositTxHash(request.getDepositTxHash());
- trader.setAccountId(request.getAccountId());
- trader.setPaymentAccountPayloadHash(request.getPaymentAccountPayloadHash());
- trader.setPayoutAddressString(request.getPayoutAddress());
+ TradePeer sender = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
+ sender.setDepositTxHash(request.getDepositTxHash());
+ sender.setAccountId(request.getAccountId());
+ sender.setPaymentAccountPayloadHash(request.getPaymentAccountPayloadHash());
+ sender.setPayoutAddressString(request.getPayoutAddress());
// maker sends witness signature of deposit tx hash
- if (trader == trade.getMaker()) {
- trader.setAccountAgeWitnessNonce(request.getDepositTxHash().getBytes(Charsets.UTF_8));
- trader.setAccountAgeWitnessSignature(request.getAccountAgeWitnessSignatureOfDepositHash());
+ if (sender == trade.getMaker()) {
+ sender.setAccountAgeWitnessNonce(request.getDepositTxHash().getBytes(Charsets.UTF_8));
+ sender.setAccountAgeWitnessSignature(request.getAccountAgeWitnessSignatureOfDepositHash());
}
- // sign contract only when both deposit txs hashes known
- if (processModel.getMaker().getDepositTxHash() == null || processModel.getTaker().getDepositTxHash() == null) {
+ // sign contract only when received from both peers
+ if (processModel.getMaker().getPaymentAccountPayloadHash() == null || processModel.getTaker().getPaymentAccountPayloadHash() == null) {
complete();
return;
}
diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/SendDepositRequest.java b/core/src/main/java/haveno/core/trade/protocol/tasks/SendDepositRequest.java
index dd43d6944f..7101c488a5 100644
--- a/core/src/main/java/haveno/core/trade/protocol/tasks/SendDepositRequest.java
+++ b/core/src/main/java/haveno/core/trade/protocol/tasks/SendDepositRequest.java
@@ -82,8 +82,8 @@ public class SendDepositRequest extends TradeTask {
Version.getP2PMessageVersion(),
new Date().getTime(),
trade.getSelf().getContractSignature(),
- trade.getSelf().getDepositTx().getFullHex(),
- trade.getSelf().getDepositTx().getKey(),
+ trade.getSelf().getDepositTx() == null ? null : trade.getSelf().getDepositTx().getFullHex(),
+ trade.getSelf().getDepositTx() == null ? null : trade.getSelf().getDepositTx().getKey(),
trade.getSelf().getPaymentAccountKey());
// update trade state
diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/TakerReserveTradeFunds.java b/core/src/main/java/haveno/core/trade/protocol/tasks/TakerReserveTradeFunds.java
index 5ab91343aa..e6c71032f4 100644
--- a/core/src/main/java/haveno/core/trade/protocol/tasks/TakerReserveTradeFunds.java
+++ b/core/src/main/java/haveno/core/trade/protocol/tasks/TakerReserveTradeFunds.java
@@ -47,62 +47,63 @@ public class TakerReserveTradeFunds extends TradeTask {
throw new RuntimeException("Expected taker trade but was " + trade.getClass().getSimpleName() + " " + trade.getShortId() + ". That should never happen.");
}
- // create reserve tx
+ // create reserve tx unless deposit not required from buyer as taker
MoneroTxWallet reserveTx = null;
- synchronized (HavenoUtils.xmrWalletService.getWalletLock()) {
+ if (!trade.isBuyerAsTakerWithoutDeposit()) {
+ synchronized (HavenoUtils.xmrWalletService.getWalletLock()) {
- // check for timeout
- if (isTimedOut()) throw new RuntimeException("Trade protocol has timed out while getting lock to create reserve tx, tradeId=" + trade.getShortId());
- trade.startProtocolTimeout();
+ // check for timeout
+ if (isTimedOut()) throw new RuntimeException("Trade protocol has timed out while getting lock to create reserve tx, tradeId=" + trade.getShortId());
+ trade.startProtocolTimeout();
- // collect relevant info
- BigInteger penaltyFee = HavenoUtils.multiply(trade.getAmount(), trade.getOffer().getPenaltyFeePct());
- BigInteger takerFee = trade.getTakerFee();
- BigInteger sendAmount = trade.getOffer().getDirection() == OfferDirection.BUY ? trade.getAmount() : BigInteger.ZERO;
- BigInteger securityDeposit = trade.getOffer().getDirection() == OfferDirection.BUY ? trade.getSellerSecurityDepositBeforeMiningFee() : trade.getBuyerSecurityDepositBeforeMiningFee();
- String returnAddress = trade.getXmrWalletService().getOrCreateAddressEntry(trade.getOffer().getId(), XmrAddressEntry.Context.TRADE_PAYOUT).getAddressString();
+ // collect relevant info
+ BigInteger penaltyFee = HavenoUtils.multiply(trade.getAmount(), trade.getOffer().getPenaltyFeePct());
+ BigInteger takerFee = trade.getTakerFee();
+ BigInteger sendAmount = trade.getOffer().getDirection() == OfferDirection.BUY ? trade.getAmount() : BigInteger.ZERO;
+ BigInteger securityDeposit = trade.getSecurityDepositBeforeMiningFee();
+ String returnAddress = trade.getXmrWalletService().getOrCreateAddressEntry(trade.getOffer().getId(), XmrAddressEntry.Context.TRADE_PAYOUT).getAddressString();
- // attempt creating reserve tx
- try {
- synchronized (HavenoUtils.getWalletFunctionLock()) {
- for (int i = 0; i < TradeProtocol.MAX_ATTEMPTS; i++) {
- MoneroRpcConnection sourceConnection = trade.getXmrConnectionService().getConnection();
- try {
- reserveTx = model.getXmrWalletService().createReserveTx(penaltyFee, takerFee, sendAmount, securityDeposit, returnAddress, false, null);
- } catch (Exception e) {
- log.warn("Error creating reserve tx, tradeId={}, attempt={}/{}, error={}", trade.getShortId(), i + 1, TradeProtocol.MAX_ATTEMPTS, e.getMessage());
- trade.getXmrWalletService().handleWalletError(e, sourceConnection);
+ // attempt creating reserve tx
+ try {
+ synchronized (HavenoUtils.getWalletFunctionLock()) {
+ for (int i = 0; i < TradeProtocol.MAX_ATTEMPTS; i++) {
+ MoneroRpcConnection sourceConnection = trade.getXmrConnectionService().getConnection();
+ try {
+ reserveTx = model.getXmrWalletService().createReserveTx(penaltyFee, takerFee, sendAmount, securityDeposit, returnAddress, false, null);
+ } catch (Exception e) {
+ log.warn("Error creating reserve tx, tradeId={}, attempt={}/{}, error={}", trade.getShortId(), i + 1, TradeProtocol.MAX_ATTEMPTS, e.getMessage());
+ trade.getXmrWalletService().handleWalletError(e, sourceConnection);
+ if (isTimedOut()) throw new RuntimeException("Trade protocol has timed out while creating reserve tx, tradeId=" + trade.getShortId());
+ if (i == TradeProtocol.MAX_ATTEMPTS - 1) throw e;
+ HavenoUtils.waitFor(TradeProtocol.REPROCESS_DELAY_MS); // wait before retrying
+ }
+
+ // check for timeout
if (isTimedOut()) throw new RuntimeException("Trade protocol has timed out while creating reserve tx, tradeId=" + trade.getShortId());
- if (i == TradeProtocol.MAX_ATTEMPTS - 1) throw e;
- HavenoUtils.waitFor(TradeProtocol.REPROCESS_DELAY_MS); // wait before retrying
+ if (reserveTx != null) break;
}
-
- // check for timeout
- if (isTimedOut()) throw new RuntimeException("Trade protocol has timed out while creating reserve tx, tradeId=" + trade.getShortId());
- if (reserveTx != null) break;
}
- }
- } catch (Exception e) {
+ } catch (Exception e) {
- // reset state with wallet lock
- model.getXmrWalletService().resetAddressEntriesForTrade(trade.getId());
- if (reserveTx != null) {
- model.getXmrWalletService().thawOutputs(HavenoUtils.getInputKeyImages(reserveTx));
- trade.getSelf().setReserveTxKeyImages(null);
+ // reset state with wallet lock
+ model.getXmrWalletService().resetAddressEntriesForTrade(trade.getId());
+ if (reserveTx != null) {
+ model.getXmrWalletService().thawOutputs(HavenoUtils.getInputKeyImages(reserveTx));
+ trade.getSelf().setReserveTxKeyImages(null);
+ }
+
+ throw e;
}
- throw e;
+ // reset protocol timeout
+ trade.startProtocolTimeout();
+
+ // update trade state
+ trade.getTaker().setReserveTxHash(reserveTx.getHash());
+ trade.getTaker().setReserveTxHex(reserveTx.getFullHex());
+ trade.getTaker().setReserveTxKey(reserveTx.getKey());
+ trade.getTaker().setReserveTxKeyImages(HavenoUtils.getInputKeyImages(reserveTx));
}
-
-
- // reset protocol timeout
- trade.startProtocolTimeout();
-
- // update trade state
- trade.getTaker().setReserveTxHash(reserveTx.getHash());
- trade.getTaker().setReserveTxHex(reserveTx.getFullHex());
- trade.getTaker().setReserveTxKey(reserveTx.getKey());
- trade.getTaker().setReserveTxKeyImages(HavenoUtils.getInputKeyImages(reserveTx));
}
// save process state
diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/TakerSendInitTradeRequestToArbitrator.java b/core/src/main/java/haveno/core/trade/protocol/tasks/TakerSendInitTradeRequestToArbitrator.java
index b5a6e3624c..eb86f15109 100644
--- a/core/src/main/java/haveno/core/trade/protocol/tasks/TakerSendInitTradeRequestToArbitrator.java
+++ b/core/src/main/java/haveno/core/trade/protocol/tasks/TakerSendInitTradeRequestToArbitrator.java
@@ -48,7 +48,9 @@ public class TakerSendInitTradeRequestToArbitrator extends TradeTask {
InitTradeRequest sourceRequest = (InitTradeRequest) processModel.getTradeMessage(); // arbitrator's InitTradeRequest to taker
checkNotNull(sourceRequest);
checkTradeId(processModel.getOfferId(), sourceRequest);
- if (trade.getSelf().getReserveTxHash() == null || trade.getSelf().getReserveTxHash().isEmpty()) throw new IllegalStateException("Reserve tx id is not initialized: " + trade.getSelf().getReserveTxHash());
+ if (!trade.isBuyerAsTakerWithoutDeposit() && trade.getSelf().getReserveTxHash() == null) {
+ throw new IllegalStateException("Taker reserve tx id is not initialized: " + trade.getSelf().getReserveTxHash());
+ }
// create request to arbitrator
Offer offer = processModel.getOffer();
@@ -73,7 +75,8 @@ public class TakerSendInitTradeRequestToArbitrator extends TradeTask {
trade.getSelf().getReserveTxHash(),
trade.getSelf().getReserveTxHex(),
trade.getSelf().getReserveTxKey(),
- model.getXmrWalletService().getAddressEntry(offer.getId(), XmrAddressEntry.Context.TRADE_PAYOUT).get().getAddressString());
+ model.getXmrWalletService().getAddressEntry(offer.getId(), XmrAddressEntry.Context.TRADE_PAYOUT).get().getAddressString(),
+ trade.getChallenge());
// send request to arbitrator
log.info("Sending {} with offerId {} and uid {} to arbitrator {}", arbitratorRequest.getClass().getSimpleName(), arbitratorRequest.getOfferId(), arbitratorRequest.getUid(), trade.getArbitrator().getNodeAddress());
diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/TakerSendInitTradeRequestToMaker.java b/core/src/main/java/haveno/core/trade/protocol/tasks/TakerSendInitTradeRequestToMaker.java
index c6315eb174..1118cc34a7 100644
--- a/core/src/main/java/haveno/core/trade/protocol/tasks/TakerSendInitTradeRequestToMaker.java
+++ b/core/src/main/java/haveno/core/trade/protocol/tasks/TakerSendInitTradeRequestToMaker.java
@@ -47,7 +47,9 @@ public class TakerSendInitTradeRequestToMaker extends TradeTask {
runInterceptHook();
// verify trade state
- if (trade.getSelf().getReserveTxHash() == null || trade.getSelf().getReserveTxHash().isEmpty()) throw new IllegalStateException("Reserve tx id is not initialized: " + trade.getSelf().getReserveTxHash());
+ if (!trade.isBuyerAsTakerWithoutDeposit() && trade.getSelf().getReserveTxHash() == null) {
+ throw new IllegalStateException("Taker reserve tx id is not initialized: " + trade.getSelf().getReserveTxHash());
+ }
// collect fields
Offer offer = model.getOffer();
@@ -55,6 +57,7 @@ public class TakerSendInitTradeRequestToMaker extends TradeTask {
P2PService p2PService = processModel.getP2PService();
XmrWalletService walletService = model.getXmrWalletService();
String payoutAddress = walletService.getOrCreateAddressEntry(offer.getId(), XmrAddressEntry.Context.TRADE_PAYOUT).getAddressString();
+ String challenge = model.getChallenge();
// taker signs offer using offer id as nonce to avoid challenge protocol
byte[] sig = HavenoUtils.sign(p2PService.getKeyRing(), offer.getId());
@@ -81,7 +84,8 @@ public class TakerSendInitTradeRequestToMaker extends TradeTask {
null, // reserve tx not sent from taker to maker
null,
null,
- payoutAddress);
+ payoutAddress,
+ challenge);
// send request to maker
log.info("Sending {} with offerId {} and uid {} to maker {}", makerRequest.getClass().getSimpleName(), makerRequest.getOfferId(), makerRequest.getUid(), trade.getMaker().getNodeAddress());
diff --git a/core/src/main/java/haveno/core/user/Preferences.java b/core/src/main/java/haveno/core/user/Preferences.java
index 3c09126c56..a3756041bf 100644
--- a/core/src/main/java/haveno/core/user/Preferences.java
+++ b/core/src/main/java/haveno/core/user/Preferences.java
@@ -616,14 +616,14 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid
requestPersistence();
}
- public void setBuyerSecurityDepositAsPercent(double buyerSecurityDepositAsPercent, PaymentAccount paymentAccount) {
- double max = Restrictions.getMaxBuyerSecurityDepositAsPercent();
- double min = Restrictions.getMinBuyerSecurityDepositAsPercent();
+ public void setSecurityDepositAsPercent(double securityDepositAsPercent, PaymentAccount paymentAccount) {
+ double max = Restrictions.getMaxSecurityDepositAsPercent();
+ double min = Restrictions.getMinSecurityDepositAsPercent();
if (PaymentAccountUtil.isCryptoCurrencyAccount(paymentAccount))
- prefPayload.setBuyerSecurityDepositAsPercentForCrypto(Math.min(max, Math.max(min, buyerSecurityDepositAsPercent)));
+ prefPayload.setSecurityDepositAsPercentForCrypto(Math.min(max, Math.max(min, securityDepositAsPercent)));
else
- prefPayload.setBuyerSecurityDepositAsPercent(Math.min(max, Math.max(min, buyerSecurityDepositAsPercent)));
+ prefPayload.setSecurityDepositAsPercent(Math.min(max, Math.max(min, securityDepositAsPercent)));
requestPersistence();
}
@@ -755,6 +755,11 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid
requestPersistence();
}
+ public void setShowPrivateOffers(boolean value) {
+ prefPayload.setShowPrivateOffers(value);
+ requestPersistence();
+ }
+
public void setDenyApiTaker(boolean value) {
prefPayload.setDenyApiTaker(value);
requestPersistence();
@@ -838,16 +843,16 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid
return prefPayload.isSplitOfferOutput();
}
- public double getBuyerSecurityDepositAsPercent(PaymentAccount paymentAccount) {
+ public double getSecurityDepositAsPercent(PaymentAccount paymentAccount) {
double value = PaymentAccountUtil.isCryptoCurrencyAccount(paymentAccount) ?
- prefPayload.getBuyerSecurityDepositAsPercentForCrypto() : prefPayload.getBuyerSecurityDepositAsPercent();
+ prefPayload.getSecurityDepositAsPercentForCrypto() : prefPayload.getSecurityDepositAsPercent();
- if (value < Restrictions.getMinBuyerSecurityDepositAsPercent()) {
- value = Restrictions.getMinBuyerSecurityDepositAsPercent();
- setBuyerSecurityDepositAsPercent(value, paymentAccount);
+ if (value < Restrictions.getMinSecurityDepositAsPercent()) {
+ value = Restrictions.getMinSecurityDepositAsPercent();
+ setSecurityDepositAsPercent(value, paymentAccount);
}
- return value == 0 ? Restrictions.getDefaultBuyerSecurityDepositAsPercent() : value;
+ return value == 0 ? Restrictions.getDefaultSecurityDepositAsPercent() : value;
}
@Override
diff --git a/core/src/main/java/haveno/core/user/PreferencesPayload.java b/core/src/main/java/haveno/core/user/PreferencesPayload.java
index 6d3d41f30f..44e6aef509 100644
--- a/core/src/main/java/haveno/core/user/PreferencesPayload.java
+++ b/core/src/main/java/haveno/core/user/PreferencesPayload.java
@@ -41,7 +41,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
-import static haveno.core.xmr.wallet.Restrictions.getDefaultBuyerSecurityDepositAsPercent;
+import static haveno.core.xmr.wallet.Restrictions.getDefaultSecurityDepositAsPercent;
@Slf4j
@Data
@@ -120,10 +120,10 @@ public final class PreferencesPayload implements PersistableEnvelope {
private String rpcPw;
@Nullable
private String takeOfferSelectedPaymentAccountId;
- private double buyerSecurityDepositAsPercent = getDefaultBuyerSecurityDepositAsPercent();
+ private double securityDepositAsPercent = getDefaultSecurityDepositAsPercent();
private int ignoreDustThreshold = 600;
private int clearDataAfterDays = Preferences.CLEAR_DATA_AFTER_DAYS_INITIAL;
- private double buyerSecurityDepositAsPercentForCrypto = getDefaultBuyerSecurityDepositAsPercent();
+ private double securityDepositAsPercentForCrypto = getDefaultSecurityDepositAsPercent();
private int blockNotifyPort;
private boolean tacAcceptedV120;
private double bsqAverageTrimThreshold = 0.05;
@@ -134,6 +134,7 @@ public final class PreferencesPayload implements PersistableEnvelope {
// Added in 1.5.5
private boolean hideNonAccountPaymentMethods;
private boolean showOffersMatchingMyAccounts;
+ private boolean showPrivateOffers;
private boolean denyApiTaker;
private boolean notifyOnPreRelease;
@@ -193,10 +194,10 @@ public final class PreferencesPayload implements PersistableEnvelope {
.setUseStandbyMode(useStandbyMode)
.setUseSoundForNotifications(useSoundForNotifications)
.setUseSoundForNotificationsInitialized(useSoundForNotificationsInitialized)
- .setBuyerSecurityDepositAsPercent(buyerSecurityDepositAsPercent)
+ .setSecurityDepositAsPercent(securityDepositAsPercent)
.setIgnoreDustThreshold(ignoreDustThreshold)
.setClearDataAfterDays(clearDataAfterDays)
- .setBuyerSecurityDepositAsPercentForCrypto(buyerSecurityDepositAsPercentForCrypto)
+ .setSecurityDepositAsPercentForCrypto(securityDepositAsPercentForCrypto)
.setBlockNotifyPort(blockNotifyPort)
.setTacAcceptedV120(tacAcceptedV120)
.setBsqAverageTrimThreshold(bsqAverageTrimThreshold)
@@ -205,6 +206,7 @@ public final class PreferencesPayload implements PersistableEnvelope {
.collect(Collectors.toList()))
.setHideNonAccountPaymentMethods(hideNonAccountPaymentMethods)
.setShowOffersMatchingMyAccounts(showOffersMatchingMyAccounts)
+ .setShowPrivateOffers(showPrivateOffers)
.setDenyApiTaker(denyApiTaker)
.setNotifyOnPreRelease(notifyOnPreRelease);
@@ -297,10 +299,10 @@ public final class PreferencesPayload implements PersistableEnvelope {
proto.getRpcUser().isEmpty() ? null : proto.getRpcUser(),
proto.getRpcPw().isEmpty() ? null : proto.getRpcPw(),
proto.getTakeOfferSelectedPaymentAccountId().isEmpty() ? null : proto.getTakeOfferSelectedPaymentAccountId(),
- proto.getBuyerSecurityDepositAsPercent(),
+ proto.getSecurityDepositAsPercent(),
proto.getIgnoreDustThreshold(),
proto.getClearDataAfterDays(),
- proto.getBuyerSecurityDepositAsPercentForCrypto(),
+ proto.getSecurityDepositAsPercentForCrypto(),
proto.getBlockNotifyPort(),
proto.getTacAcceptedV120(),
proto.getBsqAverageTrimThreshold(),
@@ -310,6 +312,7 @@ public final class PreferencesPayload implements PersistableEnvelope {
.collect(Collectors.toList())),
proto.getHideNonAccountPaymentMethods(),
proto.getShowOffersMatchingMyAccounts(),
+ proto.getShowPrivateOffers(),
proto.getDenyApiTaker(),
proto.getNotifyOnPreRelease(),
XmrNodeSettings.fromProto(proto.getXmrNodeSettings())
diff --git a/core/src/main/java/haveno/core/util/PriceUtil.java b/core/src/main/java/haveno/core/util/PriceUtil.java
index 35a6b0bec8..a91b13c85c 100644
--- a/core/src/main/java/haveno/core/util/PriceUtil.java
+++ b/core/src/main/java/haveno/core/util/PriceUtil.java
@@ -22,7 +22,6 @@ import com.google.inject.Inject;
import com.google.inject.Singleton;
import haveno.common.util.MathUtils;
import haveno.core.locale.CurrencyUtil;
-import haveno.core.locale.Res;
import haveno.core.monetary.CryptoMoney;
import haveno.core.monetary.Price;
import haveno.core.monetary.TraditionalMoney;
@@ -69,27 +68,8 @@ public class PriceUtil {
if (!result.isValid) {
return result;
}
-
- long triggerPriceAsLong = PriceUtil.getMarketPriceAsLong(triggerPriceAsString, marketPrice.getCurrencyCode());
- long marketPriceAsLong = PriceUtil.getMarketPriceAsLong("" + marketPrice.getPrice(), marketPrice.getCurrencyCode());
- String marketPriceAsString = FormattingUtils.formatMarketPrice(marketPrice.getPrice(), marketPrice.getCurrencyCode());
-
- boolean isCryptoCurrency = CurrencyUtil.isCryptoCurrency(currencyCode);
- if ((isSellOffer && !isCryptoCurrency) || (!isSellOffer && isCryptoCurrency)) {
- if (triggerPriceAsLong >= marketPriceAsLong) {
- return new InputValidator.ValidationResult(false,
- Res.get("createOffer.triggerPrice.invalid.tooHigh", marketPriceAsString));
- } else {
- return new InputValidator.ValidationResult(true);
- }
- } else {
- if (triggerPriceAsLong <= marketPriceAsLong) {
- return new InputValidator.ValidationResult(false,
- Res.get("createOffer.triggerPrice.invalid.tooLow", marketPriceAsString));
- } else {
- return new InputValidator.ValidationResult(true);
- }
- }
+
+ return new InputValidator.ValidationResult(true);
}
public static Price marketPriceToPrice(MarketPrice marketPrice) {
diff --git a/core/src/main/java/haveno/core/util/coin/CoinUtil.java b/core/src/main/java/haveno/core/util/coin/CoinUtil.java
index ec7ff113e0..6c163ede6a 100644
--- a/core/src/main/java/haveno/core/util/coin/CoinUtil.java
+++ b/core/src/main/java/haveno/core/util/coin/CoinUtil.java
@@ -47,46 +47,46 @@ public class CoinUtil {
}
/**
- * @param value Btc amount to be converted to percent value. E.g. 0.01 BTC is 1% (of 1 BTC)
+ * @param value Xmr amount to be converted to percent value. E.g. 0.01 XMR is 1% (of 1 XMR)
* @return The percentage value as double (e.g. 1% is 0.01)
*/
- public static double getAsPercentPerBtc(BigInteger value) {
- return getAsPercentPerBtc(value, HavenoUtils.xmrToAtomicUnits(1.0));
+ public static double getAsPercentPerXmr(BigInteger value) {
+ return getAsPercentPerXmr(value, HavenoUtils.xmrToAtomicUnits(1.0));
}
/**
- * @param part Btc amount to be converted to percent value, based on total value passed.
- * E.g. 0.1 BTC is 25% (of 0.4 BTC)
- * @param total Total Btc amount the percentage part is calculated from
+ * @param part Xmr amount to be converted to percent value, based on total value passed.
+ * E.g. 0.1 XMR is 25% (of 0.4 XMR)
+ * @param total Total Xmr amount the percentage part is calculated from
*
* @return The percentage value as double (e.g. 1% is 0.01)
*/
- public static double getAsPercentPerBtc(BigInteger part, BigInteger total) {
+ public static double getAsPercentPerXmr(BigInteger part, BigInteger total) {
return MathUtils.roundDouble(HavenoUtils.divide(part == null ? BigInteger.ZERO : part, total == null ? BigInteger.valueOf(1) : total), 4);
}
/**
* @param percent The percentage value as double (e.g. 1% is 0.01)
* @param amount The amount as atomic units for the percentage calculation
- * @return The percentage as atomic units (e.g. 1% of 1 BTC is 0.01 BTC)
+ * @return The percentage as atomic units (e.g. 1% of 1 XMR is 0.01 XMR)
*/
public static BigInteger getPercentOfAmount(double percent, BigInteger amount) {
if (amount == null) amount = BigInteger.ZERO;
return BigDecimal.valueOf(percent).multiply(new BigDecimal(amount)).setScale(8, RoundingMode.DOWN).toBigInteger();
}
- public static BigInteger getRoundedAmount(BigInteger amount, Price price, long maxTradeLimit, String currencyCode, String paymentMethodId) {
- if (PaymentMethod.isRoundedForAtmCash(paymentMethodId)) {
- return getRoundedAtmCashAmount(amount, price, maxTradeLimit);
- } else if (CurrencyUtil.isVolumeRoundedToNearestUnit(currencyCode)) {
- return getRoundedAmountUnit(amount, price, maxTradeLimit);
- } else if (CurrencyUtil.isFiatCurrency(currencyCode)) {
- return getRoundedAmount4Decimals(amount, price, maxTradeLimit);
+ public static BigInteger getRoundedAmount(BigInteger amount, Price price, Long maxTradeLimit, String currencyCode, String paymentMethodId) {
+ if (price != null) {
+ if (PaymentMethod.isRoundedForAtmCash(paymentMethodId)) {
+ return getRoundedAtmCashAmount(amount, price, maxTradeLimit);
+ } else if (CurrencyUtil.isVolumeRoundedToNearestUnit(currencyCode)) {
+ return getRoundedAmountUnit(amount, price, maxTradeLimit);
+ }
}
- return amount;
+ return getRoundedAmount4Decimals(amount, maxTradeLimit);
}
- public static BigInteger getRoundedAtmCashAmount(BigInteger amount, Price price, long maxTradeLimit) {
+ public static BigInteger getRoundedAtmCashAmount(BigInteger amount, Price price, Long maxTradeLimit) {
return getAdjustedAmount(amount, price, maxTradeLimit, 10);
}
@@ -99,12 +99,12 @@ public class CoinUtil {
* @param maxTradeLimit The max. trade limit of the users account, in atomic units.
* @return The adjusted amount
*/
- public static BigInteger getRoundedAmountUnit(BigInteger amount, Price price, long maxTradeLimit) {
+ public static BigInteger getRoundedAmountUnit(BigInteger amount, Price price, Long maxTradeLimit) {
return getAdjustedAmount(amount, price, maxTradeLimit, 1);
}
- public static BigInteger getRoundedAmount4Decimals(BigInteger amount, Price price, long maxTradeLimit) {
- DecimalFormat decimalFormat = new DecimalFormat("#.####");
+ public static BigInteger getRoundedAmount4Decimals(BigInteger amount, Long maxTradeLimit) {
+ DecimalFormat decimalFormat = new DecimalFormat("#.####", HavenoUtils.DECIMAL_FORMAT_SYMBOLS);
double roundedXmrAmount = Double.parseDouble(decimalFormat.format(HavenoUtils.atomicUnitsToXmr(amount)));
return HavenoUtils.xmrToAtomicUnits(roundedXmrAmount);
}
@@ -121,7 +121,7 @@ public class CoinUtil {
* @return The adjusted amount
*/
@VisibleForTesting
- static BigInteger getAdjustedAmount(BigInteger amount, Price price, long maxTradeLimit, int factor) {
+ static BigInteger getAdjustedAmount(BigInteger amount, Price price, Long maxTradeLimit, int factor) {
checkArgument(
amount.longValueExact() >= Restrictions.getMinTradeAmount().longValueExact(),
"amount needs to be above minimum of " + HavenoUtils.atomicUnitsToXmr(Restrictions.getMinTradeAmount()) + " xmr"
@@ -163,11 +163,13 @@ public class CoinUtil {
// If we are above our trade limit we reduce the amount by the smallestUnitForAmount
BigInteger smallestUnitForAmountUnadjusted = price.getAmountByVolume(smallestUnitForVolume);
- while (adjustedAmount > maxTradeLimit) {
- adjustedAmount -= smallestUnitForAmountUnadjusted.longValueExact();
+ if (maxTradeLimit != null) {
+ while (adjustedAmount > maxTradeLimit) {
+ adjustedAmount -= smallestUnitForAmountUnadjusted.longValueExact();
+ }
}
adjustedAmount = Math.max(minTradeAmount, adjustedAmount);
- adjustedAmount = Math.min(maxTradeLimit, adjustedAmount);
+ if (maxTradeLimit != null) adjustedAmount = Math.min(maxTradeLimit, adjustedAmount);
return BigInteger.valueOf(adjustedAmount);
}
}
diff --git a/core/src/main/java/haveno/core/xmr/wallet/Restrictions.java b/core/src/main/java/haveno/core/xmr/wallet/Restrictions.java
index a70d2cc1f3..b270762d3b 100644
--- a/core/src/main/java/haveno/core/xmr/wallet/Restrictions.java
+++ b/core/src/main/java/haveno/core/xmr/wallet/Restrictions.java
@@ -24,11 +24,13 @@ import org.bitcoinj.core.Coin;
import java.math.BigInteger;
public class Restrictions {
+
+ // configure restrictions
+ public static final double MIN_SECURITY_DEPOSIT_PCT = 0.15;
+ public static final double MAX_SECURITY_DEPOSIT_PCT = 0.5;
public static BigInteger MIN_TRADE_AMOUNT = HavenoUtils.xmrToAtomicUnits(0.1);
- public static BigInteger MIN_BUYER_SECURITY_DEPOSIT = HavenoUtils.xmrToAtomicUnits(0.1);
- // For the seller we use a fixed one as there is no way the seller can cancel the trade
- // To make it editable would just increase complexity.
- public static BigInteger MIN_SELLER_SECURITY_DEPOSIT = MIN_BUYER_SECURITY_DEPOSIT;
+ public static BigInteger MIN_SECURITY_DEPOSIT = HavenoUtils.xmrToAtomicUnits(0.1);
+
// At mediation we require a min. payout to the losing party to keep incentive for the trader to accept the
// mediated payout. For Refund agent cases we do not have that restriction.
private static BigInteger MIN_REFUND_AT_MEDIATED_DISPUTE;
@@ -53,31 +55,20 @@ public class Restrictions {
return MIN_TRADE_AMOUNT;
}
- public static double getDefaultBuyerSecurityDepositAsPercent() {
- return 0.15; // 15% of trade amount.
+ public static double getDefaultSecurityDepositAsPercent() {
+ return MIN_SECURITY_DEPOSIT_PCT;
}
- public static double getMinBuyerSecurityDepositAsPercent() {
- return 0.15; // 15% of trade amount.
+ public static double getMinSecurityDepositAsPercent() {
+ return MIN_SECURITY_DEPOSIT_PCT;
}
- public static double getMaxBuyerSecurityDepositAsPercent() {
- return 0.5; // 50% of trade amount. For a 1 BTC trade it is about 3500 USD @ 7000 USD/BTC
+ public static double getMaxSecurityDepositAsPercent() {
+ return MAX_SECURITY_DEPOSIT_PCT;
}
- // We use MIN_BUYER_SECURITY_DEPOSIT as well as lower bound in case of small trade amounts.
- // So 0.0005 BTC is the min. buyer security deposit even with amount of 0.0001 BTC and 0.05% percentage value.
- public static BigInteger getMinBuyerSecurityDeposit() {
- return MIN_BUYER_SECURITY_DEPOSIT;
- }
-
-
- public static double getSellerSecurityDepositAsPercent() {
- return 0.15; // 15% of trade amount.
- }
-
- public static BigInteger getMinSellerSecurityDeposit() {
- return MIN_SELLER_SECURITY_DEPOSIT;
+ public static BigInteger getMinSecurityDeposit() {
+ return MIN_SECURITY_DEPOSIT;
}
// This value must be lower than MIN_BUYER_SECURITY_DEPOSIT and SELLER_SECURITY_DEPOSIT
diff --git a/core/src/main/java/haveno/core/xmr/wallet/XmrWalletBase.java b/core/src/main/java/haveno/core/xmr/wallet/XmrWalletBase.java
index 81eada3295..3f4ba3aa03 100644
--- a/core/src/main/java/haveno/core/xmr/wallet/XmrWalletBase.java
+++ b/core/src/main/java/haveno/core/xmr/wallet/XmrWalletBase.java
@@ -17,6 +17,7 @@ import javafx.beans.property.LongProperty;
import javafx.beans.property.SimpleLongProperty;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
+import monero.common.MoneroRpcConnection;
import monero.common.TaskLooper;
import monero.daemon.model.MoneroTx;
import monero.wallet.MoneroWallet;
@@ -24,16 +25,18 @@ import monero.wallet.MoneroWalletFull;
import monero.wallet.model.MoneroWalletListener;
@Slf4j
-public class XmrWalletBase {
+public abstract class XmrWalletBase {
// constants
public static final int SYNC_PROGRESS_TIMEOUT_SECONDS = 120;
public static final int DIRECT_SYNC_WITHIN_BLOCKS = 100;
+ public static final int SAVE_WALLET_DELAY_SECONDS = 300;
// inherited
protected MoneroWallet wallet;
@Getter
protected final Object walletLock = new Object();
+ protected Timer saveWalletDelayTimer;
@Getter
protected XmrConnectionService xmrConnectionService;
protected boolean wasWalletSynced;
@@ -137,6 +140,34 @@ public class XmrWalletBase {
}
}
+ public boolean requestSwitchToNextBestConnection(MoneroRpcConnection sourceConnection) {
+ if (xmrConnectionService.requestSwitchToNextBestConnection(sourceConnection)) {
+ onConnectionChanged(xmrConnectionService.getConnection()); // change connection on same thread
+ return true;
+ }
+ return false;
+ }
+
+ public void saveWalletWithDelay() {
+ // delay writing to disk to avoid frequent write operations
+ if (saveWalletDelayTimer == null) {
+ saveWalletDelayTimer = UserThread.runAfter(() -> {
+ requestSaveWallet();
+ UserThread.execute(() -> saveWalletDelayTimer = null);
+ }, SAVE_WALLET_DELAY_SECONDS, TimeUnit.SECONDS);
+ }
+ }
+
+ // --------------------------------- ABSTRACT -----------------------------
+
+ public abstract void saveWallet();
+
+ public abstract void requestSaveWallet();
+
+ protected abstract void onConnectionChanged(MoneroRpcConnection connection);
+
+ // ------------------------------ PRIVATE HELPERS -------------------------
+
private void updateSyncProgress(long height, long targetHeight) {
resetSyncProgressTimeout();
UserThread.execute(() -> {
diff --git a/core/src/main/java/haveno/core/xmr/wallet/XmrWalletService.java b/core/src/main/java/haveno/core/xmr/wallet/XmrWalletService.java
index 79e9248c64..0592fbdd59 100644
--- a/core/src/main/java/haveno/core/xmr/wallet/XmrWalletService.java
+++ b/core/src/main/java/haveno/core/xmr/wallet/XmrWalletService.java
@@ -112,7 +112,7 @@ public class XmrWalletService extends XmrWalletBase {
public static final String MONERO_WALLET_RPC_NAME = Utilities.isWindows() ? "monero-wallet-rpc.exe" : "monero-wallet-rpc";
public static final String MONERO_WALLET_RPC_PATH = MONERO_BINS_DIR + File.separator + MONERO_WALLET_RPC_NAME;
public static final double MINER_FEE_TOLERANCE = 0.25; // miner fee must be within percent of estimated fee
- public static final MoneroTxPriority PROTOCOL_FEE_PRIORITY = MoneroTxPriority.ELEVATED;
+ public static final MoneroTxPriority PROTOCOL_FEE_PRIORITY = MoneroTxPriority.DEFAULT;
public static final int MONERO_LOG_LEVEL = -1; // monero library log level, -1 to disable
private static final MoneroNetworkType MONERO_NETWORK_TYPE = getMoneroNetworkType();
private static final MoneroWalletRpcManager MONERO_WALLET_RPC_MANAGER = new MoneroWalletRpcManager();
@@ -245,16 +245,20 @@ public class XmrWalletService extends XmrWalletBase {
return user.getWalletCreationDate();
}
- public void saveMainWallet() {
- saveMainWallet(!(Utilities.isWindows() && wallet != null));
+ @Override
+ public void saveWallet() {
+ saveWallet(!(Utilities.isWindows() && wallet != null));
}
- public void saveMainWallet(boolean backup) {
- saveWallet(getWallet(), backup);
+ public void saveWallet(boolean backup) {
+ synchronized (walletLock) {
+ saveWallet(getWallet(), backup);
+ }
}
- public void requestSaveMainWallet() {
- ThreadUtils.submitToPool(() -> saveMainWallet()); // save wallet off main thread
+ @Override
+ public void requestSaveWallet() {
+ ThreadUtils.submitToPool(() -> saveWallet()); // save wallet off main thread
}
public boolean isWalletAvailable() {
@@ -376,8 +380,8 @@ public class XmrWalletService extends XmrWalletBase {
}
public void saveWallet(MoneroWallet wallet, boolean backup) {
- wallet.save();
if (backup) backupWallet(getWalletName(wallet.getPath()));
+ wallet.save();
}
public void closeWallet(MoneroWallet wallet, boolean save) {
@@ -385,8 +389,8 @@ public class XmrWalletService extends XmrWalletBase {
MoneroError err = null;
String path = wallet.getPath();
try {
- wallet.close(save);
- if (save) backupWallet(getWalletName(path));
+ if (save) saveWallet(wallet, true);
+ wallet.close();
} catch (MoneroError e) {
err = e;
}
@@ -411,7 +415,7 @@ public class XmrWalletService extends XmrWalletBase {
public void deleteWallet(String walletName) {
assertNotPath(walletName);
log.info("{}.deleteWallet({})", getClass().getSimpleName(), walletName);
- if (!walletExists(walletName)) throw new Error("Wallet does not exist at path: " + walletName);
+ if (!walletExists(walletName)) throw new RuntimeException("Wallet does not exist at path: " + walletName);
String path = walletDir.toString() + File.separator + walletName;
if (!new File(path).delete()) throw new RuntimeException("Failed to delete wallet cache file: " + path);
if (!new File(path + KEYS_FILE_POSTFIX).delete()) throw new RuntimeException("Failed to delete wallet keys file: " + path + KEYS_FILE_POSTFIX);
@@ -443,7 +447,7 @@ public class XmrWalletService extends XmrWalletBase {
if (Boolean.TRUE.equals(txConfig.getRelay())) {
cachedTxs.addFirst(tx);
cacheWalletInfo();
- requestSaveMainWallet();
+ requestSaveWallet();
}
return tx;
}
@@ -453,7 +457,7 @@ public class XmrWalletService extends XmrWalletBase {
public String relayTx(String metadata) {
synchronized (walletLock) {
String txId = wallet.relayTx(metadata);
- requestSaveMainWallet();
+ requestSaveWallet();
return txId;
}
}
@@ -552,7 +556,7 @@ public class XmrWalletService extends XmrWalletBase {
// freeze outputs
for (String keyImage : unfrozenKeyImages) wallet.freezeOutput(keyImage);
cacheWalletInfo();
- requestSaveMainWallet();
+ requestSaveWallet();
}
}
@@ -574,19 +578,10 @@ public class XmrWalletService extends XmrWalletBase {
// thaw outputs
for (String keyImage : frozenKeyImages) wallet.thawOutput(keyImage);
cacheWalletInfo();
- requestSaveMainWallet();
+ requestSaveWallet();
}
}
- public BigInteger getOutputsAmount(Collection keyImages) {
- BigInteger sum = BigInteger.ZERO;
- for (String keyImage : keyImages) {
- List outputs = getOutputs(new MoneroOutputQuery().setIsSpent(false).setKeyImage(new MoneroKeyImage(keyImage)));
- if (!outputs.isEmpty()) sum = sum.add(outputs.get(0).getAmount());
- }
- return sum;
- }
-
private List getSubaddressesWithExactInput(BigInteger amount) {
// fetch unspent, unfrozen, unlocked outputs
@@ -760,16 +755,16 @@ public class XmrWalletService extends XmrWalletBase {
if (keyImages != null) {
Set txKeyImages = new HashSet();
for (MoneroOutput input : tx.getInputs()) txKeyImages.add(input.getKeyImage().getHex());
- if (!txKeyImages.equals(new HashSet(keyImages))) throw new Error("Tx inputs do not match claimed key images");
+ if (!txKeyImages.equals(new HashSet(keyImages))) throw new RuntimeException("Tx inputs do not match claimed key images");
}
// verify unlock height
if (!BigInteger.ZERO.equals(tx.getUnlockTime())) throw new RuntimeException("Unlock height must be 0");
// verify miner fee
- BigInteger minerFeeEstimate = getElevatedFeeEstimate(tx.getWeight());
+ BigInteger minerFeeEstimate = getFeeEstimate(tx.getWeight());
double minerFeeDiff = tx.getFee().subtract(minerFeeEstimate).abs().doubleValue() / minerFeeEstimate.doubleValue();
- if (minerFeeDiff > MINER_FEE_TOLERANCE) throw new Error("Miner fee is not within " + (MINER_FEE_TOLERANCE * 100) + "% of estimated fee, expected " + minerFeeEstimate + " but was " + tx.getFee());
+ if (minerFeeDiff > MINER_FEE_TOLERANCE) throw new RuntimeException("Miner fee is not within " + (MINER_FEE_TOLERANCE * 100) + "% of estimated fee, expected " + minerFeeEstimate + " but was " + tx.getFee() + ", diff%=" + minerFeeDiff);
log.info("Trade tx fee {} is within tolerance, diff%={}", tx.getFee(), minerFeeDiff);
// verify proof to fee address
@@ -786,11 +781,23 @@ public class XmrWalletService extends XmrWalletBase {
BigInteger actualSendAmount = transferCheck.getReceivedAmount();
// verify trade fee amount
- if (!actualTradeFee.equals(tradeFeeAmount)) throw new RuntimeException("Invalid trade fee amount, expected " + tradeFeeAmount + " but was " + actualTradeFee);
+ if (!actualTradeFee.equals(tradeFeeAmount)) {
+ if (equalsWithinFractionError(actualTradeFee, tradeFeeAmount)) {
+ log.warn("Trade tx fee amount is within fraction error, expected " + tradeFeeAmount + " but was " + actualTradeFee);
+ } else {
+ throw new RuntimeException("Invalid trade fee amount, expected " + tradeFeeAmount + " but was " + actualTradeFee);
+ }
+ }
// verify send amount
BigInteger expectedSendAmount = sendAmount.subtract(tx.getFee());
- if (!actualSendAmount.equals(expectedSendAmount)) throw new RuntimeException("Invalid send amount, expected " + expectedSendAmount + " but was " + actualSendAmount + " with tx fee " + tx.getFee());
+ if (!actualSendAmount.equals(expectedSendAmount)) {
+ if (equalsWithinFractionError(actualSendAmount, expectedSendAmount)) {
+ log.warn("Trade tx send amount is within fraction error, expected " + expectedSendAmount + " but was " + actualSendAmount + " with tx fee " + tx.getFee());
+ } else {
+ throw new RuntimeException("Invalid send amount, expected " + expectedSendAmount + " but was " + actualSendAmount + " with tx fee " + tx.getFee());
+ }
+ }
return tx;
} catch (Exception e) {
log.warn("Error verifying trade tx with offer id=" + offerId + (tx == null ? "" : ", tx=\n" + tx) + ": " + e.getMessage());
@@ -806,17 +813,30 @@ public class XmrWalletService extends XmrWalletBase {
}
}
+ // TODO: old bug in atomic unit conversion could cause fractional difference error, remove this in future release, maybe re-sign all offers then
+ private static boolean equalsWithinFractionError(BigInteger a, BigInteger b) {
+ return a.subtract(b).abs().compareTo(new BigInteger("1")) <= 0;
+ }
+
/**
* Get the tx fee estimate based on its weight.
*
* @param txWeight - the tx weight
* @return the tx fee estimate
*/
- private BigInteger getElevatedFeeEstimate(long txWeight) {
+ private BigInteger getFeeEstimate(long txWeight) {
+
+ // get fee priority
+ MoneroTxPriority priority;
+ if (PROTOCOL_FEE_PRIORITY == MoneroTxPriority.DEFAULT) {
+ priority = wallet.getDefaultFeePriority();
+ } else {
+ priority = PROTOCOL_FEE_PRIORITY;
+ }
// get fee estimates per kB from daemon
MoneroFeeEstimate feeEstimates = getDaemon().getFeeEstimate();
- BigInteger baseFeeEstimate = feeEstimates.getFees().get(2); // get elevated fee per kB
+ BigInteger baseFeeEstimate = feeEstimates.getFees().get(priority.ordinal() - 1);
BigInteger qmask = feeEstimates.getQuantizationMask();
log.info("Monero base fee estimate={}, qmask={}", baseFeeEstimate, qmask);
@@ -1125,6 +1145,15 @@ public class XmrWalletService extends XmrWalletBase {
return subaddress == null ? BigInteger.ZERO : subaddress.getBalance();
}
+ public BigInteger getBalanceForSubaddress(int subaddressIndex, boolean includeFrozen) {
+ return getBalanceForSubaddress(subaddressIndex).add(includeFrozen ? getFrozenBalanceForSubaddress(subaddressIndex) : BigInteger.ZERO);
+ }
+
+ public BigInteger getFrozenBalanceForSubaddress(int subaddressIndex) {
+ List outputs = getOutputs(new MoneroOutputQuery().setIsFrozen(true).setIsSpent(false).setAccountIndex(0).setSubaddressIndex(subaddressIndex));
+ return outputs.stream().map(output -> output.getAmount()).reduce(BigInteger.ZERO, BigInteger::add);
+ }
+
public BigInteger getAvailableBalanceForSubaddress(int subaddressIndex) {
MoneroSubaddress subaddress = getSubaddress(subaddressIndex);
return subaddress == null ? BigInteger.ZERO : subaddress.getUnlockedBalance();
@@ -1250,6 +1279,19 @@ public class XmrWalletService extends XmrWalletBase {
return filteredOutputs;
}
+ public List getOutputs(Collection keyImages) {
+ List outputs = new ArrayList();
+ for (String keyImage : keyImages) {
+ List outputList = getOutputs(new MoneroOutputQuery().setIsSpent(false).setKeyImage(new MoneroKeyImage(keyImage)));
+ if (!outputList.isEmpty()) outputs.add(outputList.get(0));
+ }
+ return outputs;
+ }
+
+ public BigInteger getOutputsAmount(Collection keyImages) {
+ return getOutputs(keyImages).stream().map(output -> output.getAmount()).reduce(BigInteger.ZERO, BigInteger::add);
+ }
+
///////////////////////////////////////////////////////////////////////////////////////////
// Util
///////////////////////////////////////////////////////////////////////////////////////////
@@ -1321,11 +1363,12 @@ public class XmrWalletService extends XmrWalletBase {
maybeInitMainWallet(sync, MAX_SYNC_ATTEMPTS);
}
- private void maybeInitMainWallet(boolean sync, int numAttempts) {
+ private void maybeInitMainWallet(boolean sync, int numSyncAttempts) {
ThreadUtils.execute(() -> {
try {
doMaybeInitMainWallet(sync, MAX_SYNC_ATTEMPTS);
} catch (Exception e) {
+ if (isShutDownStarted) return;
log.warn("Error initializing main wallet: {}\n", e.getMessage(), e);
HavenoUtils.setTopError(e.getMessage());
throw e;
@@ -1333,7 +1376,7 @@ public class XmrWalletService extends XmrWalletBase {
}, THREAD_ID);
}
- private void doMaybeInitMainWallet(boolean sync, int numAttempts) {
+ private void doMaybeInitMainWallet(boolean sync, int numSyncAttempts) {
synchronized (walletLock) {
if (isShutDownStarted) return;
@@ -1361,7 +1404,7 @@ public class XmrWalletService extends XmrWalletBase {
// sync main wallet if applicable
// TODO: error handling and re-initialization is jenky, refactor
- if (sync && numAttempts > 0) {
+ if (sync && numSyncAttempts > 0) {
try {
// switch connection if disconnected
@@ -1380,7 +1423,7 @@ public class XmrWalletService extends XmrWalletBase {
log.warn("Error syncing wallet with progress on startup: " + e.getMessage());
forceCloseMainWallet();
requestSwitchToNextBestConnection(sourceConnection);
- maybeInitMainWallet(true, numAttempts - 1); // re-initialize wallet and sync again
+ maybeInitMainWallet(true, numSyncAttempts - 1); // re-initialize wallet and sync again
return;
}
log.info("Done syncing main wallet in " + (System.currentTimeMillis() - time) + " ms");
@@ -1411,14 +1454,14 @@ public class XmrWalletService extends XmrWalletBase {
HavenoUtils.havenoSetup.getWalletInitialized().set(true);
// save but skip backup on initialization
- saveMainWallet(false);
+ saveWallet(false);
} catch (Exception e) {
if (isClosingWallet || isShutDownStarted || HavenoUtils.havenoSetup.getWalletInitialized().get()) return; // ignore if wallet closing, shut down started, or app already initialized
log.warn("Error initially syncing main wallet: {}", e.getMessage());
- if (numAttempts <= 1) {
- log.warn("Failed to sync main wallet. Opening app without syncing", numAttempts);
+ if (numSyncAttempts <= 1) {
+ log.warn("Failed to sync main wallet. Opening app without syncing", numSyncAttempts);
HavenoUtils.havenoSetup.getWalletInitialized().set(true);
- saveMainWallet(false);
+ saveWallet(false);
// reschedule to init main wallet
UserThread.runAfter(() -> {
@@ -1427,7 +1470,7 @@ public class XmrWalletService extends XmrWalletBase {
} else {
log.warn("Trying again in {} seconds", xmrConnectionService.getRefreshPeriodMs() / 1000);
UserThread.runAfter(() -> {
- maybeInitMainWallet(true, numAttempts - 1);
+ maybeInitMainWallet(true, numSyncAttempts - 1);
}, xmrConnectionService.getRefreshPeriodMs() / 1000);
}
}
@@ -1493,10 +1536,11 @@ public class XmrWalletService extends XmrWalletBase {
// try opening wallet
config.setNetworkType(getMoneroNetworkType());
config.setServer(connection);
- log.info("Opening full wallet " + config.getPath() + " with monerod=" + connection.getUri() + ", proxyUri=" + connection.getProxyUri());
+ log.info("Opening full wallet '{}' with monerod={}, proxyUri={}", config.getPath(), connection.getUri(), connection.getProxyUri());
try {
walletFull = MoneroWalletFull.openWallet(config);
} catch (Exception e) {
+ if (isShutDownStarted) throw e;
log.warn("Failed to open full wallet '{}', attempting to use backup cache files, error={}", config.getPath(), e.getMessage());
boolean retrySuccessful = false;
try {
@@ -1534,7 +1578,7 @@ public class XmrWalletService extends XmrWalletBase {
// retry opening wallet after cache deleted
try {
- log.warn("Failed to open full wallet using backup cache files, retrying with cache deleted");
+ log.warn("Failed to open full wallet '{}' using backup cache files, retrying with cache deleted", config.getPath());
walletFull = MoneroWalletFull.openWallet(config);
log.warn("Successfully opened full wallet after cache deleted");
retrySuccessful = true;
@@ -1548,7 +1592,7 @@ public class XmrWalletService extends XmrWalletBase {
} else {
// restore original wallet cache
- log.warn("Failed to open full wallet after deleting cache, restoring original cache");
+ log.warn("Failed to open full wallet '{}' after deleting cache, restoring original cache", config.getPath());
File cacheFile = new File(cachePath);
if (cacheFile.exists()) cacheFile.delete();
if (originalCacheBackup.exists()) originalCacheBackup.renameTo(new File(cachePath));
@@ -1620,11 +1664,12 @@ public class XmrWalletService extends XmrWalletBase {
if (!applyProxyUri) connection.setProxyUri(null);
// try opening wallet
- log.info("Opening RPC wallet " + config.getPath() + " with monerod=" + connection.getUri() + ", proxyUri=" + connection.getProxyUri());
+ log.info("Opening RPC wallet '{}' with monerod={}, proxyUri={}", config.getPath(), connection.getUri(), connection.getProxyUri());
config.setServer(connection);
try {
walletRpc.openWallet(config);
} catch (Exception e) {
+ if (isShutDownStarted) throw e;
log.warn("Failed to open RPC wallet '{}', attempting to use backup cache files, error={}", config.getPath(), e.getMessage());
boolean retrySuccessful = false;
try {
@@ -1662,7 +1707,7 @@ public class XmrWalletService extends XmrWalletBase {
// retry opening wallet after cache deleted
try {
- log.warn("Failed to open RPC wallet using backup cache files, retrying with cache deleted");
+ log.warn("Failed to open RPC wallet '{}' using backup cache files, retrying with cache deleted", config.getPath());
walletRpc.openWallet(config);
log.warn("Successfully opened RPC wallet after cache deleted");
retrySuccessful = true;
@@ -1676,7 +1721,7 @@ public class XmrWalletService extends XmrWalletBase {
} else {
// restore original wallet cache
- log.warn("Failed to open RPC wallet after deleting cache, restoring original cache");
+ log.warn("Failed to open RPC wallet '{}' after deleting cache, restoring original cache", config.getPath());
File cacheFile = new File(cachePath);
if (cacheFile.exists()) cacheFile.delete();
if (originalCacheBackup.exists()) originalCacheBackup.renameTo(new File(cachePath));
@@ -1702,7 +1747,7 @@ public class XmrWalletService extends XmrWalletBase {
private MoneroWalletRpc startWalletRpcInstance(Integer port, boolean applyProxyUri) {
// check if monero-wallet-rpc exists
- if (!new File(MONERO_WALLET_RPC_PATH).exists()) throw new Error("monero-wallet-rpc executable doesn't exist at path " + MONERO_WALLET_RPC_PATH
+ if (!new File(MONERO_WALLET_RPC_PATH).exists()) throw new RuntimeException("monero-wallet-rpc executable doesn't exist at path " + MONERO_WALLET_RPC_PATH
+ "; copy monero-wallet-rpc to the project root or set WalletConfig.java MONERO_WALLET_RPC_PATH for your system");
// build command to start monero-wallet-rpc
@@ -1741,7 +1786,8 @@ public class XmrWalletService extends XmrWalletBase {
return MONERO_WALLET_RPC_MANAGER.startInstance(cmd);
}
- private void onConnectionChanged(MoneroRpcConnection connection) {
+ @Override
+ protected void onConnectionChanged(MoneroRpcConnection connection) {
synchronized (walletLock) {
// use current connection
@@ -1795,7 +1841,7 @@ public class XmrWalletService extends XmrWalletBase {
tasks.add(() -> {
try {
wallet.changePassword(oldPassword, newPassword);
- saveMainWallet();
+ saveWallet();
} catch (Exception e) {
log.warn("Error changing main wallet password: " + e.getMessage() + "\n", e);
throw e;
@@ -1845,13 +1891,13 @@ public class XmrWalletService extends XmrWalletBase {
log.warn("Force restarting main wallet");
if (isClosingWallet) return;
forceCloseMainWallet();
- maybeInitMainWallet(true);
+ doMaybeInitMainWallet(true, MAX_SYNC_ATTEMPTS);
}
public void handleWalletError(Exception e, MoneroRpcConnection sourceConnection) {
if (HavenoUtils.isUnresponsive(e)) forceCloseMainWallet(); // wallet can be stuck a while
- if (xmrConnectionService.isConnected()) requestSwitchToNextBestConnection(sourceConnection);
- getWallet(); // re-open wallet
+ requestSwitchToNextBestConnection(sourceConnection);
+ if (wallet == null) doMaybeInitMainWallet(true, MAX_SYNC_ATTEMPTS);
}
private void startPolling() {
@@ -1988,7 +2034,7 @@ public class XmrWalletService extends XmrWalletBase {
if (wallet != null && !isShutDownStarted) {
try {
cacheWalletInfo();
- requestSaveMainWallet();
+ saveWalletWithDelay();
} catch (Exception e) {
log.warn("Error caching wallet info: " + e.getMessage() + "\n", e);
}
@@ -2020,10 +2066,6 @@ public class XmrWalletService extends XmrWalletBase {
return requestSwitchToNextBestConnection(null);
}
- public boolean requestSwitchToNextBestConnection(MoneroRpcConnection sourceConnection) {
- return xmrConnectionService.requestSwitchToNextBestConnection(sourceConnection);
- }
-
private void onNewBlock(long height) {
UserThread.execute(() -> {
walletHeight.set(height);
diff --git a/core/src/main/resources/bip39_english.txt b/core/src/main/resources/bip39_english.txt
new file mode 100644
index 0000000000..942040ed50
--- /dev/null
+++ b/core/src/main/resources/bip39_english.txt
@@ -0,0 +1,2048 @@
+abandon
+ability
+able
+about
+above
+absent
+absorb
+abstract
+absurd
+abuse
+access
+accident
+account
+accuse
+achieve
+acid
+acoustic
+acquire
+across
+act
+action
+actor
+actress
+actual
+adapt
+add
+addict
+address
+adjust
+admit
+adult
+advance
+advice
+aerobic
+affair
+afford
+afraid
+again
+age
+agent
+agree
+ahead
+aim
+air
+airport
+aisle
+alarm
+album
+alcohol
+alert
+alien
+all
+alley
+allow
+almost
+alone
+alpha
+already
+also
+alter
+always
+amateur
+amazing
+among
+amount
+amused
+analyst
+anchor
+ancient
+anger
+angle
+angry
+animal
+ankle
+announce
+annual
+another
+answer
+antenna
+antique
+anxiety
+any
+apart
+apology
+appear
+apple
+approve
+april
+arch
+arctic
+area
+arena
+argue
+arm
+armed
+armor
+army
+around
+arrange
+arrest
+arrive
+arrow
+art
+artefact
+artist
+artwork
+ask
+aspect
+assault
+asset
+assist
+assume
+asthma
+athlete
+atom
+attack
+attend
+attitude
+attract
+auction
+audit
+august
+aunt
+author
+auto
+autumn
+average
+avocado
+avoid
+awake
+aware
+away
+awesome
+awful
+awkward
+axis
+baby
+bachelor
+bacon
+badge
+bag
+balance
+balcony
+ball
+bamboo
+banana
+banner
+bar
+barely
+bargain
+barrel
+base
+basic
+basket
+battle
+beach
+bean
+beauty
+because
+become
+beef
+before
+begin
+behave
+behind
+believe
+below
+belt
+bench
+benefit
+best
+betray
+better
+between
+beyond
+bicycle
+bid
+bike
+bind
+biology
+bird
+birth
+bitter
+black
+blade
+blame
+blanket
+blast
+bleak
+bless
+blind
+blood
+blossom
+blouse
+blue
+blur
+blush
+board
+boat
+body
+boil
+bomb
+bone
+bonus
+book
+boost
+border
+boring
+borrow
+boss
+bottom
+bounce
+box
+boy
+bracket
+brain
+brand
+brass
+brave
+bread
+breeze
+brick
+bridge
+brief
+bright
+bring
+brisk
+broccoli
+broken
+bronze
+broom
+brother
+brown
+brush
+bubble
+buddy
+budget
+buffalo
+build
+bulb
+bulk
+bullet
+bundle
+bunker
+burden
+burger
+burst
+bus
+business
+busy
+butter
+buyer
+buzz
+cabbage
+cabin
+cable
+cactus
+cage
+cake
+call
+calm
+camera
+camp
+can
+canal
+cancel
+candy
+cannon
+canoe
+canvas
+canyon
+capable
+capital
+captain
+car
+carbon
+card
+cargo
+carpet
+carry
+cart
+case
+cash
+casino
+castle
+casual
+cat
+catalog
+catch
+category
+cattle
+caught
+cause
+caution
+cave
+ceiling
+celery
+cement
+census
+century
+cereal
+certain
+chair
+chalk
+champion
+change
+chaos
+chapter
+charge
+chase
+chat
+cheap
+check
+cheese
+chef
+cherry
+chest
+chicken
+chief
+child
+chimney
+choice
+choose
+chronic
+chuckle
+chunk
+churn
+cigar
+cinnamon
+circle
+citizen
+city
+civil
+claim
+clap
+clarify
+claw
+clay
+clean
+clerk
+clever
+click
+client
+cliff
+climb
+clinic
+clip
+clock
+clog
+close
+cloth
+cloud
+clown
+club
+clump
+cluster
+clutch
+coach
+coast
+coconut
+code
+coffee
+coil
+coin
+collect
+color
+column
+combine
+come
+comfort
+comic
+common
+company
+concert
+conduct
+confirm
+congress
+connect
+consider
+control
+convince
+cook
+cool
+copper
+copy
+coral
+core
+corn
+correct
+cost
+cotton
+couch
+country
+couple
+course
+cousin
+cover
+coyote
+crack
+cradle
+craft
+cram
+crane
+crash
+crater
+crawl
+crazy
+cream
+credit
+creek
+crew
+cricket
+crime
+crisp
+critic
+crop
+cross
+crouch
+crowd
+crucial
+cruel
+cruise
+crumble
+crunch
+crush
+cry
+crystal
+cube
+culture
+cup
+cupboard
+curious
+current
+curtain
+curve
+cushion
+custom
+cute
+cycle
+dad
+damage
+damp
+dance
+danger
+daring
+dash
+daughter
+dawn
+day
+deal
+debate
+debris
+decade
+december
+decide
+decline
+decorate
+decrease
+deer
+defense
+define
+defy
+degree
+delay
+deliver
+demand
+demise
+denial
+dentist
+deny
+depart
+depend
+deposit
+depth
+deputy
+derive
+describe
+desert
+design
+desk
+despair
+destroy
+detail
+detect
+develop
+device
+devote
+diagram
+dial
+diamond
+diary
+dice
+diesel
+diet
+differ
+digital
+dignity
+dilemma
+dinner
+dinosaur
+direct
+dirt
+disagree
+discover
+disease
+dish
+dismiss
+disorder
+display
+distance
+divert
+divide
+divorce
+dizzy
+doctor
+document
+dog
+doll
+dolphin
+domain
+donate
+donkey
+donor
+door
+dose
+double
+dove
+draft
+dragon
+drama
+drastic
+draw
+dream
+dress
+drift
+drill
+drink
+drip
+drive
+drop
+drum
+dry
+duck
+dumb
+dune
+during
+dust
+dutch
+duty
+dwarf
+dynamic
+eager
+eagle
+early
+earn
+earth
+easily
+east
+easy
+echo
+ecology
+economy
+edge
+edit
+educate
+effort
+egg
+eight
+either
+elbow
+elder
+electric
+elegant
+element
+elephant
+elevator
+elite
+else
+embark
+embody
+embrace
+emerge
+emotion
+employ
+empower
+empty
+enable
+enact
+end
+endless
+endorse
+enemy
+energy
+enforce
+engage
+engine
+enhance
+enjoy
+enlist
+enough
+enrich
+enroll
+ensure
+enter
+entire
+entry
+envelope
+episode
+equal
+equip
+era
+erase
+erode
+erosion
+error
+erupt
+escape
+essay
+essence
+estate
+eternal
+ethics
+evidence
+evil
+evoke
+evolve
+exact
+example
+excess
+exchange
+excite
+exclude
+excuse
+execute
+exercise
+exhaust
+exhibit
+exile
+exist
+exit
+exotic
+expand
+expect
+expire
+explain
+expose
+express
+extend
+extra
+eye
+eyebrow
+fabric
+face
+faculty
+fade
+faint
+faith
+fall
+false
+fame
+family
+famous
+fan
+fancy
+fantasy
+farm
+fashion
+fat
+fatal
+father
+fatigue
+fault
+favorite
+feature
+february
+federal
+fee
+feed
+feel
+female
+fence
+festival
+fetch
+fever
+few
+fiber
+fiction
+field
+figure
+file
+film
+filter
+final
+find
+fine
+finger
+finish
+fire
+firm
+first
+fiscal
+fish
+fit
+fitness
+fix
+flag
+flame
+flash
+flat
+flavor
+flee
+flight
+flip
+float
+flock
+floor
+flower
+fluid
+flush
+fly
+foam
+focus
+fog
+foil
+fold
+follow
+food
+foot
+force
+forest
+forget
+fork
+fortune
+forum
+forward
+fossil
+foster
+found
+fox
+fragile
+frame
+frequent
+fresh
+friend
+fringe
+frog
+front
+frost
+frown
+frozen
+fruit
+fuel
+fun
+funny
+furnace
+fury
+future
+gadget
+gain
+galaxy
+gallery
+game
+gap
+garage
+garbage
+garden
+garlic
+garment
+gas
+gasp
+gate
+gather
+gauge
+gaze
+general
+genius
+genre
+gentle
+genuine
+gesture
+ghost
+giant
+gift
+giggle
+ginger
+giraffe
+girl
+give
+glad
+glance
+glare
+glass
+glide
+glimpse
+globe
+gloom
+glory
+glove
+glow
+glue
+goat
+goddess
+gold
+good
+goose
+gorilla
+gospel
+gossip
+govern
+gown
+grab
+grace
+grain
+grant
+grape
+grass
+gravity
+great
+green
+grid
+grief
+grit
+grocery
+group
+grow
+grunt
+guard
+guess
+guide
+guilt
+guitar
+gun
+gym
+habit
+hair
+half
+hammer
+hamster
+hand
+happy
+harbor
+hard
+harsh
+harvest
+hat
+have
+hawk
+hazard
+head
+health
+heart
+heavy
+hedgehog
+height
+hello
+helmet
+help
+hen
+hero
+hidden
+high
+hill
+hint
+hip
+hire
+history
+hobby
+hockey
+hold
+hole
+holiday
+hollow
+home
+honey
+hood
+hope
+horn
+horror
+horse
+hospital
+host
+hotel
+hour
+hover
+hub
+huge
+human
+humble
+humor
+hundred
+hungry
+hunt
+hurdle
+hurry
+hurt
+husband
+hybrid
+ice
+icon
+idea
+identify
+idle
+ignore
+ill
+illegal
+illness
+image
+imitate
+immense
+immune
+impact
+impose
+improve
+impulse
+inch
+include
+income
+increase
+index
+indicate
+indoor
+industry
+infant
+inflict
+inform
+inhale
+inherit
+initial
+inject
+injury
+inmate
+inner
+innocent
+input
+inquiry
+insane
+insect
+inside
+inspire
+install
+intact
+interest
+into
+invest
+invite
+involve
+iron
+island
+isolate
+issue
+item
+ivory
+jacket
+jaguar
+jar
+jazz
+jealous
+jeans
+jelly
+jewel
+job
+join
+joke
+journey
+joy
+judge
+juice
+jump
+jungle
+junior
+junk
+just
+kangaroo
+keen
+keep
+ketchup
+key
+kick
+kid
+kidney
+kind
+kingdom
+kiss
+kit
+kitchen
+kite
+kitten
+kiwi
+knee
+knife
+knock
+know
+lab
+label
+labor
+ladder
+lady
+lake
+lamp
+language
+laptop
+large
+later
+latin
+laugh
+laundry
+lava
+law
+lawn
+lawsuit
+layer
+lazy
+leader
+leaf
+learn
+leave
+lecture
+left
+leg
+legal
+legend
+leisure
+lemon
+lend
+length
+lens
+leopard
+lesson
+letter
+level
+liar
+liberty
+library
+license
+life
+lift
+light
+like
+limb
+limit
+link
+lion
+liquid
+list
+little
+live
+lizard
+load
+loan
+lobster
+local
+lock
+logic
+lonely
+long
+loop
+lottery
+loud
+lounge
+love
+loyal
+lucky
+luggage
+lumber
+lunar
+lunch
+luxury
+lyrics
+machine
+mad
+magic
+magnet
+maid
+mail
+main
+major
+make
+mammal
+man
+manage
+mandate
+mango
+mansion
+manual
+maple
+marble
+march
+margin
+marine
+market
+marriage
+mask
+mass
+master
+match
+material
+math
+matrix
+matter
+maximum
+maze
+meadow
+mean
+measure
+meat
+mechanic
+medal
+media
+melody
+melt
+member
+memory
+mention
+menu
+mercy
+merge
+merit
+merry
+mesh
+message
+metal
+method
+middle
+midnight
+milk
+million
+mimic
+mind
+minimum
+minor
+minute
+miracle
+mirror
+misery
+miss
+mistake
+mix
+mixed
+mixture
+mobile
+model
+modify
+mom
+moment
+monitor
+monkey
+monster
+month
+moon
+moral
+more
+morning
+mosquito
+mother
+motion
+motor
+mountain
+mouse
+move
+movie
+much
+muffin
+mule
+multiply
+muscle
+museum
+mushroom
+music
+must
+mutual
+myself
+mystery
+myth
+naive
+name
+napkin
+narrow
+nasty
+nation
+nature
+near
+neck
+need
+negative
+neglect
+neither
+nephew
+nerve
+nest
+net
+network
+neutral
+never
+news
+next
+nice
+night
+noble
+noise
+nominee
+noodle
+normal
+north
+nose
+notable
+note
+nothing
+notice
+novel
+now
+nuclear
+number
+nurse
+nut
+oak
+obey
+object
+oblige
+obscure
+observe
+obtain
+obvious
+occur
+ocean
+october
+odor
+off
+offer
+office
+often
+oil
+okay
+old
+olive
+olympic
+omit
+once
+one
+onion
+online
+only
+open
+opera
+opinion
+oppose
+option
+orange
+orbit
+orchard
+order
+ordinary
+organ
+orient
+original
+orphan
+ostrich
+other
+outdoor
+outer
+output
+outside
+oval
+oven
+over
+own
+owner
+oxygen
+oyster
+ozone
+pact
+paddle
+page
+pair
+palace
+palm
+panda
+panel
+panic
+panther
+paper
+parade
+parent
+park
+parrot
+party
+pass
+patch
+path
+patient
+patrol
+pattern
+pause
+pave
+payment
+peace
+peanut
+pear
+peasant
+pelican
+pen
+penalty
+pencil
+people
+pepper
+perfect
+permit
+person
+pet
+phone
+photo
+phrase
+physical
+piano
+picnic
+picture
+piece
+pig
+pigeon
+pill
+pilot
+pink
+pioneer
+pipe
+pistol
+pitch
+pizza
+place
+planet
+plastic
+plate
+play
+please
+pledge
+pluck
+plug
+plunge
+poem
+poet
+point
+polar
+pole
+police
+pond
+pony
+pool
+popular
+portion
+position
+possible
+post
+potato
+pottery
+poverty
+powder
+power
+practice
+praise
+predict
+prefer
+prepare
+present
+pretty
+prevent
+price
+pride
+primary
+print
+priority
+prison
+private
+prize
+problem
+process
+produce
+profit
+program
+project
+promote
+proof
+property
+prosper
+protect
+proud
+provide
+public
+pudding
+pull
+pulp
+pulse
+pumpkin
+punch
+pupil
+puppy
+purchase
+purity
+purpose
+purse
+push
+put
+puzzle
+pyramid
+quality
+quantum
+quarter
+question
+quick
+quit
+quiz
+quote
+rabbit
+raccoon
+race
+rack
+radar
+radio
+rail
+rain
+raise
+rally
+ramp
+ranch
+random
+range
+rapid
+rare
+rate
+rather
+raven
+raw
+razor
+ready
+real
+reason
+rebel
+rebuild
+recall
+receive
+recipe
+record
+recycle
+reduce
+reflect
+reform
+refuse
+region
+regret
+regular
+reject
+relax
+release
+relief
+rely
+remain
+remember
+remind
+remove
+render
+renew
+rent
+reopen
+repair
+repeat
+replace
+report
+require
+rescue
+resemble
+resist
+resource
+response
+result
+retire
+retreat
+return
+reunion
+reveal
+review
+reward
+rhythm
+rib
+ribbon
+rice
+rich
+ride
+ridge
+rifle
+right
+rigid
+ring
+riot
+ripple
+risk
+ritual
+rival
+river
+road
+roast
+robot
+robust
+rocket
+romance
+roof
+rookie
+room
+rose
+rotate
+rough
+round
+route
+royal
+rubber
+rude
+rug
+rule
+run
+runway
+rural
+sad
+saddle
+sadness
+safe
+sail
+salad
+salmon
+salon
+salt
+salute
+same
+sample
+sand
+satisfy
+satoshi
+sauce
+sausage
+save
+say
+scale
+scan
+scare
+scatter
+scene
+scheme
+school
+science
+scissors
+scorpion
+scout
+scrap
+screen
+script
+scrub
+sea
+search
+season
+seat
+second
+secret
+section
+security
+seed
+seek
+segment
+select
+sell
+seminar
+senior
+sense
+sentence
+series
+service
+session
+settle
+setup
+seven
+shadow
+shaft
+shallow
+share
+shed
+shell
+sheriff
+shield
+shift
+shine
+ship
+shiver
+shock
+shoe
+shoot
+shop
+short
+shoulder
+shove
+shrimp
+shrug
+shuffle
+shy
+sibling
+sick
+side
+siege
+sight
+sign
+silent
+silk
+silly
+silver
+similar
+simple
+since
+sing
+siren
+sister
+situate
+six
+size
+skate
+sketch
+ski
+skill
+skin
+skirt
+skull
+slab
+slam
+sleep
+slender
+slice
+slide
+slight
+slim
+slogan
+slot
+slow
+slush
+small
+smart
+smile
+smoke
+smooth
+snack
+snake
+snap
+sniff
+snow
+soap
+soccer
+social
+sock
+soda
+soft
+solar
+soldier
+solid
+solution
+solve
+someone
+song
+soon
+sorry
+sort
+soul
+sound
+soup
+source
+south
+space
+spare
+spatial
+spawn
+speak
+special
+speed
+spell
+spend
+sphere
+spice
+spider
+spike
+spin
+spirit
+split
+spoil
+sponsor
+spoon
+sport
+spot
+spray
+spread
+spring
+spy
+square
+squeeze
+squirrel
+stable
+stadium
+staff
+stage
+stairs
+stamp
+stand
+start
+state
+stay
+steak
+steel
+stem
+step
+stereo
+stick
+still
+sting
+stock
+stomach
+stone
+stool
+story
+stove
+strategy
+street
+strike
+strong
+struggle
+student
+stuff
+stumble
+style
+subject
+submit
+subway
+success
+such
+sudden
+suffer
+sugar
+suggest
+suit
+summer
+sun
+sunny
+sunset
+super
+supply
+supreme
+sure
+surface
+surge
+surprise
+surround
+survey
+suspect
+sustain
+swallow
+swamp
+swap
+swarm
+swear
+sweet
+swift
+swim
+swing
+switch
+sword
+symbol
+symptom
+syrup
+system
+table
+tackle
+tag
+tail
+talent
+talk
+tank
+tape
+target
+task
+taste
+tattoo
+taxi
+teach
+team
+tell
+ten
+tenant
+tennis
+tent
+term
+test
+text
+thank
+that
+theme
+then
+theory
+there
+they
+thing
+this
+thought
+three
+thrive
+throw
+thumb
+thunder
+ticket
+tide
+tiger
+tilt
+timber
+time
+tiny
+tip
+tired
+tissue
+title
+toast
+tobacco
+today
+toddler
+toe
+together
+toilet
+token
+tomato
+tomorrow
+tone
+tongue
+tonight
+tool
+tooth
+top
+topic
+topple
+torch
+tornado
+tortoise
+toss
+total
+tourist
+toward
+tower
+town
+toy
+track
+trade
+traffic
+tragic
+train
+transfer
+trap
+trash
+travel
+tray
+treat
+tree
+trend
+trial
+tribe
+trick
+trigger
+trim
+trip
+trophy
+trouble
+truck
+true
+truly
+trumpet
+trust
+truth
+try
+tube
+tuition
+tumble
+tuna
+tunnel
+turkey
+turn
+turtle
+twelve
+twenty
+twice
+twin
+twist
+two
+type
+typical
+ugly
+umbrella
+unable
+unaware
+uncle
+uncover
+under
+undo
+unfair
+unfold
+unhappy
+uniform
+unique
+unit
+universe
+unknown
+unlock
+until
+unusual
+unveil
+update
+upgrade
+uphold
+upon
+upper
+upset
+urban
+urge
+usage
+use
+used
+useful
+useless
+usual
+utility
+vacant
+vacuum
+vague
+valid
+valley
+valve
+van
+vanish
+vapor
+various
+vast
+vault
+vehicle
+velvet
+vendor
+venture
+venue
+verb
+verify
+version
+very
+vessel
+veteran
+viable
+vibrant
+vicious
+victory
+video
+view
+village
+vintage
+violin
+virtual
+virus
+visa
+visit
+visual
+vital
+vivid
+vocal
+voice
+void
+volcano
+volume
+vote
+voyage
+wage
+wagon
+wait
+walk
+wall
+walnut
+want
+warfare
+warm
+warrior
+wash
+wasp
+waste
+water
+wave
+way
+wealth
+weapon
+wear
+weasel
+weather
+web
+wedding
+weekend
+weird
+welcome
+west
+wet
+whale
+what
+wheat
+wheel
+when
+where
+whip
+whisper
+wide
+width
+wife
+wild
+will
+win
+window
+wine
+wing
+wink
+winner
+winter
+wire
+wisdom
+wise
+wish
+witness
+wolf
+woman
+wonder
+wood
+wool
+word
+work
+world
+worry
+worth
+wrap
+wreck
+wrestle
+wrist
+write
+wrong
+yard
+year
+yellow
+you
+young
+youth
+zebra
+zero
+zone
+zoo
diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties
index c1f98ce420..d8111b7b9c 100644
--- a/core/src/main/resources/i18n/displayStrings.properties
+++ b/core/src/main/resources/i18n/displayStrings.properties
@@ -43,6 +43,8 @@ shared.buyMonero=Buy Monero
shared.sellMonero=Sell Monero
shared.buyCurrency=Buy {0}
shared.sellCurrency=Sell {0}
+shared.buyCurrencyLocked=Buy {0} 🔒
+shared.sellCurrencyLocked=Sell {0} 🔒
shared.buyingXMRWith=buying XMR with {0}
shared.sellingXMRFor=selling XMR for {0}
shared.buyingCurrency=buying {0} (selling XMR)
@@ -198,7 +200,7 @@ shared.total=Total
shared.totalsNeeded=Funds needed
shared.tradeWalletAddress=Trade wallet address
shared.tradeWalletBalance=Trade wallet balance
-shared.reserveExactAmount=Reserve only the funds needed. May require a mining fee and 10 confirmations (~20 minutes) before your offer is live.
+shared.reserveExactAmount=Reserve only the necessary funds. Requires a mining fee and ~20 minutes before your offer goes live.
shared.makerTxFee=Maker: {0}
shared.takerTxFee=Taker: {0}
shared.iConfirm=I confirm
@@ -349,6 +351,7 @@ market.trades.showVolumeInUSD=Show volume in USD
offerbook.createOffer=Create offer
offerbook.takeOffer=Take offer
offerbook.takeOffer.createAccount=Create account and take offer
+offerbook.takeOffer.enterChallenge=Enter the offer passphrase
offerbook.trader=Trader
offerbook.offerersBankId=Maker''s bank ID (BIC/SWIFT): {0}
offerbook.offerersBankName=Maker''s bank name: {0}
@@ -360,6 +363,8 @@ offerbook.availableOffersToSell=Sell {0} for {1}
offerbook.filterByCurrency=Choose currency
offerbook.filterByPaymentMethod=Choose payment method
offerbook.matchingOffers=Offers matching my accounts
+offerbook.filterNoDeposit=No deposit
+offerbook.noDepositOffers=Offers with no deposit (passphrase required)
offerbook.timeSinceSigning=Account info
offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
offerbook.timeSinceSigning.info.peer=signed by a peer, waiting %d days for limits to be lifted
@@ -527,7 +532,10 @@ createOffer.setDepositAsBuyer=Set my security deposit as buyer (%)
createOffer.setDepositForBothTraders=Set both traders' security deposit (%)
createOffer.securityDepositInfo=Your buyer''s security deposit will be {0}
createOffer.securityDepositInfoAsBuyer=Your security deposit as buyer will be {0}
-createOffer.minSecurityDepositUsed=Min. buyer security deposit is used
+createOffer.minSecurityDepositUsed=Minimum security deposit is used
+createOffer.buyerAsTakerWithoutDeposit=No deposit required from buyer (passphrase protected)
+createOffer.myDeposit=My security deposit (%)
+createOffer.myDepositInfo=Your security deposit will be {0}
####################################################################
@@ -553,6 +561,8 @@ takeOffer.fundsBox.networkFee=Total mining fees
takeOffer.fundsBox.takeOfferSpinnerInfo=Taking offer: {0}
takeOffer.fundsBox.paymentLabel=Haveno trade with ID {0}
takeOffer.fundsBox.fundsStructure=({0} security deposit, {1} trade fee)
+takeOffer.fundsBox.noFundingRequiredTitle=No funding required
+takeOffer.fundsBox.noFundingRequiredDescription=Get the offer passphrase from the seller outside Haveno to take this offer.
takeOffer.success.headline=You have successfully taken an offer.
takeOffer.success.info=You can see the status of your trade at \"Portfolio/Open trades\".
takeOffer.error.message=An error occurred when taking the offer.\n\n{0}
@@ -677,7 +687,7 @@ portfolio.pending.step2_buyer.refTextWarn=Important: when making the payment, le
portfolio.pending.step2_buyer.fees=If your bank charges you any fees to make the transfer, you are responsible for paying those fees.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.fees.swift=Make sure to use the SHA (shared fee model) to send the SWIFT payment. \
- See more details at [HYPERLINK:https://haveno.exchange/wiki/SWIFT#Use_the_correct_fee_option].
+ See more details at [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT#Use_the_correct_fee_option].
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.crypto=Please transfer from your external {0} wallet\n{1} to the XMR seller.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -697,7 +707,7 @@ portfolio.pending.step2_buyer.postal=Please send {0} by \"US Postal Money Order\
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. \
Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. \
- See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+ See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Please pay {0} via the specified payment method to the XMR seller. You''ll find the seller's account details on the next screen.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1968,6 +1978,7 @@ offerDetailsWindow.confirm.taker=Confirm: Take offer to {0} monero
offerDetailsWindow.confirm.takerCrypto=Confirm: Take offer to {0} {1}
offerDetailsWindow.creationDate=Creation date
offerDetailsWindow.makersOnion=Maker's onion address
+offerDetailsWindow.challenge=Offer passphrase
qRCodeWindow.headline=QR Code
qRCodeWindow.msg=Please use this QR code for funding your Haveno wallet from your external wallet.
@@ -2016,7 +2027,7 @@ tacWindow.disagree=I disagree and quit
tacWindow.arbitrationSystem=Dispute resolution
tradeDetailsWindow.headline=Trade
-tradeDetailsWindow.disputedPayoutTxId=Disputed payout transaction ID:
+tradeDetailsWindow.disputedPayoutTxId=Disputed payout transaction ID
tradeDetailsWindow.tradeDate=Trade date
tradeDetailsWindow.txFee=Mining fee
tradeDetailsWindow.tradePeersOnion=Trading peers onion address
@@ -2269,6 +2280,12 @@ popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed
popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys
popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign
+popup.info.buyerAsTakerWithoutDeposit.headline=No deposit required from buyer
+popup.info.buyerAsTakerWithoutDeposit=\
+ Your offer will not require a security deposit or fee from the XMR buyer.\n\n\
+ To accept your offer, you must share a passphrase with your trade partner outside Haveno.\n\n\
+ The passphrase is automatically generated and shown in the offer details after creation.\
+
popup.info.torMigration.msg=Your Haveno node is probably using a deprecated Tor v2 address. \
Please switch your Haveno node to a Tor v3 address. \
Make sure to back up your data directory beforehand.
@@ -2408,6 +2425,7 @@ navigation.support=\"Support\"
formatter.formatVolumeLabel={0} amount{1}
formatter.makerTaker=Maker as {0} {1} / Taker as {2} {3}
+formatter.makerTakerLocked=Maker as {0} {1} / Taker as {2} {3} 🔒
formatter.youAreAsMaker=You are: {1} {0} (maker) / Taker is: {3} {2}
formatter.youAreAsTaker=You are: {1} {0} (taker) / Maker is: {3} {2}
formatter.youAre=You are {0} {1} ({2} {3})
@@ -2684,9 +2702,9 @@ payment.account.revolut.addUserNameInfo={0}\n\
This will not affect your account age signing status.
payment.revolut.addUserNameInfo.headLine=Update Revolut account
-payment.cashapp.info=Cash App has higher chargeback risk than most bank transfers. Please be aware of this when trading with Cash App.
-payment.venmo.info=Venmo has higher chargeback risk than most bank transfers. Please be aware of this when trading with Venmo.
-payment.paypal.info=PayPal has higher chargeback risk than most bank transfers. Please be aware of this when trading with PayPal.
+payment.cashapp.info=Please be aware that Cash App has higher chargeback risk than most bank transfers.
+payment.venmo.info=Please be aware that Venmo has higher chargeback risk than most bank transfers.
+payment.paypal.info=Please be aware that PayPal has higher chargeback risk than most bank transfers.
payment.amazonGiftCard.upgrade=Amazon gift cards payment method requires the country to be specified.
payment.account.amazonGiftCard.addCountryInfo={0}\n\
@@ -2702,20 +2720,20 @@ payment.swift.info.account=Carefully review the core guidelines for using SWIFT
- buyer must use the shared fee model (SHA) \n\
- buyer and seller may incur fees, so they should check their bank's fee schedules beforehand \n\
\n\
-SWIFT is more sophisticated than other payment methods, so please take a moment to review full guidance on the wiki [HYPERLINK:https://haveno.exchange/wiki/SWIFT].
+SWIFT is more sophisticated than other payment methods, so please take a moment to review full guidance on the wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT].
payment.swift.info.buyer=To buy monero with SWIFT, you must:\n\
\n\
- send payment in the currency specified by the offer maker \n\
- use the shared fee model (SHA) to send payment\n\
\n\
-Please review further guidance on the wiki to avoid penalties and ensure smooth trades [HYPERLINK:https://haveno.exchange/wiki/SWIFT].
+Please review further guidance on the wiki to avoid penalties and ensure smooth trades [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT].
payment.swift.info.seller=SWIFT senders are required to use the shared fee model (SHA) to send payments.\n\
\n\
If you receive a SWIFT payment that does not use SHA, open a mediation ticket.\n\
\n\
-Please review further guidance on the wiki to avoid penalties and ensure smooth trades [HYPERLINK:https://haveno.exchange/wiki/SWIFT].
+Please review further guidance on the wiki to avoid penalties and ensure smooth trades [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT].
payment.imps.info.account=Please make sure to include your:\n\n\
● Account owner full name\n\
@@ -2947,14 +2965,14 @@ The maximum trade size is $1,000 per payment.\n\n\
If you trade over the above limits your trade might be cancelled and there could be a penalty.
payment.transferwiseUsd.info.account=Due to US banking regulation, sending and receiving USD payments has more restrictions \
- than most other currencies. For this reason USD was not added to Haveno TransferWise payment method.\n\n\
-The TransferWise-USD payment method allows Haveno users to trade in USD.\n\n\
-Anyone with a Wise, formally TransferWise account, can add TransferWise-USD as a payment method in Haveno. This will \
+ than most other currencies. For this reason USD was not added to Haveno Wise payment method.\n\n\
+The Wise-USD payment method allows Haveno users to trade in USD.\n\n\
+Anyone with a Wise, formally Wise account, can add Wise-USD as a payment method in Haveno. This will \
allow them to buy and sell XMR with USD.\n\n\
When trading on Haveno XMR Buyers should not use any reference for reason for payment. If reason for payment is required \
- they should only use the full name of the TransferWise-USD account owner.
-payment.transferwiseUsd.info.buyer=Please send payment only to the email address in the XMR Seller's Haveno TransferWise-USD account.
-payment.transferwiseUsd.info.seller=Please check that the payment received matches the XMR Buyer's name of the TransferWise-USD account in Haveno.
+ they should only use the full name of the Wise-USD account owner.
+payment.transferwiseUsd.info.buyer=Please send payment only to the email address in the XMR Seller's Haveno Wise-USD account.
+payment.transferwiseUsd.info.seller=Please check that the payment received matches the XMR Buyer's name of the Wise-USD account in Haveno.
payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Haveno requires that you understand the following:\n\
\n\
@@ -2962,8 +2980,8 @@ payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on
- XMR buyers must send the USPMO to the XMR seller with Delivery Confirmation.\n\
\n\
In the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Haveno mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\n\
-Failure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\n\
-In all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\n\
+Failure to provide the required information to the arbitrator will result in losing the dispute case.\n\n\
+In all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the arbitrator.\n\n\
If you do not understand these requirements, do not trade using USPMO on Haveno.
payment.payByMail.info=Trading using Pay by Mail on Haveno requires that you understand the following:\n\
@@ -2994,11 +3012,13 @@ Any special terms/conditions; \n\
Any other details.
payment.tradingRestrictions=Please review the maker's terms and conditions.\n\
If you do not meet the requirements do not take this trade.
-payment.cashAtAtm.info=Cash at ATM: Cardless withdraw at ATM using code\n\n\
+payment.cashAtAtm.info=Cardless Cash: Cardless withdraw at ATM using code\n\n\
To use this payment method:\n\n\
- 1. Create a Cash at ATM payment account, lising your accepted banks, regions, or other terms to be shown with the offer.\n\n\
+ 1. Create a Cardless Cash payment account, listing your accepted banks, regions, or other terms to be shown with the offer.\n\n\
2. Create or take an offer with the payment account.\n\n\
3. When the offer is taken, chat with your peer to coordinate a time to complete the payment and share the payment details.\n\n\
+ If the trade amount is above the cash withdrawal limit, traders should split it into multiple transactions.\n\n\
+ ATM cash trades must be in multiples of 10. Using range offers is recommended so the XMR amount can adjust to match the exact price.\n\n\
If you cannot complete the transaction as specified in your trade contract, you may lose some (or all) of your security deposit.
payment.cashAtAtm.extraInfo.prompt=Please state on your offers: \n\n\
Your accepted banks / locations; \n\
@@ -3010,21 +3030,24 @@ payment.f2f.city=City for 'Face to face' meeting
payment.f2f.city.prompt=The city will be displayed with the offer
payment.shared.optionalExtra=Optional additional information
payment.shared.extraInfo=Additional information
-payment.shared.extraInfo.prompt=Define any special terms, conditions, or details you would like to be displayed with your offers for this payment account (users will see this info before accepting offers).
+payment.shared.extraInfo.offer=Additional offer information
+payment.shared.extraInfo.prompt.paymentAccount=Define any special terms, conditions, or details you would like to be displayed with your offers for this payment account (users will see this info before accepting offers).
+payment.shared.extraInfo.prompt.offer=Define any special terms, conditions, or details you would like to be displayed with your offer.
+payment.shared.extraInfo.noDeposit=Contact details and offer terms
payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\n\
The 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 be of much assistance as it is usually difficult to get tamper-proof evidence \
+ ● In case of a dispute the arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence \
of what happened at the meeting. In such cases the XMR funds might get locked indefinitely or until the trading peers come to \
an agreement.\n\n\
To be sure you fully understand the differences with 'Face to Face' trades please read the instructions and \
recommendations at: [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/F2F]
payment.f2f.info.openURL=Open web page
payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
-payment.f2f.offerbook.tooltip.extra=Additional information: {0}
+payment.shared.extraInfo.tooltip=Additional information: {0}
payment.ifsc=IFS Code
payment.ifsc.validation=IFSC format: XXXX0999999
@@ -3038,12 +3061,15 @@ payment.payid.info=A PayID like a phone number, email address or an Australian B
bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. \
Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/]
payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\n\
- Please see the wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] for further details and best practices. \n\n\
+ Please see the wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] for further details and best practices. \n\n\
Three important notes:\n\
- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n\
- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat \
to tell your trading peer the reference text you picked so they can verify your payment)\n\
- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.paysafe.info=For your protection, we strongly discourage using Paysafecard PINs for payment.\n\n\
+ Transactions made via PINs cannot be independently verified for dispute resolution. If an issue arises, recovering funds may not be possible.\n\n\
+ To ensure transaction security with dispute resolution, always use payment methods that provide verifiable records.
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -3055,7 +3081,7 @@ SPECIFIC_BANKS=Transfers with specific banks
US_POSTAL_MONEY_ORDER=US Postal Money Order
CASH_DEPOSIT=Cash Deposit
PAY_BY_MAIL=Pay By Mail
-CASH_AT_ATM=Cash at ATM
+CASH_AT_ATM=Cardless Cash
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=Face to face (in person)
@@ -3075,7 +3101,7 @@ CASH_DEPOSIT_SHORT=Cash Deposit
# suppress inspection "UnusedProperty"
PAY_BY_MAIL_SHORT=Pay By Mail
# suppress inspection "UnusedProperty"
-CASH_AT_ATM_SHORT=Cash At ATM
+CASH_AT_ATM_SHORT=Cardless Cash
# suppress inspection "UnusedProperty"
MONEY_GRAM_SHORT=MoneyGram
# suppress inspection "UnusedProperty"
@@ -3125,9 +3151,9 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
-TRANSFERWISE_USD=TransferWise-USD
+TRANSFERWISE_USD=Wise-USD
# suppress inspection "UnusedProperty"
PAYSERA=Paysera
# suppress inspection "UnusedProperty"
@@ -3221,9 +3247,9 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
-TRANSFERWISE_USD_SHORT=TransferWise-USD
+TRANSFERWISE_USD_SHORT=Wise-USD
# suppress inspection "UnusedProperty"
PAYSERA_SHORT=Paysera
# suppress inspection "UnusedProperty"
@@ -3279,6 +3305,8 @@ CASH_APP_SHORT=Cash App
# suppress inspection "UnusedProperty"
VENMO_SHORT=Venmo
PAYPAL_SHORT=PayPal
+# suppress inspection "UnusedProperty"
+PAYSAFE=Paysafe
####################################################################
diff --git a/core/src/main/resources/i18n/displayStrings_cs.properties b/core/src/main/resources/i18n/displayStrings_cs.properties
index f1c8fc6a31..5a2a065535 100644
--- a/core/src/main/resources/i18n/displayStrings_cs.properties
+++ b/core/src/main/resources/i18n/displayStrings_cs.properties
@@ -28,11 +28,14 @@ shared.readMore=Přečíst více
shared.openHelp=Otevřít nápovědu
shared.warning=Varování
shared.close=Zavřít
+shared.closeAnywayDanger=Přesto vypnout (NEBEZPEČNÉ!)
+shared.okWait=Dobře, počkám
shared.cancel=Zrušit
shared.ok=OK
shared.yes=Ano
shared.no=Ne
shared.iUnderstand=Rozumím
+shared.continueAnyway=Přesto pokračovat
shared.na=N/A
shared.shutDown=Vypnout
shared.reportBug=Nahlásit chybu na GitHubu
@@ -40,6 +43,8 @@ shared.buyMonero=Koupit monero
shared.sellMonero=Prodat monero
shared.buyCurrency=Koupit {0}
shared.sellCurrency=Prodat {0}
+shared.buyCurrencyLocked=Koupit {0} 🔒
+shared.sellCurrencyLocked=Prodat {0} 🔒
shared.buyingXMRWith=nakoupit XMR za {0}
shared.sellingXMRFor=prodat XMR za {0}
shared.buyingCurrency=nakoupit {0} (prodat XMR)
@@ -65,8 +70,8 @@ shared.fixedPriceInCurForCur=Pevná cena v {0} za 1 {1}
shared.amount=Množství
shared.txFee=Transakční poplatek
shared.tradeFee=Obchodní poplatek
-shared.buyerSecurityDeposit=Vklad kupujícího
-shared.sellerSecurityDeposit=Vklad prodejce
+shared.buyerSecurityDeposit=Vklad kauce kupujícího
+shared.sellerSecurityDeposit=Vklad kauce prodejce
shared.amountWithCur=Množství v {0}
shared.volumeWithCur=Objem v {0}
shared.currency=Měna
@@ -81,12 +86,13 @@ shared.balanceWithCur=Zůstatek v {0}
shared.utxo=Nevyčerpaný transakční výstup
shared.txId=ID transakce
shared.confirmations=Potvrzení
-shared.revert=Návratová Tx
+shared.revert=Vzít zpět Tx
shared.select=Vybrat
shared.usage=Použití
shared.state=Stav
shared.tradeId=ID obchodu
shared.offerId=ID nabídky
+shared.traderId=ID obchodníka
shared.bankName=Jméno banky
shared.acceptedBanks=Přijímané banky
shared.amountMinMax=Množství (min - max)
@@ -97,12 +103,12 @@ shared.XMRMinMax=XMR (min - max)
shared.removeOffer=Odstranit nabídku
shared.dontRemoveOffer=Neodstraňovat nabídku
shared.editOffer=Upravit nabídku
+shared.duplicateOffer=Duplikovat nabídku
shared.openLargeQRWindow=Otevřít velké okno s QR kódem
-shared.tradingAccount=Obchodní účet
+shared.chooseTradingAccount=Vyberte obchodní účet
shared.faq=Navštívit stránku FAQ
shared.yesCancel=Ano, zrušit
shared.nextStep=Další krok
-shared.selectTradingAccount=Vyberte obchodní účet
shared.fundFromSavingsWalletButton=Použít prostředky z peněženky Haveno
shared.fundFromExternalWalletButton=Otevřít vaši externí peněženku pro financování
shared.openDefaultWalletFailed=Nepodařilo se otevřít aplikaci peněženky Monero. Jste si jisti, že máte nějakou nainstalovanou?
@@ -111,10 +117,15 @@ shared.aboveInPercent=% nad tržní cenou
shared.enterPercentageValue=Zadejte % hodnotu
shared.OR=NEBO
shared.notEnoughFunds=Ve své peněžence Haveno nemáte pro tuto transakci dostatek prostředků — je potřeba {0}, ale k dispozici je pouze {1}.\n\nPřidejte prostředky z externí peněženky nebo financujte svou peněženku Haveno v části Prostředky > Přijmout prostředky.
-shared.waitingForFunds=Čekání na finance...
+shared.waitingForFunds=Čekání na finanční prostředky...
+shared.yourDepositTransactionId=ID vaší vkladové transakce
+shared.peerDepositTransactionId=ID vkladové transakce peera
+shared.makerDepositTransactionId=ID vkladové transakce tvůrce
+shared.takerDepositTransactionId=ID vkladové transakce příjemce
shared.TheXMRBuyer=XMR kupující
shared.You=Vy
-shared.sendingConfirmation=Posílám potvrzení...
+shared.preparingConfirmation=Příprava potvrzení...
+shared.sendingConfirmation=Odesílání potvrzení...
shared.sendingConfirmationAgain=Prosím pošlete potvrzení znovu
shared.exportCSV=Exportovat do CSV
shared.exportJSON=Exportovat do JSON
@@ -123,9 +134,11 @@ shared.noDateAvailable=Žádné datum není k dispozici
shared.noDetailsAvailable=Detaily nejsou k dispozici
shared.notUsedYet=Ještě nepoužito
shared.date=Datum
+shared.sendFundsDetailsWithFee=Odesílání: {0}nNa přijímací adresu: {1}.nPožadován těžební poplatek: {2}\n\nPříjemce dostane: {3}\n\nJste si jisti, že chcete vyplatit tuto částku?
# suppress inspection "TrailingSpacesInProperty"
shared.sendFundsDetailsDust=Haveno zjistil, že tato transakce by vytvořila drobné mince, které jsou pod limitem drobných mincí (a není to povoleno pravidly pro konsenzus Monero). Místo toho budou tyto drobné mince ({0} satoshi {1}) přidány k poplatku za těžbu.\n\n\n
shared.copyToClipboard=Kopírovat do schránky
+shared.copiedToClipboard=Zkopírováno do schránky!
shared.language=Jazyk
shared.country=Země
shared.applyAndShutDown=Potvrdit a ukončit
@@ -163,6 +176,7 @@ shared.acceptedTakerCountries=Země příjemce akceptovány
shared.tradePrice=Tržní cena
shared.tradeAmount=Výše obchodu
shared.tradeVolume=Objem obchodu
+shared.reservedAmount=Rezervovaná částka
shared.invalidKey=Vložený klíč není správný
shared.enterPrivKey=Pro odemknutí vložte privátní klíč
shared.payoutTxId=ID platební transakce
@@ -186,13 +200,16 @@ shared.total=Celkem
shared.totalsNeeded=Potřebné prostředky
shared.tradeWalletAddress=Adresa obchodní peněženky
shared.tradeWalletBalance=Zůstatek obchodní peněženky
-shared.reserveExactAmount=Rezervujte pouze potřebné finanční prostředky. Před aktivací vaší nabídky může být vyžadována těžební poplatek a 10 potvrzení (~20 minut).
+shared.reserveExactAmount=Rezervujte pouze nezbytné prostředky. Vyžaduje poplatek za těžbu a přibližně 20 minut, než vaše nabídka půjde živě.
shared.makerTxFee=Tvůrce: {0}
shared.takerTxFee=Příjemce: {0}
shared.iConfirm=Potvrzuji
-shared.openURL=Otevřené {0}
+shared.openURL=Otevřít {0}
shared.fiat=Fiat
shared.crypto=Krypto
+shared.traditional=Tradiční
+shared.otherAssets=jiná aktiva
+shared.other=Jiné
shared.preciousMetals=Drahé kovy
shared.all=Vše
shared.edit=Upravit
@@ -211,12 +228,16 @@ shared.mediator=Mediátor
shared.arbitrator=Rozhodce
shared.refundAgent=Rozhodce
shared.refundAgentForSupportStaff=Rozhodce pro vrácení peněz
-shared.delayedPayoutTxId=ID odložené platební transakce
-shared.delayedPayoutTxReceiverAddress=Odložená výplatní transakce odeslána na
+shared.delayedPayoutTxId=ID zpožděné platební transakce
+shared.delayedPayoutTxReceiverAddress=Zpožděná výplatní transakce odeslána na
shared.unconfirmedTransactionsLimitReached=Momentálně máte příliš mnoho nepotvrzených transakcí. Prosím zkuste to znovu později.
shared.numItemsLabel=Počet položek: {0}
shared.filter=Filtr
shared.enabled=Aktivní
+shared.pending=Otevřené
+shared.me=Já
+shared.maker=Tvůrce
+shared.taker=Příjemce
####################################################################
@@ -231,14 +252,15 @@ mainView.menu.market=Trh
mainView.menu.buyXmr=Koupit XMR
mainView.menu.sellXmr=Prodat XMR
mainView.menu.portfolio=Portfolio
-mainView.menu.funds=Finance
+mainView.menu.funds=Prostředky
mainView.menu.support=Podpora
mainView.menu.settings=Nastavení
mainView.menu.account=Účet
mainView.marketPriceWithProvider.label=Tržní cena {0}
mainView.marketPrice.havenoInternalPrice=Cena posledního Haveno obchodu
-mainView.marketPrice.tooltip.havenoInternalPrice=Neexistují tržní ceny od externích poskytovatelů cenových feedů.\nZobrazená cena je nejnovější obchodní cena Haveno pro tuto měnu.
+mainView.marketPrice.tooltip.havenoInternalPrice=Neexistují tržní ceny od externích poskytovatelů cenových feedů.\n\
+Zobrazená cena je nejnovější obchodní cena Haveno pro tuto měnu.
mainView.marketPrice.tooltip=Tržní cena je poskytována {0}{1}\nPoslední aktualizace: {2}\nURL uzlu poskytovatele: {3}
mainView.balance.available=Dostupný zůstatek
mainView.balance.reserved=Rezervováno v nabídkách
@@ -250,7 +272,7 @@ mainView.footer.usingTor=(přes Tor)
mainView.footer.localhostMoneroNode=(localhost)
mainView.footer.clearnet=(přes clearnet)
mainView.footer.xmrInfo={0} {1}
-mainView.footer.xmrFeeRate=/ Aktuální poplatek: {0} sat/vB
+mainView.footer.xmrFeeRate=/ Míra poplatku: {0} sat/vB
mainView.footer.xmrInfo.initializing=Připojování k síti Haveno
mainView.footer.xmrInfo.synchronizingWith=Synchronizace s {0} na bloku: {1} / {2}
mainView.footer.xmrInfo.connectedTo=Připojeno k {0} v bloku {1}
@@ -263,7 +285,7 @@ mainView.footer.p2pPeers=Haveno síťové uzly: {0}
mainView.bootstrapState.connectionToTorNetwork=(1/4) Připojování do sítě Tor...
mainView.bootstrapState.torNodeCreated=(2/4) Tor uzel vytvořen
-mainView.bootstrapState.hiddenServicePublished=(3/4) Skrytá služba publikována
+mainView.bootstrapState.hiddenServicePublished=(3/4) Skrytá služba zveřejněna
mainView.bootstrapState.initialDataReceived=(4/4) Iniciační data přijata
mainView.bootstrapWarning.noSeedNodesAvailable=Žádné seed uzly nejsou k dispozici
@@ -281,6 +303,7 @@ mainView.walletServiceErrorMsg.rejectedTxException=Transakce byla ze sítě zam
mainView.networkWarning.allConnectionsLost=Ztratili jste připojení ke všem {0} síťovým peer uzlům.\nMožná jste ztratili připojení k internetu nebo byl váš počítač v pohotovostním režimu.
mainView.networkWarning.localhostMoneroLost=Ztratili jste připojení k localhost uzlu Monero.\nRestartujte aplikaci Haveno a připojte se k jiným uzlům Monero nebo restartujte localhost Monero uzel.
mainView.version.update=(Dostupná aktualizace)
+mainView.status.connections=Příchozí připojení: {0}nOdchozí připojení: {1}
####################################################################
@@ -292,11 +315,10 @@ market.tabs.spreadCurrency=Nabídky podle měn
market.tabs.spreadPayment=Nabídky podle způsobů platby
market.tabs.trades=Obchody
+# OfferBookView
+market.offerBook.filterPrompt=Filtr
+
# OfferBookChartView
-market.offerBook.buyCrypto=Koupit {0} (prodat {1})
-market.offerBook.sellCrypto=Prodat {0} (koupit {1})
-market.offerBook.buyWithTraditional=Koupit {0}
-market.offerBook.sellWithTraditional=Prodat {0}
market.offerBook.sellOffersHeaderLabel=Prodat {0} kupujícímu
market.offerBook.buyOffersHeaderLabel=Koupit {0} od prodejce
market.offerBook.buy=Chci koupit monero
@@ -328,20 +350,22 @@ market.trades.showVolumeInUSD=Zobrazit objem v USD
offerbook.createOffer=Vytvořit nabídku
offerbook.takeOffer=Přijmout nabídku
-offerbook.takeOfferToBuy=Přijmout nabídku na nákup {0}
-offerbook.takeOfferToSell=Přijmout nabídku k prodeji {0}
+offerbook.takeOffer.createAccount=Vytvořit účet a přijmout nabídku
+offerbook.takeOffer.enterChallenge=Zadejte heslo nabídky
offerbook.trader=Obchodník
offerbook.offerersBankId=ID banky tvůrce (BIC/SWIFT): {0}
offerbook.offerersBankName=Jméno banky tvůrce: {0}
offerbook.offerersBankSeat=Sídlo banky tvůrce: {0}
offerbook.offerersAcceptedBankSeatsEuro=Přijatá sídla bank (příjemce): Všechny země Eura
offerbook.offerersAcceptedBankSeats=Přijatá sídla bank (příjemce):\n {0}
-offerbook.availableOffers=Dostupné nabídky
+offerbook.availableOffersToBuy=Koupit {0} pomocí {1}
+offerbook.availableOffersToSell=Prodat {0} za {1}
offerbook.filterByCurrency=Filtrovat podle měny
offerbook.filterByPaymentMethod=Filtrovat podle platební metody
offerbook.matchingOffers=Nabídky odpovídající mým účtům
+offerbook.filterNoDeposit=Žádný vklad
+offerbook.noDepositOffers=Nabídky bez zálohy (vyžaduje se heslo)
offerbook.timeSinceSigning=Informace o účtu
-offerbook.timeSinceSigning.info=Tento účet byl ověřen a {0}
offerbook.timeSinceSigning.info.arbitrator=podepsán rozhodcem a může podepisovat účty partnerů
offerbook.timeSinceSigning.info.peer=podepsáno partnerem, nyní čeká ještě %d dnů na zrušení limitů
offerbook.timeSinceSigning.info.peerLimitLifted=podepsán partnerem a limity byly zrušeny
@@ -349,16 +373,23 @@ offerbook.timeSinceSigning.info.signer=podepsán partnerem a může podepsat ú
offerbook.timeSinceSigning.info.banned=účet byl zablokován
offerbook.timeSinceSigning.daysSinceSigning={0} dní
offerbook.timeSinceSigning.daysSinceSigning.long={0} od podpisu
+offerbook.timeSinceSigning.tooltip.accountLimit=Limit účtu: {0}
+offerbook.timeSinceSigning.tooltip.accountLimitLifted=Limit účtu odebrán
+offerbook.timeSinceSigning.tooltip.info.unsigned=Tento účet ještě nebyl podepsán
+offerbook.timeSinceSigning.tooltip.info.signed=Tento účet byl podepsán
+offerbook.timeSinceSigning.tooltip.info.signedAndLifted=Tento účet byl podepsán a může podepisovat účty peerů
+offerbook.timeSinceSigning.tooltip.checkmark.buyXmr=nakoupeno XMR od podepsaného účtu
+offerbook.timeSinceSigning.tooltip.checkmark.wait=čekáno alespoň {0} dnů
+offerbook.timeSinceSigning.tooltip.learnMore=Více informací
offerbook.xmrAutoConf=Je automatické potvrzení povoleno
-offerbook.buyXmrWith=Kupte XMR za:
+offerbook.buyXmrWith=Koupit XMR za:
offerbook.sellXmrFor=Prodat XMR za:
-offerbook.timeSinceSigning.help=Když úspěšně dokončíte obchod s uživatelem, který má podepsaný platební účet, je váš platební účet podepsán.\n{0} dní později se počáteční limit {1} zruší a váš účet může podepisovat platební účty ostatních uživatelů.
+offerbook.timeSinceSigning.help=Když úspěšně dokončíte obchod s uživatelem, který má podepsaný platební účet, je váš platební účet podepsán.\n\
+ {0} dní později se počáteční limit {1} zruší a váš účet může podepisovat platební účty ostatních uživatelů.
offerbook.timeSinceSigning.notSigned=Dosud nepodepsáno
offerbook.timeSinceSigning.notSigned.ageDays={0} dní
offerbook.timeSinceSigning.notSigned.noNeed=N/A
-shared.notSigned=Tento účet ještě nebyl podepsán a byl vytvořen před {0} dny
-shared.notSigned.noNeed=Tento typ účtu nevyžaduje podepisování
shared.notSigned.noNeedDays=Tento typ účtu nevyžaduje podepisování a byl vytvořen před {0} dny
shared.notSigned.noNeedAlts=Kryptoměnové účty neprocházejí kontrolou podpisu a stáří
@@ -366,23 +397,18 @@ offerbook.nrOffers=Počet nabídek: {0}
offerbook.volume={0} (min - max)
offerbook.deposit=Kauce XMR (%)
offerbook.deposit.help=Kauce zaplacená každým obchodníkem k zajištění obchodu. Bude vrácena po dokončení obchodu.
+
offerbook.createNewOffer=Vytvořit nabídku pro {0} {1}
+offerbook.createOfferDisabled.tooltip=Můžete vytvořit zároveň jen jednu nabídku
-offerbook.createOfferToBuy=Vytvořit novou nabídku k nákupu {0}
-offerbook.createOfferToSell=Vytvořit novou nabídku k prodeji {0}
-offerbook.createOfferToBuy.withTraditional=Vytvořit novou nabídku k nákupu {0} za {1}
-offerbook.createOfferToSell.forTraditional=Vytvořit novou nabídku k prodeji {0} za {1}
-offerbook.createOfferToBuy.withCrypto=Vytvořit novou nabídku k prodeji {0} (koupit {1})
-offerbook.createOfferToSell.forCrypto=Vytvořit novou nabídku na nákup {0} (prodat {1})
-
-offerbook.takeOfferButton.tooltip=Využijte nabídku {0}
-offerbook.yesCreateOffer=Ano, vytvořit nabídku
+offerbook.takeOfferButton.tooltip=Využít nabídku {0}
offerbook.setupNewAccount=Založit nový obchodní účet
offerbook.removeOffer.success=Odebrání nabídky bylo úspěšné.
offerbook.removeOffer.failed=Odebrání nabídky selhalo:\n{0}
offerbook.deactivateOffer.failed=Deaktivace nabídky se nezdařila:\n{0}
offerbook.activateOffer.failed=Zveřejnění nabídky se nezdařilo:\n{0}
-offerbook.withdrawFundsHint=Prostředky, které jste zaplatili, můžete vybrat z obrazovky {0}.
+offerbook.withdrawFundsHint=Nabídka byla odebrána. Prostředky již nejsou pro tuto nabídku rezervovány. \n
+ Dostupné prostředky můžete odeslat do své externí peněženky prostřednictvím {0}.
offerbook.warning.noTradingAccountForCurrency.headline=Žádný platební účet pro vybranou měnu
offerbook.warning.noTradingAccountForCurrency.msg=Pro vybranou měnu nemáte nastavený platební účet.\n\nChcete místo toho vytvořit nabídku pro jinou měnu?
@@ -391,10 +417,18 @@ offerbook.warning.noMatchingAccount.msg=Tato nabídka používá platební metod
offerbook.warning.counterpartyTradeRestrictions=Tuto nabídku nelze přijmout z důvodu obchodních omezení protistrany
-offerbook.warning.newVersionAnnouncement=S touto verzí softwaru mohou obchodní partneři navzájem ověřovat a podepisovat platební účty ostatních a vytvářet tak síť důvěryhodných platebních účtů.\n\nPo úspěšném obchodování s partnerským účtem s ověřeným platebním účtem bude váš platební účet podepsán a obchodní limity budou zrušeny po určitém časovém intervalu (délka tohoto intervalu závisí na způsobu ověření).\n\nDalší informace o podepsání účtu naleznete v dokumentaci na adrese [HYPERLINK:https://docs.haveno.exchange/payment-methods#account-signing].
+offerbook.warning.newVersionAnnouncement=S touto verzí softwaru mohou obchodní partneři navzájem ověřovat a podepisovat platební účty ostatních a vytvářet tak síť důvěryhodných platebních účtů.\n\n
+Po úspěšném obchodování s partnerským účtem s ověřeným platebním účtem bude váš platební účet podepsán a obchodní limity budou zrušeny po určitém časovém intervalu (délka tohoto intervalu závisí na způsobu ověření).\n\n
+Další informace o podepsání účtu naleznete v dokumentaci na adrese [HYPERLINK:https://docs.haveno.exchange/the-project/account_limits/#account-signing].
-popup.warning.tradeLimitDueAccountAgeRestriction.seller=Povolená částka obchodu je omezena na {0} z důvodu bezpečnostních omezení na základě následujících kritérií:\n- Účet kupujícího nebyl podepsán rozhodcem ani obchodním partnerem\n- Doba od podpisu účtu kupujícího není alespoň 30 dní\n- Způsob platby této nabídky je považován za riskantní pro bankovní zpětné zúčtování\n\n{1}
-popup.warning.tradeLimitDueAccountAgeRestriction.buyer=Povolená částka obchodu je omezena na {0} z důvodu bezpečnostních omezení na základě následujících kritérií:\n- Váš účet nebyl podepsán rozhodcem ani obchodním partnerem\n- Čas od podpisu vašeho účtu není alespoň 30 dní\n- Způsob platby této nabídky je považován za riskantní pro bankovní zpětné zúčtování\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.seller=Povolená částka obchodu je omezena na {0} z důvodu bezpečnostních omezení na základě následujících kritérií:\n\
+- Účet kupujícího nebyl podepsán rozhodcem ani obchodním partnerem\n\
+- Doba od podpisu účtu kupujícího není alespoň 30 dní\n\
+- Způsob platby této nabídky je považován za riskantní pro bankovní zpětné zúčtování\n\n{1}
+popup.warning.tradeLimitDueAccountAgeRestriction.buyer=Povolená částka obchodu je omezena na {0} z důvodu bezpečnostních omezení na základě následujících kritérií:\n\
+- Váš účet nebyl podepsán rozhodcem ani obchodním partnerem\n\
+- Čas od podpisu vašeho účtu není alespoň 30 dní\n\
+- Způsob platby této nabídky je považován za riskantní pro bankovní zpětné zúčtování\n\n{1}
popup.warning.tradeLimitDueAccountAgeRestriction.seller.releaseLimit=Tento platební metoda je dočasně omezena na {0} do {1}, protože všichni kupující mají nové účty.\n\n{2}
popup.warning.tradeLimitDueAccountAgeRestriction.seller.exceedsUnsignedBuyLimit=Vaše nabídka bude omezena na kupující s podepsanými a starými účty, protože překračuje {0}.\n\n{1}
@@ -404,8 +438,13 @@ offerbook.warning.offerBlocked=Tato nabídka byla blokována vývojáři Haveno.
offerbook.warning.currencyBanned=Měna použitá v této nabídce byla blokována vývojáři Haveno.\nDalší informace naleznete na fóru Haveno.
offerbook.warning.paymentMethodBanned=Vývojáři Haveno zablokovali způsob platby použitý v této nabídce.\nDalší informace naleznete na fóru Haveno.
offerbook.warning.nodeBlocked=Onion adresa tohoto obchodníka byla zablokována vývojáři Haveno.\nPravděpodobně existuje neošetřená chyba způsobující problémy při přijímání nabídek od tohoto obchodníka.
-offerbook.warning.requireUpdateToNewVersion=Vaše verze Haveno již není kompatibilní pro obchodování. Aktualizujte prosím na nejnovější verzi Haveno na adrese [HYPERLINK:https://haveno.exchange/downloads].
-offerbook.warning.offerWasAlreadyUsedInTrade=Tuto nabídku nemůžete přijmout, protože jste ji již dříve využili. Je možné, že váš předchozí pokus o přijetí nabídky vyústil v neúspěšný obchod.
+offerbook.warning.requireUpdateToNewVersion=Vaše verze Haveno již není kompatibilní pro obchodování.
+ Aktualizujte prosím na nejnovější verzi Haveno.
+offerbook.warning.offerWasAlreadyUsedInTrade=Tuto nabídku nemůžete přijmout, protože jste ji již dříve využili. \
+Je možné, že váš předchozí pokus o přijetí nabídky vyústil v neúspěšný obchod.
+
+offerbook.warning.arbitratorNotValidated=Tuto nabídku nelze přijmout, protože rozhodce je neplatný
+offerbook.warning.signatureNotValidated=Tuto nabídku nelze přijmout, protože rozhodce má neplatný podpis
offerbook.info.sellAtMarketPrice=Budete prodávat za tržní cenu (aktualizováno každou minutu).
offerbook.info.buyAtMarketPrice=Budete nakupovat za tržní cenu (aktualizováno každou minutu).
@@ -415,25 +454,28 @@ offerbook.info.sellAboveMarketPrice=Získáte o {0} více, než je aktuální tr
offerbook.info.buyBelowMarketPrice=Platíte o {0} méně, než je aktuální tržní cena (aktualizováno každou minutu).
offerbook.info.buyAtFixedPrice=Budete nakupovat za tuto pevnou cenu.
offerbook.info.sellAtFixedPrice=Budete prodávat za tuto pevnou cenu.
-offerbook.info.noArbitrationInUserLanguage=V případě sporu mějte na paměti, že arbitráž pro tuto nabídku bude řešit {0}. Jazyk je aktuálně nastaven na {1}.
offerbook.info.roundedFiatVolume=Částka byla zaokrouhlena, aby se zvýšilo soukromí vašeho obchodu.
####################################################################
# Offerbook / Create offer
####################################################################
-createOffer.amount.prompt=Vložte množství v XMR
+createOffer.amount.prompt=Zadejte množství v XMR
createOffer.price.prompt=Zadejte cenu
-createOffer.volume.prompt=Vložte množství v {0}
+createOffer.volume.prompt=Zadejte množství v {0}
createOffer.amountPriceBox.amountDescription=Množství XMR, které chcete {0}
-createOffer.amountPriceBox.buy.volumeDescription=Částka v {0}, kterou utratíte
-createOffer.amountPriceBox.sell.volumeDescription=Částka v {0}, kterou přijmete
+createOffer.amountPriceBox.buy.amountDescriptionCrypto=Množství XMR k prodeji
+createOffer.amountPriceBox.sell.amountDescriptionCrypto=Množství XMR k nákupu
+createOffer.amountPriceBox.buy.volumeDescription=Množství {0}, které odešlete
+createOffer.amountPriceBox.sell.volumeDescription=Množství {0}, které přijmete
+createOffer.amountPriceBox.buy.volumeDescriptionCrypto=Množství {0} k prodání
+createOffer.amountPriceBox.sell.volumeDescriptionCrypto=Množství {0} k nakoupení
createOffer.amountPriceBox.minAmountDescription=Minimální množství XMR
createOffer.securityDeposit.prompt=Kauce
-createOffer.fundsBox.title=Financujte svou nabídku
+createOffer.fundsBox.title=Financovat nabídku
createOffer.fundsBox.offerFee=Obchodní poplatek
createOffer.fundsBox.networkFee=Poplatek za těžbu
-createOffer.fundsBox.placeOfferSpinnerInfo=Probíhá publikování nabídky ...
+createOffer.fundsBox.placeOfferSpinnerInfo=Probíhá zveřejnění nabídky ...
createOffer.fundsBox.paymentLabel=Haveno obchod s ID {0}
createOffer.fundsBox.fundsStructure=(kauce {0}, obchodní poplatek {1}, poplatek za těžbu {2})
createOffer.success.headline=Vaše nabídka byla vytvořena
@@ -445,47 +487,55 @@ createOffer.info.buyBelowMarketPrice=Vždy zaplatíte o {0} % méně, než je ak
createOffer.warning.sellBelowMarketPrice=Vždy získáte o {0} % méně, než je aktuální tržní cena, protože cena vaší nabídky bude průběžně aktualizována.
createOffer.warning.buyAboveMarketPrice=Vždy zaplatíte o {0} % více, než je aktuální tržní cena, protože cena vaší nabídky bude průběžně aktualizována.
createOffer.tradeFee.descriptionXMROnly=Obchodní poplatek
-createOffer.tradeFee.descriptionBSQEnabled=Zvolte měnu obchodního poplatku
+createOffer.tradeFee.description=Obchodní poplatek
createOffer.triggerPrice.prompt=Nepovinná limitní cena
createOffer.triggerPrice.label=Deaktivovat nabídku, pokud tržní cena dosáhne {0}
-createOffer.triggerPrice.tooltip=Abyste se ochránili před prudkými výkyvy tržních cen, můžete nastavit limitní cenu, po jejímž dosažení bude vaše nabídka stažena.
+createOffer.triggerPrice.tooltip=Abyste se ochránili před prudkými výkyvy tržních cen, můžete nastavit limitní cenu, \
+po jejímž dosažení bude vaše nabídka stažena.
createOffer.triggerPrice.invalid.tooLow=Hodnota musí být vyšší než {0}
createOffer.triggerPrice.invalid.tooHigh=Hodnota musí být nižší než {0}
# new entries
-createOffer.placeOfferButton=Přehled: Umístěte nabídku {0} monero
-createOffer.createOfferFundWalletInfo.headline=Financujte svou nabídku
+createOffer.placeOfferButton=Zkontrolovat vytvoření nabídky {0} monero
+createOffer.placeOfferButtonCrypto=Zkontrolovat vytvoření nabídky {0} {1}
+createOffer.createOfferFundWalletInfo.headline=Financovat nabídku
# suppress inspection "TrailingSpacesInProperty"
createOffer.createOfferFundWalletInfo.tradeAmount=- Výše obchodu: {0}\n
createOffer.createOfferFundWalletInfo.msg=Potřebujete vložit {0} do této nabídky.\n\n\
- Tyto prostředky jsou rezervovány ve vaší místní peněžence a budou zablokovány v multisig peněžence, jakmile někdo přijme vaši nabídku.\n\n\
- Částka je součtem:\n\
- {1}\
- - Vaše záloha: {2}\n\
- - Poplatek za obchodování: {3}
+ Tyto prostředky jsou rezervovány ve vaší místní peněžence a budou zablokovány v multisig peněžence, jakmile někdo přijme vaši nabídku.\n\n\
+ Částka je součtem:\n\
+ {1}\
+ - Vaše záloha: {2}\n\
+ - Poplatek za obchodování: {3}
# 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=Při zadávání nabídky došlo k chybě:\n\n{0}\n\nPeněženku ještě neopustily žádné finanční prostředky.\nRestartujte aplikaci a zkontrolujte síťové připojení.
+createOffer.amountPriceBox.error.message=Při zadávání nabídky došlo k chybě:\n\n{0}\n\n
+Peněženku ještě neopustily žádné finanční prostředky.\n\
+Restartujte aplikaci a zkontrolujte síťové připojení.
createOffer.setAmountPrice=Nastavit množství a cenu
-createOffer.warnCancelOffer=Tuto nabídku jste již financovali. Pokud ji nyní zrušíte, zůstanou vaše prostředky v místní peněžence Haveno a budou k dispozici pro výběr na obrazovce "Prostředky/Odeslat prostředky". Opravdu si přejete zrušit?
+createOffer.warnCancelOffer=Tuto nabídku jste již financovali. Pokud ji nyní zrušíte, zůstanou vaše prostředky v místní peněžence Haveno a budou k dispozici pro výběr na obrazovce \"Prostředky/Odeslat prostředky\". Opravdu si přejete zrušit?
createOffer.timeoutAtPublishing=Při zveřejnění nabídky došlo k vypršení časového limitu.
createOffer.errorInfo=\n\nTvůrčí poplatek je již zaplacen. V nejhorším případě jste tento poplatek ztratili.\nZkuste prosím restartovat aplikaci a zkontrolovat síťové připojení, abyste zjistili, zda můžete problém vyřešit.
-createOffer.tooLowSecDeposit.warning=Nastavili jste kauci na nižší hodnotu, než je doporučená výchozí hodnota {0}.\nOpravdu chcete použít nižší kauci?
+createOffer.tooLowSecDeposit.warning=Nastavili jste kauci na nižší hodnotu, než je doporučená výchozí hodnota {0}.\n
+ Opravdu chcete použít nižší kauci?
createOffer.tooLowSecDeposit.makerIsSeller=Poskytuje vám to menší ochranu v případě, že obchodní partner nedodrží obchodní protokol.
-createOffer.tooLowSecDeposit.makerIsBuyer=Obchodní partner bude mít menší jistotu, že dodržíte obchodní protokol, protože uložená kauce bude příliš nízká. Ostatní uživatelé mohou raději využít jiné nabídky než té vaší.
+createOffer.tooLowSecDeposit.makerIsBuyer=Obchodní partner bude mít menší jistotu, že dodržíte obchodní protokol, protože uložená kauce bude příliš nízká. \
+ Ostatní uživatelé mohou raději využít jiné nabídky než té vaší.
createOffer.resetToDefault=Ne, restartovat na výchozí hodnotu
createOffer.useLowerValue=Ano, použijte moji nižší hodnotu
createOffer.priceOutSideOfDeviation=Cena, kterou jste zadali, je mimo max. povolenou odchylku od tržní ceny.\nMax. povolená odchylka je {0} a lze ji upravit v preferencích.
createOffer.changePrice=Změnit cenu
-createOffer.tac=Publikováním této nabídky souhlasím s obchodováním s jakýmkoli obchodníkem, který splňuje podmínky definované na této obrazovce.
-createOffer.currencyForFee=Obchodní poplatek
+createOffer.tac=Zveřejněním této nabídky souhlasím s obchodováním s jakýmkoli obchodníkem, který splňuje podmínky definované na této obrazovce.
createOffer.setDeposit=Nastavit kauci kupujícího (%)
createOffer.setDepositAsBuyer=Nastavit mou kauci jako kupujícího (%)
createOffer.setDepositForBothTraders=Nastavit kauci obou obchodníků (%)
-createOffer.securityDepositInfo=Kauce vašeho kupujícího bude {0}
+createOffer.securityDepositInfo=Vaše kauce kupujícího bude {0}
createOffer.securityDepositInfoAsBuyer=Vaše kauce jako kupující bude {0}
-createOffer.minSecurityDepositUsed=Je použita min. záloha kupujícího
+createOffer.minSecurityDepositUsed=Minimální bezpečnostní záloha je použita
+createOffer.buyerAsTakerWithoutDeposit=Žádný vklad od kupujícího (chráněno heslem)
+createOffer.myDeposit=Můj bezpečnostní vklad (%)
+createOffer.myDepositInfo=Vaše záloha na bezpečnost bude {0}
####################################################################
@@ -494,14 +544,16 @@ createOffer.minSecurityDepositUsed=Je použita min. záloha kupujícího
takeOffer.amount.prompt=Vložte množství v XMR
takeOffer.amountPriceBox.buy.amountDescription=Množství XMR na prodej
-takeOffer.amountPriceBox.sell.amountDescription=Množství XMR k nákupu
+takeOffer.amountPriceBox.sell.amountDescription=Množství XMR k nakoupení
+takeOffer.amountPriceBox.buy.amountDescriptionCrypto=Množství XMR na prodej
+takeOffer.amountPriceBox.sell.amountDescriptionCrypto=Množství XMR k nakoupení
takeOffer.amountPriceBox.priceDescription=Cena za monero v {0}
takeOffer.amountPriceBox.amountRangeDescription=Možný rozsah množství
takeOffer.amountPriceBox.warning.invalidXmrDecimalPlaces=Částka, kterou jste zadali, přesahuje počet povolených desetinných míst.\nČástka byla upravena na 4 desetinná místa.
takeOffer.validation.amountSmallerThanMinAmount=Částka nesmí být menší než minimální částka stanovená v nabídce.
takeOffer.validation.amountLargerThanOfferAmount=Vstupní částka nesmí být vyšší než částka stanovená v nabídce.
takeOffer.validation.amountLargerThanOfferAmountMinusFee=Toto vstupní množství by vytvořilo zanedbatelné drobné pro prodejce XMR.
-takeOffer.fundsBox.title=Financujte svůj obchod
+takeOffer.fundsBox.title=Financovat obchod
takeOffer.fundsBox.isOfferAvailable=Kontroluje se, zda je nabídka k dispozici ...
takeOffer.fundsBox.tradeAmount=Částka k prodeji
takeOffer.fundsBox.offerFee=Obchodní poplatek
@@ -509,23 +561,26 @@ takeOffer.fundsBox.networkFee=Celkové poplatky za těžbu
takeOffer.fundsBox.takeOfferSpinnerInfo=Přijímám nabídku: {0}
takeOffer.fundsBox.paymentLabel=Haveno obchod s ID {0}
takeOffer.fundsBox.fundsStructure=(kauce {0}, obchodní poplatek {1}, poplatek za těžbu {2})
+takeOffer.fundsBox.noFundingRequiredTitle=Žádné financování požadováno
+takeOffer.fundsBox.noFundingRequiredDescription=Získejte passphrase nabídky od prodávajícího mimo Haveno, abyste tuto nabídku přijali.
takeOffer.success.headline=Úspěšně jste přijali nabídku.
takeOffer.success.info=Stav vašeho obchodu můžete vidět v \"Portfolio/Otevřené obchody\".
takeOffer.error.message=Při převzetí nabídky došlo k chybě.\n\n{0}
# new entries
-takeOffer.takeOfferButton=Přehled: Využijte nabídku {0} monero
+takeOffer.takeOfferButton=Zkontrolovat přijetí nabídky {0} monero
+takeOffer.takeOfferButtonCrypto=Zkontrolovat přijetí nabídky {0} {1}
takeOffer.noPriceFeedAvailable=Tuto nabídku nemůžete vzít, protože používá procentuální cenu založenou na tržní ceně, ale není k dispozici žádný zdroj cen.
-takeOffer.takeOfferFundWalletInfo.headline=Financujte svůj obchod
+takeOffer.takeOfferFundWalletInfo.headline=Financovat obchod
# suppress inspection "TrailingSpacesInProperty"
takeOffer.takeOfferFundWalletInfo.tradeAmount=- Výše obchodu: {0} \n
takeOffer.takeOfferFundWalletInfo.msg=Abyste mohli tuto nabídku využít, musíte vložit {0}.\n\nČástka je součtem:\n{1} - Vaší kauce: {2}\n- Obchodního poplatku: {3}\n- Celkového poplatku za těžbu: {4}\n\nPři financování obchodu si můžete vybrat ze dvou možností:\n- Použijte svou peněženku Haveno (pohodlné, ale transakce mohou být propojitelné) NEBO\n- Platba z externí peněženky (potenciálně více soukromé)\n\nPo uzavření tohoto vyskakovacího okna se zobrazí všechny možnosti a podrobnosti financování.
takeOffer.alreadyPaidInFunds=Pokud jste již prostředky zaplatili, můžete je vybrat na obrazovce \"Prostředky/Odeslat prostředky\".
-takeOffer.paymentInfo=Informace o platbě
takeOffer.setAmountPrice=Nastavit částku
-takeOffer.alreadyFunded.askCancel=Tuto nabídku jste již financovali. Pokud ji nyní zrušíte, zůstanou vaše prostředky v místní peněžence Haveno a budou k dispozici pro výběr na obrazovce "Prostředky/Odeslat prostředky". Opravdu si přejete zrušit?
+takeOffer.alreadyFunded.askCancel=Tuto nabídku jste již financovali. Pokud ji nyní zrušíte, zůstanou vaše prostředky v místní peněžence Haveno a budou k dispozici pro výběr na obrazovce \"Prostředky/Odeslat prostředky\". Opravdu si přejete zrušit?
takeOffer.failed.offerNotAvailable=Žádost o nabídku se nezdařila, protože nabídka již není k dispozici. Možná, že mezitím nabídku přijal jiný obchodník.
takeOffer.failed.offerTaken=Tuto nabídku nemůžete přijmout, protože ji již přijal jiný obchodník.
+takeOffer.failed.offerInvalid=Tuto nabídku nemůžete přijmout, protože podpis tvůrce je neplatný.
takeOffer.failed.offerRemoved=Tuto nabídku nemůžete přijmout, protože mezitím byla nabídka odstraněna.
takeOffer.failed.offererNotOnline=Přijetí nabídky se nezdařilo, protože tvůrce již není online.
takeOffer.failed.offererOffline=Tuto nabídku nemůžete přijmout, protože je tvůrce offline.
@@ -533,7 +588,7 @@ takeOffer.warning.connectionToPeerLost=Ztratili jste spojení s tvůrcem.\nMohli
takeOffer.error.noFundsLost=\n\nPeněženku ještě neopustily žádné finanční prostředky.\nZkuste prosím restartovat aplikaci a zkontrolovat síťové připojení, abyste zjistili, zda můžete problém vyřešit.
# suppress inspection "TrailingSpacesInProperty"
-takeOffer.error.feePaid=.\n\n
+takeOffer.error.feePaid=\n\n
takeOffer.error.depositPublished=\n\nVkladová transakce je již zveřejněna.\nZkuste prosím restartovat aplikaci a zkontrolovat síťové připojení, abyste zjistili, zda můžete problém vyřešit.\nPokud problém přetrvává, kontaktujte vývojáře a požádejte je o podporu.
takeOffer.error.payoutPublished=\n\nVyplacená transakce je již zveřejněna.\nZkuste prosím restartovat aplikaci a zkontrolovat síťové připojení, abyste zjistili, zda můžete problém vyřešit.\nPokud problém přetrvává, kontaktujte vývojáře a požádejte je o podporu.
takeOffer.tac=Přijetím této nabídky souhlasím s obchodními podmínkami definovanými na této obrazovce.
@@ -545,11 +600,12 @@ takeOffer.tac=Přijetím této nabídky souhlasím s obchodními podmínkami def
openOffer.header.triggerPrice=Limitní cena
openOffer.triggerPrice=Limitní cena {0}
-openOffer.triggered=Nabídka byla deaktivována, protože tržní cena dosáhla vámi stanovené limitní ceny.\nProsím nastavte novou limitní cenu ve vaší nabídce
+openOffer.triggered=Nabídka byla deaktivována, protože tržní cena dosáhla vámi stanovené limitní ceny.\n\
+ Prosím nastavte novou limitní cenu ve vaší nabídce
editOffer.setPrice=Nastavit cenu
editOffer.confirmEdit=Potvrdit: Upravit nabídku
-editOffer.publishOffer=Publikování vaší nabídky.
+editOffer.publishOffer=Zveřejnění vaší nabídky.
editOffer.failed=Úprava nabídky se nezdařila:\n{0}
editOffer.success=Vaše nabídka byla úspěšně upravena.
editOffer.invalidDeposit=Kauce kupujícího není v rámci omezení definovaných Haveno DAO a nemůže být dále upravována.
@@ -563,10 +619,21 @@ portfolio.tab.pendingTrades=Otevřené obchody
portfolio.tab.history=Historie
portfolio.tab.failed=Selhalo
portfolio.tab.editOpenOffer=Upravit nabídku
+portfolio.tab.duplicateOffer=Duplicitní nabídka
+portfolio.context.offerLikeThis=Vytvořit novou nabídku jako je tato...
+portfolio.context.notYourOffer=Duplikovat můžete pouze nabídky, u kterých jste byli tvůrcem.
portfolio.closedTrades.deviation.help=Procentuální odchylka od tržní ceny
-portfolio.pending.invalidTx=Došlo k problému s chybějící nebo neplatnou transakcí.\n\nProsím neposílejte fiat nebo crypto platby.\n\nOtevřete úkol pro podporu, některý z mediátorů vám pomůže.\n\nChybová zpráva: {0}
+portfolio.pending.invalidTx=Došlo k problému s chybějící nebo neplatnou transakcí.\n\n\
+ Prosím neposílejte fiat nebo crypto platby.\n\n\
+ Otevřete úkol pro podporu, některý z mediátorů vám pomůže.\n\n\
+ Chybová zpráva: {0}
+
+portfolio.pending.unconfirmedTooLong=Vkladové transakce obchodu {0} jsou stále nepotvrzené po {1} hodinách. \
+ Zkontrolujte transakce vkladu pomocí průzkumníka blockchainu; pokud jsou potvrzené, ale nezobrazují se jako \
+ potvrzené v Haveno, zkuste Haveno restartovat.\n\n\
+ Pokud problém přetrvává, kontaktujte podporu Haveno [HYPERLINK:https://matrix.to/#/#haveno:monero.social].
portfolio.pending.step1.waitForConf=Počkejte na potvrzení na blockchainu
portfolio.pending.step2_buyer.startPayment=Zahajte platbu
@@ -607,30 +674,40 @@ portfolio.pending.autoConf.state.FAILED=Služba se vrátila se selháním. Není
portfolio.pending.step1.info=Vkladová transakce byla zveřejněna.\n{0} před zahájením platby musíte počkat na alespoň jedno potvrzení na blockchainu.
portfolio.pending.step1.warn=Vkladová transakce není stále potvrzena. K tomu někdy dochází ve vzácných případech, kdy byl poplatek za financování jednoho obchodníka z externí peněženky příliš nízký.
-portfolio.pending.step1.openForDispute=Vkladová transakce není stále potvrzena. Můžete počkat déle nebo požádat o pomoc mediátora.
+portfolio.pending.step1.openForDispute=Vkladová transakce není stále potvrzena. \
+ Pokud jste čekali mnohem déle než 20 minut, můžete poádat o pomoc podporu Haveno.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2.confReached=Váš obchod má alespoň jedno potvrzení blockchainu.\n\n
-portfolio.pending.step2_buyer.refTextWarn=Důležité: když vyplňujete platební informace, nechte pole \"důvod platby\" prázdné. NEPOUŽÍVEJTE ID obchodu ani jiné poznámky jako např. 'monero', 'XMR' nebo 'Haveno'. Můžete se se svým obchodním partnerem domluvit pomocí chatu na identifikaci platby, která bude vyhovovat oběma.
+portfolio.pending.step2_buyer.refTextWarn=Důležité: když vyplňujete platební informace, nechte pole \"důvod platby\" \
+ prázdné. NEPOUŽÍVEJTE ID obchodu ani jiné poznámky jako např. 'monero', 'XMR' nebo 'Haveno'. \
+ Můžete se se svým obchodním partnerem domluvit pomocí chatu na \"důvod platby\", který bude vyhovovat oběma.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.fees=Pokud vaše banka účtuje poplatky za převod, musíte tyto poplatky uhradit vy.
# suppress inspection "TrailingSpacesInProperty"
+portfolio.pending.step2_buyer.fees.swift=Ujistěte se, že k odeslání platby SWIFT používáte model SHA (model sdílených poplatků). \
+ Více detailů [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT#Use_the_correct_fee_option].
+# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.crypto=Převeďte prosím z vaší externí {0} peněženky\n{1} prodejci XMR.\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.cash=Přejděte do banky a zaplaťte {0} prodejci XMR.\n\n
portfolio.pending.step2_buyer.cash.extra=DŮLEŽITÉ POŽADAVKY:\nPo provedení platby zapište na papírový doklad: NO REFUNDS - bez náhrady.\nPoté ji roztrhněte na 2 části, vytvořte fotografii a odešlete ji na e-mailovou adresu prodejce XMR.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.moneyGram=Zaplaťte prosím {0} prodejci XMR pomocí MoneyGram.\n\n
-portfolio.pending.step2_buyer.moneyGram.extra=DŮLEŽITÉ POŽADAVKY:\nPo provedení platby zašlete autorizační číslo a fotografii s potvrzením e-mailem prodejci XMR.\nPotvrzení musí jasně uvádět celé jméno, zemi, stát a částku prodávajícího. E-mail prodejce je: {0}.
+portfolio.pending.step2_buyer.moneyGram.extra=DŮLEŽITÉ POŽADAVKY:\nPo provedení platby zašlete autorizační číslo a fotografii s potvrzením e-mailem prodejci XMR.\n\
+Potvrzení musí jasně uvádět celé jméno, zemi, stát a částku prodávajícího. E-mail prodejce je: {0}.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.westernUnion=Zaplaťte prosím {0} prodejci XMR pomocí Western Union.\n\n
-portfolio.pending.step2_buyer.westernUnion.extra=DŮLEŽITÉ POŽADAVKY:\nPo provedení platby zašlete prodejci XMR e-mail s MTCN (sledovací číslo) a fotografii s potvrzením o přijetí.\nPotvrzení musí jasně uvádět celé jméno prodávajícího, město, zemi a částku. E-mail prodejce je: {0}.
+portfolio.pending.step2_buyer.westernUnion.extra=DŮLEŽITÉ POŽADAVKY:\nPo provedení platby zašlete prodejci XMR e-mail s MTCN (sledovací číslo) a fotografii s potvrzením o přijetí.\n\
+ Potvrzení musí jasně uvádět celé jméno prodávajícího, město, zemi a částku. E-mail prodejce je: {0}.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=Zašlete prosím {0} prodejci XMR pomocí \"US Postal Money Order\".\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Zašlete prosím {0} prodejci XMR v poštovní zásilce (\"Pay by Mail\"). Konkrétní instrukce naleznete v obchodní smlouvě. V případě pochybností se můžete zeptat protistrany pomocí obchodního chatu. Více informací naleznete na Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Zašlete prosím {0} prodejci XMR v poštovní zásilce (\"Hotovost poštou\"). \
+ Konkrétní instrukce naleznete v obchodní smlouvě. V případě pochybností se můžete zeptat protistrany pomocí obchodního chatu. \
+ Více informací naleznete na Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Prosím uhraďte {0} pomocí zvolené platební metody prodejci XMR. V dalším kroku naleznete detaily o účtu prodejce.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -642,21 +719,35 @@ portfolio.pending.step2_buyer.sellersAddress={0} adresa prodejce
portfolio.pending.step2_buyer.buyerAccount=Použijte svůj platební účet
portfolio.pending.step2_buyer.paymentSent=Platba zahájena
portfolio.pending.step2_buyer.warn=Platbu {0} jste ještě neprovedli!\nVezměte prosím na vědomí, že obchod musí být dokončen do {1}.
-portfolio.pending.step2_buyer.openForDispute=Neukončili jste platbu!\nMax. doba obchodu uplynula. Obraťte se na mediátora a požádejte o pomoc.
+portfolio.pending.step2_buyer.openForDispute=Neukončili jste platbu!\nMax. doba obchodu uplynula, ale platbu stále ještě můžete dokončit.\n\
+ Obraťte se na mediátora a požádejte o pomoc.
portfolio.pending.step2_buyer.paperReceipt.headline=Odeslali jste papírový doklad prodejci XMR?
-portfolio.pending.step2_buyer.paperReceipt.msg=Zapamatujte si:\nMusíte napsat na papírový doklad: NO REFUNDS - bez náhrady.\nPoté ho roztrhněte na 2 části, vytvořte fotografii a odešlete ji na e-mailovou adresu prodejce XMR.
+portfolio.pending.step2_buyer.paperReceipt.msg=Zapamatujte si:\n\
+ Musíte napsat na papírový doklad: NO REFUNDS - bez náhrady.\n\
+ Poté ho roztrhněte na 2 části, vytvořte fotografii a odešlete ji na e-mailovou adresu prodejce XMR.
portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=Odeslat autorizační číslo a účtenku
-portfolio.pending.step2_buyer.moneyGramMTCNInfo.msg=Musíte zaslat autorizační číslo a fotografii dokladu e-mailem prodejci XMR.\nDoklad musí jasně uvádět celé jméno prodávajícího, zemi, stát a částku. E-mail prodejce je: {0}.\n\nOdeslali jste autorizační číslo a smlouvu prodejci?
+portfolio.pending.step2_buyer.moneyGramMTCNInfo.msg=Musíte zaslat autorizační číslo a fotografii dokladu e-mailem prodejci XMR.\n\
+ Doklad musí jasně uvádět celé jméno prodávajícího, zemi, stát a částku. E-mail prodejce je: {0}.\n\n
+ Odeslali jste autorizační číslo a smlouvu prodejci?
portfolio.pending.step2_buyer.westernUnionMTCNInfo.headline=Pošlete MTCN a účtenku
-portfolio.pending.step2_buyer.westernUnionMTCNInfo.msg=Musíte odeslat MTCN (sledovací číslo) a fotografii dokladu e-mailem prodejci XMR.\nDoklad musí jasně uvádět celé jméno prodávajícího, město, zemi a částku. E-mail prodejce je: {0}.\n\nOdeslali jste MTCN a smlouvu prodejci?
+portfolio.pending.step2_buyer.westernUnionMTCNInfo.msg=Musíte odeslat MTCN (sledovací číslo) a fotografii dokladu e-mailem prodejci XMR.\n\
+ Doklad musí jasně uvádět celé jméno prodávajícího, město, zemi a částku. E-mail prodejce je: {0}.\n\n
+ Odeslali jste MTCN a smlouvu prodejci?
portfolio.pending.step2_buyer.halCashInfo.headline=Pošlete HalCash kód
-portfolio.pending.step2_buyer.halCashInfo.msg=Musíte odeslat jak textovou zprávu s kódem HalCash tak i obchodní ID ({0}) prodejci XMR.\nMobilní číslo prodejce je {1}.\n\nPoslali jste kód prodejci?
-portfolio.pending.step2_buyer.fasterPaymentsHolderNameInfo=Některé banky mohou ověřovat jméno příjemce. Účty Faster Payments vytvořené u starých klientů Haveno neposkytují jméno příjemce, proto si jej (v případě potřeby) vyžádejte pomocí obchodního chatu.
+portfolio.pending.step2_buyer.halCashInfo.msg=Musíte odeslat jak textovou zprávu s kódem HalCash tak i \
+ obchodní ID ({0}) prodejci XMR.\nMobilní číslo prodejce je {1}.\n\n
+ Poslali jste kód prodejci?
+portfolio.pending.step2_buyer.fasterPaymentsHolderNameInfo=Některé banky mohou ověřovat jméno příjemce. \
+ Účty Faster Payments vytvořené u starých klientů Haveno neposkytují jméno příjemce, \
+ proto si jej (v případě potřeby) vyžádejte pomocí obchodního chatu.
portfolio.pending.step2_buyer.confirmStart.headline=Potvrďte, že jste zahájili platbu
portfolio.pending.step2_buyer.confirmStart.msg=Zahájili jste platbu {0} vašemu obchodnímu partnerovi?
portfolio.pending.step2_buyer.confirmStart.yes=Ano, zahájil jsem platbu
portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=Neposkytli jste doklad o platbě
-portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=Nezadali jste ID transakce a klíč transakce.\n\nNeposkytnutím těchto údajů nemůže peer použít funkci automatického potvrzení k uvolnění XMR, jakmile bude přijat XMR.\nKromě toho Haveno vyžaduje, aby odesílatel transakce XMR mohl tyto informace poskytnout mediátorovi nebo rozhodci v případě sporu.\nDalší podrobnosti na wiki Haveno: [HYPERLINK:https://haveno.exchange/wiki/Trading_Monero#Auto-confirming_trades].
+portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=Nezadali jste ID transakce a klíč transakce.\n\n\
+ Neposkytnutím těchto údajů nemůže peer použít funkci automatického potvrzení k uvolnění XMR, jakmile bude přijat XMR.\n\
+ Kromě toho Haveno vyžaduje, aby odesílatel transakce XMR mohl tyto informace poskytnout mediátorovi nebo rozhodci v případě sporu.\n\
+ Další podrobnosti na wiki Haveno: [HYPERLINK:https://haveno.exchange/wiki/Trading_Monero#Auto-confirming_trades].
portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Vstup není 32 bajtová hexadecimální hodnota
portfolio.pending.step2_buyer.confirmStart.warningButton=Ignorovat a přesto pokračovat
portfolio.pending.step2_seller.waitPayment.headline=Počkejte na platbu
@@ -664,9 +755,20 @@ portfolio.pending.step2_seller.f2fInfo.headline=Kontaktní informace kupujícíh
portfolio.pending.step2_seller.waitPayment.msg=Vkladová transakce má alespoň jedno potvrzení na blockchainu.\nMusíte počkat, než kupující XMR zahájí platbu {0}.
portfolio.pending.step2_seller.warn=Kupující XMR dosud neprovedl platbu {0}.\nMusíte počkat, než zahájí platbu.\nPokud obchod nebyl dokončen dne {1}, bude rozhodce vyšetřovat.
portfolio.pending.step2_seller.openForDispute=Kupující XMR ještě nezačal s platbou!\nMax. povolené období pro obchod vypršelo.\nMůžete počkat déle a dát obchodnímu partnerovi více času nebo požádat o pomoc mediátora.
+disputeChat.chatWindowTitle=Okno chatu sporu pro obchod s ID ''{0}''
tradeChat.chatWindowTitle=Okno chatu pro obchod s ID ''{0}''
tradeChat.openChat=Otevřít chatovací okno
-tradeChat.rules=Můžete komunikovat se svým obchodním partnerem a vyřešit případné problémy s tímto obchodem.\nOdpovídat v chatu není povinné.\nPokud obchodník poruší některé z níže uvedených pravidel, zahajte spor a nahlaste jej mediátorovi nebo rozhodci.\n\nPravidla chatu:\n\t● Neposílejte žádné odkazy (riziko malwaru). Můžete odeslat ID transakce a jméno block exploreru.\n\t● Neposílejte seed slova, soukromé klíče, hesla nebo jiné citlivé informace!\n\t● Nepodporujte obchodování mimo Haveno (bez zabezpečení).\n\t● Nezapojujte se do žádných forem podvodů v oblasti sociálního inženýrství.\n\t● Pokud partner nereaguje a dává přednost nekomunikovat prostřednictvím chatu, respektujte jeho rozhodnutí.\n\t● Soustřeďte konverzaci pouze na obchod. Tento chat není náhradou messengeru.\n\t● Udržujte konverzaci přátelskou a uctivou.
+tradeChat.rules=Můžete komunikovat se svým obchodním partnerem a vyřešit případné problémy s tímto obchodem.\n\
+ Odpovídat v chatu není povinné.\n\
+ Pokud obchodník poruší některé z níže uvedených pravidel, zahajte spor a nahlaste jej mediátorovi nebo rozhodci.\n\n\
+ Pravidla chatu:\n\
+ \t● Neposílejte žádné odkazy (riziko malwaru). Můžete odeslat ID transakce a jméno block exploreru.\n\
+ \t● Neposílejte seed slova, soukromé klíče, hesla nebo jiné citlivé informace!\n\
+ \t● Nepodporujte obchodování mimo Haveno (bez zabezpečení).\n\
+ \t● Nezapojujte se do žádných forem podvodů v oblasti sociálního inženýrství.\n\
+ \t● Pokud partner nereaguje a dává přednost nekomunikovat prostřednictvím chatu, respektujte jeho rozhodnutí.\n\
+ \t● Soustřeďte konverzaci pouze na obchod. Tento chat není náhradou messengeru.\n\
+ \t● Udržujte konverzaci přátelskou a uctivou.
# suppress inspection "UnusedProperty"
message.state.UNDEFINED=Nedefinováno
@@ -686,25 +788,43 @@ portfolio.pending.step3_buyer.wait.info=Čekání na potvrzení prodejce XMR na
portfolio.pending.step3_buyer.wait.msgStateInfo.label=Stav zprávy o zahájení platby
portfolio.pending.step3_buyer.warn.part1a=na {0} blockchainu
portfolio.pending.step3_buyer.warn.part1b=u vašeho poskytovatele plateb (např. banky)
-portfolio.pending.step3_buyer.warn.part2=Prodejce XMR vaši platbu stále nepotvrdil. Zkontrolujte {0}, zda bylo odeslání platby úspěšné.
-portfolio.pending.step3_buyer.openForDispute=Prodejce XMR nepotvrdil vaši platbu! Max. období pro uskutečnění obchodu uplynulo. Můžete počkat déle a dát obchodnímu partnerovi více času nebo požádat o pomoc mediátora.
+portfolio.pending.step3_buyer.warn.part2=Prodejce XMR vaši platbu stále nepotvrdil. Zkontrolujte {0}, zda \
+ bylo odeslání platby úspěšné.
+portfolio.pending.step3_buyer.openForDispute=Prodejce XMR nepotvrdil vaši platbu! Max. období pro uskutečnění obchodu uplynulo. \
+ Můžete počkat déle a dát obchodnímu partnerovi více času nebo požádat o pomoc mediátora.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.part=Váš obchodní partner potvrdil, že zahájil platbu {0}.\n\n
-portfolio.pending.step3_seller.crypto.explorer=ve vašem oblíbeném {0} blockchain exploreru
+portfolio.pending.step3_seller.crypto.explorer=ve vašem oblíbeném {0} průzkumníku blockchainu
portfolio.pending.step3_seller.crypto.wallet=na vaší {0} peněžence
-portfolio.pending.step3_seller.crypto={0}Zkontrolujte prosím {1}, zda transakce na vaši přijímací adresu\n{2}\nmá již dostatečné potvrzení na blockchainu.\nČástka platby musí být {3}\n\nPo zavření vyskakovacího okna můžete zkopírovat a vložit svou {4} adresu z hlavní obrazovky.
+portfolio.pending.step3_seller.crypto={0}Zkontrolujte prosím {1}, zda transakce na vaši přijímací adresu\n\
+{2}\n\
+má již dostatečné potvrzení na blockchainu.\nČástka platby musí být {3}\n\n\
+Po zavření vyskakovacího okna můžete zkopírovat a vložit svou {4} adresu z hlavní obrazovky.
portfolio.pending.step3_seller.postal={0}Zkontrolujte, zda jste od kupujícího XMR obdrželi {1} přes \"US Postal Money Order\".
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.payByMail={0}Zkontrolujte, zda jste od kupujícího XMR obdrželi {1} přes \"Pay by Mail\".
+portfolio.pending.step3_seller.payByMail={0}Zkontrolujte, zda jste od kupujícího XMR obdrželi {1} přes \"Hotovost poštou\".
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step3_seller.bank=Váš obchodní partner potvrdil, že zahájil platbu {0}.\n\nPřejděte na webovou stránku online bankovnictví a zkontrolujte, zda jste od kupujícího XMR obdrželi {1}.
-portfolio.pending.step3_seller.cash=Vzhledem k tomu, že se platba provádí prostřednictvím hotovostního vkladu, musí kupující XMR napsat na papírový doklad \"NO REFUND\", roztrhat ho na 2 části a odeslat vám e-mailem fotografii.\n\nAbyste se vyhnuli riziku zpětného zúčtování, potvrďte pouze, zda jste obdrželi e-mail a zda si jste jisti, že papírový doklad je platný.\nPokud si nejste jisti, {0}
-portfolio.pending.step3_seller.moneyGram=Kupující vám musí zaslat e-mailem autorizační číslo a fotografii s potvrzením.\nPotvrzení musí jasně uvádět vaše celé jméno, zemi, stát a částku. Zkontrolujte si prosím váš e-mail, pokud jste obdrželi autorizační číslo.\n\nPo uzavření tohoto vyskakovacího okna se zobrazí jméno a adresa kupujícího XMR pro vyzvednutí peněz z MoneyGram.\n\nPotvrďte příjem až po úspěšném vyzvednutí peněz!
-portfolio.pending.step3_seller.westernUnion=Kupující vám musí zaslat MTCN (sledovací číslo) a fotografii s potvrzením e-mailem.\nPotvrzení musí jasně uvádět vaše celé jméno, město, zemi a částku. Zkontrolujte svůj e-mail, pokud jste obdrželi MTCN.\n\nPo zavření tohoto vyskakovacího okna uvidíte jméno a adresu kupujícího XMR pro vyzvednutí peněz z Western Union.\n\nPotvrďte příjem až po úspěšném vyzvednutí peněz!
-portfolio.pending.step3_seller.halCash=Kupující vám musí poslat kód HalCash jako textovou zprávu. Kromě toho obdržíte zprávu od HalCash s požadovanými informacemi pro výběr EUR z bankomatu podporujícího HalCash.\n\nPoté, co jste vyzvedli peníze z bankomatu, potvrďte zde přijetí platby!
-portfolio.pending.step3_seller.amazonGiftCard=Kupující vám poslal e-mailovou kartu Amazon eGift e-mailem nebo textovou zprávou na váš mobilní telefon. Uplatněte nyní kartu Amazon eGift ve svém účtu Amazon a po přijetí potvrďte potvrzení o platbě.
+portfolio.pending.step3_seller.bank=Váš obchodní partner potvrdil, že zahájil platbu {0}.\n\n\
+ Přejděte na webovou stránku online bankovnictví a zkontrolujte, zda jste od kupujícího XMR obdrželi {1}.
+portfolio.pending.step3_seller.cash=Vzhledem k tomu, že se platba provádí prostřednictvím hotovostního vkladu, musí kupující XMR napsat na papírový doklad \"NO REFUND\", roztrhat ho na 2 části a odeslat vám e-mailem fotografii.\n\n\
+Abyste se vyhnuli riziku zpětného zúčtování, potvrďte pouze, zda jste obdrželi e-mail a zda si jste jisti, že papírový doklad je platný.\n\
+Pokud si nejste jisti, {0}
+portfolio.pending.step3_seller.moneyGram=Kupující vám musí zaslat e-mailem autorizační číslo a fotografii s potvrzením.\n\
+ Potvrzení musí jasně uvádět vaše celé jméno, zemi, stát a částku. Zkontrolujte si prosím váš e-mail, pokud jste obdrželi autorizační číslo.\n\n\
+ Po uzavření tohoto vyskakovacího okna se zobrazí jméno a adresa kupujícího XMR pro vyzvednutí peněz z MoneyGram.\n\n\
+ Potvrďte příjem až po úspěšném vyzvednutí peněz!
+portfolio.pending.step3_seller.westernUnion=Kupující vám musí zaslat MTCN (sledovací číslo) a fotografii s potvrzením e-mailem.\n\
+ Potvrzení musí jasně uvádět vaše celé jméno, město, zemi a částku. Zkontrolujte svůj e-mail, pokud jste obdrželi MTCN.\n\n\
+ Po zavření tohoto vyskakovacího okna uvidíte jméno a adresu kupujícího XMR pro vyzvednutí peněz z Western Union.\n\n\
+ Potvrďte příjem až po úspěšném vyzvednutí peněz!
+portfolio.pending.step3_seller.halCash=Kupující vám musí poslat kód HalCash jako textovou zprávu. Kromě toho obdržíte zprávu od HalCash s požadovanými informacemi pro výběr EUR z bankomatu podporujícího HalCash.\n\n\
+ Poté, co jste vyzvedli peníze z bankomatu, potvrďte zde přijetí platby!
+portfolio.pending.step3_seller.amazonGiftCard=Kupující vám poslal e-mailovou kartu Amazon eGift e-mailem nebo textovou zprávou \
+ na váš mobilní telefon. Uplatněte nyní kartu Amazon eGift ve svém účtu Amazon \
+ a po přijetí potvrďte potvrzení o platbě.
-portfolio.pending.step3_seller.bankCheck=\n\nOvěřte také, zda se jméno odesílatele uvedené v obchodní smlouvě shoduje s jménem uvedeným na výpisu z účtu:\nJméno odesílatele podle obchodní smlouvy: {0}\n\nPokud jména nejsou úplně stejná, {1}
+portfolio.pending.step3_seller.bankCheck=\n\nOvěřte také, zda se jméno odesílatele uvedené v obchodní smlouvě shoduje s jménem uvedeným na výpisu z účtu:\nJméno odesílatele podle obchodní smlouvy: {0}\n\n\
+ Pokud jména nejsou úplně stejná, {1}
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.openDispute=nepotvrzujte příjem platby. Místo toho otevřete spor stisknutím \"alt + o\" nebo \"option + o\".\n\n
portfolio.pending.step3_seller.confirmPaymentReceipt=Potvrďte příjem platby
@@ -721,8 +841,10 @@ portfolio.pending.step3_seller.buyerStartedPayment.crypto=Podívejte se na potvr
portfolio.pending.step3_seller.buyerStartedPayment.traditional=Zkontrolujte na svém obchodním účtu (např. Bankovní účet) a potvrďte, kdy jste platbu obdrželi.
portfolio.pending.step3_seller.warn.part1a=na {0} blockchainu
portfolio.pending.step3_seller.warn.part1b=u vašeho poskytovatele plateb (např. banky)
-portfolio.pending.step3_seller.warn.part2=Stále jste nepotvrdili přijetí platby. Zkontrolujte {0}, zda jste obdrželi platbu.
-portfolio.pending.step3_seller.openForDispute=Nepotvrdili jste příjem platby!\nUplynulo max. období obchodu.\nPotvrďte nebo požádejte o pomoc mediátora.
+portfolio.pending.step3_seller.warn.part2=Stále jste nepotvrdili přijetí platby. \
+ Zkontrolujte {0}, zda jste obdrželi platbu.
+portfolio.pending.step3_seller.openForDispute=Nepotvrdili jste příjem platby!\n\
+ Uplynulo max. období obchodu.\nPotvrďte nebo požádejte o pomoc mediátora.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step3_seller.onPaymentReceived.part1=Obdrželi jste od svého obchodního partnera platbu v měně {0}?\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -731,23 +853,20 @@ portfolio.pending.step3_seller.onPaymentReceived.name=Ověřte také, zda se jm
portfolio.pending.step3_seller.onPaymentReceived.note=Vezměte prosím na vědomí, že jakmile potvrdíte příjem, dosud uzamčený obchodovaný XMR bude uvolněn kupujícímu a kauce bude vrácena.\n\n
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Potvrďte, že jste obdržel(a) platbu
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Ano, obdržel(a) jsem platbu
-portfolio.pending.step3_seller.onPaymentReceived.signer=DŮLEŽITÉ: Potvrzením přijetí platby ověřujete také účet protistrany a odpovídajícím způsobem jej podepisujete. Protože účet protistrany dosud nebyl podepsán, měli byste odložit potvrzení platby co nejdéle, abyste snížili riziko zpětného zúčtování.
+portfolio.pending.step3_seller.onPaymentReceived.signer=DŮLEŽITÉ: Potvrzením přijetí platby ověřujete také \
+ účet protistrany a odpovídajícím způsobem jej podepisujete. Protože účet protistrany dosud nebyl podepsán, \
+ měli byste odložit potvrzení platby co nejdéle, abyste snížili riziko zpětného zúčtování.
portfolio.pending.step5_buyer.groupTitle=Shrnutí dokončeného obchodu
+portfolio.pending.step5_buyer.groupTitle.mediated=Tento obchod byl vyřešen pomocí mediátora
+portfolio.pending.step5_buyer.groupTitle.arbitrated=Tento obchod byl vyřešen pomocí rozhodce
portfolio.pending.step5_buyer.tradeFee=Obchodní poplatek
portfolio.pending.step5_buyer.makersMiningFee=Poplatek za těžbu
portfolio.pending.step5_buyer.takersMiningFee=Celkové poplatky za těžbu
portfolio.pending.step5_buyer.refunded=Vrácená kauce
-portfolio.pending.step5_buyer.withdrawXMR=Vyberte své moneroy
-portfolio.pending.step5_buyer.amount=Částka k výběru
-portfolio.pending.step5_buyer.withdrawToAddress=Adresa výběru
-portfolio.pending.step5_buyer.moveToHavenoWallet=Uchovat prostředky v peněžence Haveno
-portfolio.pending.step5_buyer.withdrawExternal=Vybrat do externí peněženky
-portfolio.pending.step5_buyer.alreadyWithdrawn=Vaše finanční prostředky již byly vybrány.\nZkontrolujte historii transakcí.
-portfolio.pending.step5_buyer.confirmWithdrawal=Potvrďte žádost o výběr
portfolio.pending.step5_buyer.amountTooLow=Částka k převodu je nižší než transakční poplatek a min. možná hodnota tx (drobné).
-portfolio.pending.step5_buyer.withdrawalCompleted.headline=Výběr byl dokončen
-portfolio.pending.step5_buyer.withdrawalCompleted.msg=Vaše dokončené obchody jsou uloženy na \"Portfolio/Historie\".\nVšechny své transakce Monero si můžete prohlédnout v sekci \"Finance/Transakce\"
+portfolio.pending.step5_buyer.tradeCompleted.headline=Obchod dokončen
+portfolio.pending.step5_buyer.tradeCompleted.msg=Vaše dokončené obchody jsou uchovávány pod \"Portfolio/Historie\".\nVšechny své monero transakce najdete pod \"Prostředky/Transakce\"
portfolio.pending.step5_buyer.bought=Koupili jste
portfolio.pending.step5_buyer.paid=Zaplatili jste
@@ -767,25 +886,35 @@ portfolio.pending.tradePeriodInfo=Po prvním potvrzení na blockchainu začíná
portfolio.pending.tradePeriodWarning=Pokud je tato lhůta překročena, mohou oba obchodníci zahájit spor.
portfolio.pending.tradeNotCompleted=Obchod nebyl dokončen včas (do {0})
portfolio.pending.tradeProcess=Obchodní proces
+portfolio.pending.stillNotResolved=Pokud váš problém zůstává nevyřešen, můžete požádat o podporu v naší [Matrix místnosti](https://matrix.to/#/#haveno:monero.social).
+
portfolio.pending.openAgainDispute.msg=Pokud si nejste jisti, že zpráva pro mediátora nebo rozhodce dorazila (např. Pokud jste nedostali odpověď po 1 dni), neváhejte znovu zahájit spor s Cmd/Ctrl+o. Můžete také požádat o další pomoc na fóru Haveno na adrese [HYPERLINK:https://haveno.community].
portfolio.pending.openAgainDispute.button=Otevřete spor znovu
portfolio.pending.openSupportTicket.headline=Otevřít úkol pro podporu
-portfolio.pending.openSupportTicket.msg=Použijte tuto funkci pouze v naléhavých případech, pokud nevidíte tlačítko \"Otevřít podporu\" nebo \"Otevřít spor\".\n\nKdyž otevřete dotaz podporu, obchod bude přerušen a zpracován mediátorem nebo rozhodcem.
+portfolio.pending.openSupportTicket.msg=Použijte tuto funkci pouze v naléhavých případech, \
+ pokud nevidíte tlačítko \"Otevřít podporu\" nebo \"Otevřít spor\".\n\nKdyž otevřete úkol pro podporu, obchod bude přerušen \
+ a zpracován mediátorem nebo rozhodcem.
portfolio.pending.timeLockNotOver=Než budete moci zahájit rozhodčí spor, musíte počkat do ≈{0} ({1} dalších bloků).
-portfolio.pending.error.depositTxNull=Vkladová operace je nulová. Nemůžete otevřít spor bez platné vkladové transakce. Přejděte do \"Nastavení/Informace o síti\" a proveďte resynchronizaci SPV.\n\nPro další pomoc prosím kontaktujte podpůrný kanál v Haveno Keybase týmu.
-portfolio.pending.mediationResult.error.depositTxNull=Vkladová transakce je nulová. Obchod můžete přesunout do neúspěšných obchodů.
-portfolio.pending.mediationResult.error.delayedPayoutTxNull=Odložená výplatní transakce je nulová. Obchod můžete přesunout do neúspěšných obchodů.
-portfolio.pending.error.depositTxNotConfirmed=Vkladová transakce není potvrzena. Nemůžete zahájit rozhodčí spor s nepotvrzenou vkladovou transakcí. Počkejte prosím, až bude potvrzena, nebo přejděte do \"Nastavení/Informace o síti\" a proveďte resynchronizaci SPV.\n\nPro další pomoc prosím kontaktujte podpůrný kanál v Haveno Keybase týmu.
+portfolio.pending.error.depositTxNull=Vkladová operace je nulová. Nemůžete otevřít spor v případě \
+ neplatné vkladové transakce.\n\n\
+ Pro další pomoc kontaktujte podporu Haveno pomocí naší místnosti na Matrixu.
+portfolio.pending.mediationResult.error.depositTxNull=Vkladová transakce je nulová. Obchod můžete přesunout \
+ do neúspěšných obchodů.
+portfolio.pending.mediationResult.error.delayedPayoutTxNull=Zpožděný výplatní transakce je nulová. Obchod můžete přesunout \
+ do neúspěšných obchodů.
+portfolio.pending.error.depositTxNotConfirmed=Vkladová transakce není potvrzena. Nemůžete zahájit rozhodčí spor s nepotvrzenou vkladovou transakcí. \
+ Počkejte prosím, až bude potvrzena a dostupná.\n\n\
+ Pro další pomoc kontaktujte podporu Haveno pomocí naší místnosti na Matrixu.
portfolio.pending.support.headline.getHelp=Potřebujete pomoc?
-portfolio.pending.support.text.getHelp=Pokud máte nějaké problémy, můžete zkusit kontaktovat obchodníka v obchodním chatu nebo požádat komunitu Haveno na adrese https://haveno.community. Pokud váš problém stále není vyřešen, můžete požádat mediátora o další pomoc.
portfolio.pending.support.button.getHelp=Otevřít obchodní chat
portfolio.pending.support.headline.halfPeriodOver=Zkontrolujte platbu
portfolio.pending.support.headline.periodOver=Obchodní období skončilo
-portfolio.pending.mediationRequested=Mediace požádána
-portfolio.pending.refundRequested=Požadováno vrácení peněz
+portfolio.pending.arbitrationRequested=Požádáno o arbitráž
+portfolio.pending.mediationRequested=Požádáno o mediaci
+portfolio.pending.refundRequested=Požádáno o vrácení peněz
portfolio.pending.openSupport=Otevřít úkol pro podporu
portfolio.pending.supportTicketOpened=Úkol pro podporu otevřen
portfolio.pending.communicateWithArbitrator=Komunikujte prosím na obrazovce \"Podpora\" s rozhodcem.
@@ -801,24 +930,84 @@ portfolio.pending.mediationResult.info.peerAccepted=Váš obchodní partner při
portfolio.pending.mediationResult.button=Zobrazit navrhované řešení
portfolio.pending.mediationResult.popup.headline=Výsledek mediace obchodu s ID: {0}
portfolio.pending.mediationResult.popup.headline.peerAccepted=Váš obchodní partner přijal návrh mediátora na obchod {0}
-portfolio.pending.mediationResult.popup.info=Mediátor navrhl následující výplatu:\nObdržíte: {0}\nVáš obchodní partner obdrží: {1}\n\nTuto navrhovanou výplatu můžete přijmout nebo odmítnout.\n\nPřijetím podepíšete navrhovanou výplatní transakci. Pokud váš obchodní partner také přijme a podepíše, výplata bude dokončena a obchod bude uzavřen.\n\nPokud jeden nebo oba odmítnete návrh, budete muset počkat do {2} (blok {3}), abyste zahájili spor druhého kola s rozhodcem, který případ znovu prošetří a na základě svých zjištění provede výplatu.\n\nRozhodce může jako náhradu za svou práci účtovat malý poplatek (maximální poplatek: bezpečnostní záloha obchodníka). Oba obchodníci, kteří souhlasí s návrhem zprostředkovatele, jsou na dobré cestě - žádost o arbitráž je určena pro výjimečné okolnosti, například pokud je obchodník přesvědčen, že zprostředkovatel neučinil návrh na spravedlivou výplatu (nebo pokud druhý partner nereaguje).\n\nDalší podrobnosti o novém rozhodčím modelu: [HYPERLINK:https://docs.haveno.exchange/trading-rules.html#arbitration]
-portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=Přijali jste výplatu navrženou mediátorem, ale zdá se, že váš obchodní partner ji nepřijal.\n\nPo uplynutí doby uzamčení na {0} (blok {1}) můžete zahájit spor druhého kola s rozhodcem, který případ znovu prošetří a na základě jeho zjištění provede platbu.\n\nDalší podrobnosti o rozhodčím modelu najdete na adrese: [HYPERLINK:https://docs.haveno.exchange/trading-rules.html#arbitration]
+portfolio.pending.mediationResult.popup.info=Mediátor navrhl následující výplatu:\n\
+ Obdržíte: {0}\n\
+ Váš obchodní partner obdrží: {1}\n\n\
+ Tuto navrhovanou výplatu můžete přijmout nebo odmítnout.\n\n\
+ Přijetím podepíšete navrhovanou výplatní transakci. \
+ Pokud váš obchodní partner také přijme a podepíše, výplata bude dokončena a obchod bude uzavřen.\n\n\
+ Pokud jeden nebo oba odmítnete návrh, budete muset počkat do {2} (blok {3}), abyste zahájili spor \
+ druhého kola s rozhodcem, který případ znovu prošetří a na základě svých zjištění provede výplatu.\n\n\
+ Rozhodce může jako náhradu za svou práci účtovat malý poplatek (maximální poplatek: bezpečnostní záloha obchodníka). \
+ Oba obchodníci, kteří souhlasí s návrhem zprostředkovatele, jsou na dobré cestě - žádost o arbitráž je určena pro \
+ výjimečné okolnosti, například pokud je obchodník přesvědčen, že zprostředkovatel neučinil návrh na spravedlivou výplatu \
+ (nebo pokud druhý partner nereaguje).\n\n\
+ Další podrobnosti o novém rozhodčím modelu: [HYPERLINK:https://haveno.exchange/wiki/Dispute_resolution#Level_3:_Arbitration]
+portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=Přijali jste výplatu navrženou mediátorem, \
+ ale zdá se, že váš obchodní partner ji nepřijal.\n\n\
+ Po uplynutí doby uzamčení na {0} (blok {1}) můžete zahájit spor druhého kola s rozhodcem, který případ \
+ znovu prošetří a na základě jeho zjištění provede platbu.\n\n\
+ Další podrobnosti o rozhodčím modelu najdete na adrese:\
+ [https://haveno.exchange/wiki/Dispute_resolution#Level_3:_Arbitration]
portfolio.pending.mediationResult.popup.openArbitration=Odmítnout a požádat o arbitráž
portfolio.pending.mediationResult.popup.alreadyAccepted=Už jste přijali
-portfolio.pending.failedTrade.taker.missingTakerFeeTx=Chybí poplatek příjemce transakce.\n\nBez tohoto tx nelze obchod dokončit. Nebyly uzamčeny žádné prostředky a nebyl zaplacen žádný obchodní poplatek. Tento obchod můžete přesunout do neúspěšných obchodů.
-portfolio.pending.failedTrade.maker.missingTakerFeeTx=Chybí poplatek příjemce transakce.\n\nBez tohoto tx nelze obchod dokončit. Nebyly uzamčeny žádné prostředky. Vaše nabídka je stále k dispozici dalším obchodníkům, takže jste neztratili poplatek za vytvoření. Tento obchod můžete přesunout do neúspěšných obchodů.
-portfolio.pending.failedTrade.missingDepositTx=Vkladová transakce (transakce 2-of-2 multisig) chybí.\n\nBez tohoto tx nelze obchod dokončit. Nebyly uzamčeny žádné prostředky, ale byl zaplacen váš obchodní poplatek. Zde můžete požádat o vrácení obchodního poplatku: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nKlidně můžete přesunout tento obchod do neúspěšných obchodů.
-portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=Odložená výplatní transakce chybí, ale prostředky byly uzamčeny v vkladové transakci.\n\nNezasílejte prosím fiat nebo crypto platbu prodejci XMR, protože bez odložené platby tx nelze zahájit arbitráž. Místo toho otevřete mediační úkol pomocí Cmd/Ctrl+o. Mediátor by měl navrhnout, aby oba partneři dostali zpět celou částku svých bezpečnostních vkladů (přičemž prodejce také obdrží plnou částku obchodu). Tímto způsobem nehrozí žádné bezpečnostní riziko a jsou ztraceny pouze obchodní poplatky.\n\nO vrácení ztracených obchodních poplatků můžete požádat zde: [HYPERLINK:https://github.com/bisq-network/support/issues]
-portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=Odložená výplatní transakce chybí, ale prostředky byly v depozitní transakci uzamčeny.\n\nPokud kupujícímu chybí také odložená výplatní transakce, bude poučen, aby platbu NEPOSLAL a místo toho otevřel mediační úkol. Měli byste také otevřít mediační úkol pomocí Cmd/Ctrl+o.\n\nPokud kupující ještě neposlal platbu, měl by zprostředkovatel navrhnout, aby oba partneři dostali zpět celou částku svých bezpečnostních vkladů (přičemž prodejce také obdrží plnou částku obchodu). Jinak by částka obchodu měla jít kupujícímu.\n\nO vrácení ztracených obchodních poplatků můžete požádat zde: [HYPERLINK:https://github.com/bisq-network/support/issues]
-portfolio.pending.failedTrade.errorMsgSet=Během provádění obchodního protokolu došlo k chybě.\n\nChyba: {0}\n\nJe možné, že tato chyba není kritická a obchod lze dokončit normálně. Pokud si nejste jisti, otevřete si mediační úkol a získejte radu od mediátorů Haveno.\n\nPokud byla chyba kritická a obchod nelze dokončit, možná jste ztratili obchodní poplatek. O vrácení ztracených obchodních poplatků požádejte zde: [HYPERLINK:https://github.com/bisq-network/support/issues]
-portfolio.pending.failedTrade.missingContract=Obchodní kontrakt není stanoven.\n\nObchod nelze dokončit a možná jste ztratili poplatek za obchodování. Pokud ano, můžete požádat o vrácení ztracených obchodních poplatků zde: [HYPERLINK:https://github.com/bisq-network/support/issues]
+portfolio.pending.failedTrade.taker.missingTakerFeeTx=Chybí poplatek příjemce transakce.\n\n\
+ Bez tohoto tx nelze obchod dokončit. Nebyly uzamčeny žádné prostředky a nebyl zaplacen žádný obchodní poplatek. \
+ Tento obchod můžete přesunout do neúspěšných obchodů.
+portfolio.pending.failedTrade.maker.missingTakerFeeTx=Chybí poplatek příjemce transakce.\n\n\
+ Bez tohoto tx nelze obchod dokončit. Nebyly uzamčeny žádné prostředky. Vaše nabídka je \
+ stále k dispozici dalším obchodníkům, takže jste neztratili poplatek za vytvoření. \
+ Tento obchod můžete přesunout do neúspěšných obchodů.
+portfolio.pending.failedTrade.missingDepositTx=Vkladová transakce (transakce 2-of-2 multisig) chybí.\n\n\
+ Bez této tx nelze obchod dokončit. Nebyly uzamčeny žádné prostředky, ale byl zaplacen váš obchodní poplatek. \
+ Zde můžete požádat o vrácení obchodního poplatku: \
+ [HYPERLINK:https://github.com/bisq-network/support/issues]\n\n\
+ Klidně můžete přesunout tento obchod do neúspěšných obchodů.
+portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=Zpožděná výplatní transakce chybí,
+ ale prostředky byly uzamčeny v vkladové transakci.\n\n\
+ Nezasílejte prosím fiat nebo crypto platbu prodejci XMR, protože bez odložené platby tx nelze zahájit arbitráž. \
+ Místo toho otevřete mediační úkol pomocí Cmd/Ctrl+o. \
+ Mediátor by měl navrhnout, aby oba partneři dostali zpět celou částku svých bezpečnostních vkladů \
+ (přičemž prodejce také obdrží plnou částku obchodu). \
+ Tímto způsobem nehrozí žádné bezpečnostní riziko a jsou ztraceny pouze obchodní poplatky.\n\n\
+ O vrácení ztracených obchodních poplatků můžete požádat zde: \
+ [HYPERLINK:https://github.com/bisq-network/support/issues]
+portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=Zpožděná výplatní transakce chybí, \
+ ale prostředky byly v depozitní transakci uzamčeny.\n\n\
+ Pokud kupujícímu chybí také odložená výplatní transakce, bude poučen, aby platbu NEPOSLAL a místo toho otevřel \
+ mediační úkol. Měli byste také otevřít mediační úkol pomocí Cmd/Ctrl+o.\n\n\
+ Pokud kupující ještě neposlal platbu, měl by mediátor navrhnout, aby oba partneři dostali zpět celou částku \
+ svých bezpečnostních vkladů (přičemž prodejce také obdrží plnou částku obchodu). \
+ Jinak by částka obchodu měla jít kupujícímu.\n\n\
+ O vrácení ztracených obchodních poplatků můžete požádat zde: \
+ [HYPERLINK:https://github.com/bisq-network/support/issues]
+portfolio.pending.failedTrade.errorMsgSet=Během provádění obchodního protokolu došlo k chybě.\n\n
+ Chyba: {0}\n\n\
+ Je možné, že tato chyba není kritická a obchod lze dokončit normálně. Pokud si nejste jisti, otevřete si mediační úkol \
+ a získejte radu od mediátorů Haveno.\n\n\
+ Pokud byla chyba kritická a obchod nelze dokončit, možná jste ztratili obchodní poplatek. \
+ O vrácení ztracených obchodních poplatků požádejte zde: \
+ [HYPERLINK:https://github.com/bisq-network/support/issues]
+portfolio.pending.failedTrade.missingContract=Obchodní kontrakt není stanoven.\n\n\
+Obchod nelze dokončit a možná jste ztratili poplatek \
+ za obchodování. Pokud ano, můžete požádat o vrácení ztracených obchodních poplatků zde: \
+ [HYPERLINK:https://github.com/bisq-network/support/issues]
portfolio.pending.failedTrade.info.popup=Obchodní protokol narazil na některé problémy.\n\n{0}
-portfolio.pending.failedTrade.txChainInvalid.moveToFailed=Obchodní protokol narazil na vážný problém.\n\n{0}\n\nChcete obchod přesunout do neúspěšných obchodů?\n\nZ obrazovky neúspěšných obchodů nemůžete otevřít mediaci nebo arbitráž, ale můžete kdykoli přesunout neúspěšný obchod zpět na obrazovku otevřených obchodů.
-portfolio.pending.failedTrade.txChainValid.moveToFailed=Obchodní protokol narazil na některé problémy.\n\n{0}\n\nObchodní transakce byly zveřejněny a finanční prostředky jsou uzamčeny. Přesuňte obchod do neúspěšných obchodů, pouze pokud jste si opravdu jisti. Může to bránit možnostem řešení problému.\n\nChcete obchod přesunout do neúspěšných obchodů?\n\nZ obrazovky neúspěšných obchodů nemůžete otevřít mediaci nebo arbitráž, ale můžete kdykoli přesunout neúspěšný obchod zpět na obrazovku otevřených obchodů.
+portfolio.pending.failedTrade.txChainInvalid.moveToFailed=Obchodní protokol narazil na vážný problém.\n\n{0}\n\n\
+ Chcete obchod přesunout do neúspěšných obchodů?\n\n\
+Z obrazovky neúspěšných obchodů nemůžete otevřít mediaci nebo arbitráž, ale můžete kdykoli přesunout neúspěšný obchod zpět \
+ na obrazovku otevřených obchodů.
+portfolio.pending.failedTrade.txChainValid.moveToFailed=Obchodní protokol narazil na některé problémy.\n\n{0}\n\n\
+ Obchodní transakce byly zveřejněny a finanční prostředky jsou uzamčeny. Přesuňte obchod do neúspěšných obchodů, \
+ pouze pokud jste si opravdu jisti. Může to bránit možnostem řešení problému.\n\n\
+ Chcete obchod přesunout do neúspěšných obchodů?\n\n\
+ Z obrazovky neúspěšných obchodů nemůžete otevřít mediaci nebo arbitráž, ale můžete kdykoli přesunout neúspěšný obchod \
+ zpět na obrazovku otevřených obchodů.
portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=Přesuňte obchod do neúspěšných obchodů
portfolio.pending.failedTrade.warningIcon.tooltip=Kliknutím otevřete podrobnosti o problémech tohoto obchodu
portfolio.failed.revertToPending.popup=Chcete přesunout tento obchod do otevřených obchodů?
+portfolio.failed.revertToPending.failed=Selhal přesun tohoto obchodu do otevřených obchodů.
portfolio.failed.revertToPending=Přesunout obchod do otevřených obchodů
portfolio.closed.completed=Dokončeno
@@ -826,11 +1015,18 @@ portfolio.closed.ticketClosed=Rozhodnuto
portfolio.closed.mediationTicketClosed=Mediováno
portfolio.closed.canceled=Zrušeno
portfolio.failed.Failed=Selhalo
-portfolio.failed.unfail=Před pokračováním se ujistěte, že máte zálohu vašeho datového adresáře!\nChcete tento obchod přesunout zpět do otevřených obchodů?\nJe to způsob, jak odemknout finanční prostředky uvízlé v neúspěšném obchodu.
-portfolio.failed.cantUnfail=Tento obchod nelze v tuto chvíli přesunout zpět do otevřených obchodů.\nZkuste to znovu po dokončení obchodu (obchodů) {0}
+portfolio.failed.unfail=Před pokračováním se ujistěte, že máte zálohu vašeho datového adresáře!\n\
+ Chcete tento obchod přesunout zpět do otevřených obchodů?\n\
+ Je to způsob, jak odemknout finanční prostředky uvízlé v neúspěšném obchodu.
+portfolio.failed.cantUnfail=Tento obchod nelze v tuto chvíli přesunout zpět do otevřených obchodů.\n\
+ Zkuste to znovu po dokončení obchodu (obchodů) {0}
portfolio.failed.depositTxNull=Obchod nelze změnit zpět na otevřený obchod. Transakce s vkladem je neplatná.
-portfolio.failed.delayedPayoutTxNull=Obchod nelze změnit zpět na otevřený obchod. Odložená výplatní transakce je nulová.
-
+portfolio.failed.delayedPayoutTxNull=Obchod nelze změnit zpět na otevřený obchod. Zpožděná výplatní transakce je nulová.
+portfolio.failed.penalty.msg=Toto strhne {0}/{1} poplatek penále {2} a vrátí zbytek obchodovaných financí do jejich peněženky. Jste si jisti, že chcete odeslat?\n\n\
+ Jiné info:\n\
+ Transakční poplatek: {3}\n\
+ Rezervní hash Tx: {4}
+portfolio.failed.error.msg=Záznam obchodu neexistuje.
####################################################################
# Funds
@@ -844,9 +1040,12 @@ funds.tab.transactions=Transakce
funds.deposit.unused=Nepoužito
funds.deposit.usedInTx=Používá se v {0} transakcích
+funds.deposit.baseAddress=Základní adresa
+funds.deposit.offerFunding=Rezervováno pro financování nabídky ({0})
+funds.deposit.tradePayout=Rezervováno pro výplatu obchodu ({0})
funds.deposit.fundHavenoWallet=Financovat Haveno peněženku
funds.deposit.noAddresses=Dosud nebyly vygenerovány žádné adresy pro vklad
-funds.deposit.fundWallet=Financujte svou peněženku
+funds.deposit.fundWallet=Financovat peněženku
funds.deposit.withdrawFromWallet=Pošlete peníze z peněženky
funds.deposit.amount=Částka v XMR (volitelná)
funds.deposit.generateAddress=Vygenerujte novou adresu
@@ -858,11 +1057,13 @@ funds.withdrawal.inputs=Volba vstupů
funds.withdrawal.useAllInputs=Použijte všechny dostupné vstupy
funds.withdrawal.useCustomInputs=Použijte vlastní vstupy
funds.withdrawal.receiverAmount=Částka pro příjemce
+funds.withdrawal.sendMax=Poslat max. dostupné
funds.withdrawal.senderAmount=Náklad pro odesílatele
funds.withdrawal.feeExcluded=Částka nezahrnuje poplatek za těžbu
funds.withdrawal.feeIncluded=Částka zahrnuje poplatek za těžbu
funds.withdrawal.fromLabel=Výběr z adresy
funds.withdrawal.toLabel=Adresa příjemce
+funds.withdrawal.maximum=MAX
funds.withdrawal.memoLabel=Poznámka k výběru
funds.withdrawal.memo=Volitelně vyplňte poznámku
funds.withdrawal.withdrawButton=Odeslat výběr
@@ -875,7 +1076,14 @@ funds.withdrawal.selectAddress=Vyberte zdrojovou adresu z tabulky
funds.withdrawal.setAmount=Nastavte částku k výběru
funds.withdrawal.fillDestAddress=Vyplňte svou cílovou adresu
funds.withdrawal.warn.noSourceAddressSelected=Ve výše uvedené tabulce musíte vybrat zdrojovou adresu.
-funds.withdrawal.warn.amountExceeds=Na vybrané adrese nemáte dostatek prostředků.\nZvažte výběr více adres ve výše uvedené tabulce nebo změňte přepínač poplatků tak, aby zahrnoval poplatek za těžbu.
+funds.withdrawal.warn.amountExceeds=Na vybrané adrese nemáte dostatek prostředků.\n\
+ Zvažte výběr více adres ve výše uvedené tabulce nebo změňte přepínač poplatků tak, aby zahrnoval poplatek za těžbu.
+funds.withdrawal.warn.amountMissing=Zadejte částku k vybrání
+funds.withdrawal.txFee=Poplatek transakce výběru (satoshi/vbyte)
+funds.withdrawal.useCustomFeeValueInfo=Zadejte vlastní hodnotu poplatku transakce
+funds.withdrawal.useCustomFeeValue=Použít vlastní hodnotu
+funds.withdrawal.txFeeMin=Poplatek transakce musí být alespoň {0} satoshi/vbyte
+funds.withdrawal.txFeeTooLarge=Vámi zadaná hodnota je nad rozumnou hodnotou (>5000 satoshi/vbyte). Poplatek transakce je obvykle v rozmezí 50-400 satoshi/vbyte.
funds.reserved.noFunds=V otevřených nabídkách nejsou rezervovány žádné finanční prostředky
funds.reserved.reserved=Rezervováno v místní peněžence pro nabídku s ID: {0}
@@ -905,18 +1113,36 @@ funds.tx.revert=Vrátit
funds.tx.txSent=Transakce byla úspěšně odeslána na novou adresu v lokální peněžence Haveno.
funds.tx.direction.self=Posláno sobě
funds.tx.dustAttackTx=Přijaté drobné
-funds.tx.dustAttackTx.popup=Tato transakce odesílá do vaší peněženky velmi malou částku XMR a může se jednat o pokus společností provádějících analýzu blockchainu o špehování vaší peněženky.\n\nPoužijete-li tento transakční výstup ve výdajové transakci, zjistí, že jste pravděpodobně také vlastníkem jiné adresy (sloučení mincí).\n\nKvůli ochraně vašeho soukromí ignoruje peněženka Haveno takové drobné výstupy pro účely utrácení a na obrazovce zůstatku. Můžete nastavit hodnotu "drobnosti", kdy je výstup považován za drobné, v nastavení.
+funds.tx.dustAttackTx.popup=Tato transakce odesílá do vaší peněženky velmi malou částku XMR a může se jednat o pokus \
+ společností provádějících analýzu blockchainu o špehování vaší peněženky.\n\n\
+ Použijete-li tento transakční výstup ve výdajové transakci, zjistí, že jste pravděpodobně také vlastníkem \
+ jiné adresy (sloučení mincí).\n\n\
+ Kvůli ochraně vašeho soukromí ignoruje peněženka Haveno takové drobné výstupy pro účely utrácení a na obrazovce zůstatku. \
+ V nastavení můžete nastavit prahovou hodnotu, při které je výstup považován za drobné(dust).
####################################################################
# Support
####################################################################
support.tab.mediation.support=Mediace
+support.tab.refund.support=Vrácení peněz
support.tab.arbitration.support=Arbitráž
support.tab.legacyArbitration.support=Starší arbitráž
support.tab.ArbitratorsSupportTickets=Úkoly pro {0}
support.filter=Hledat spory
support.filter.prompt=Zadejte ID obchodu, datum, onion adresu nebo údaje o účtu
+support.tab.SignedOffers=Podepsané nabídky
+support.prompt.signedOffer.penalty.msg=Tím se tvůrci účtuje sankční poplatek a zbývající prostředky z obchodu se vrátí do jeho peněženky. Jste si jisti, že chcete odeslat?\n\n\
+ ID nabídky: {0}\n\
+ Poplatek penále tvůrce: {1}\n\
+ Rezervní poplatek těžby Tx: {2}\n\
+ Rezervní hash Tx: {3}\n\
+ Rezervní klíčové obrázky Tx: {4}\n\
+
+support.contextmenu.penalize.msg=Penalizovat {0} zveřejněním tx rezervy
+support.prompt.signedOffer.error.msg=Podepsaný záznam nabídky neexistuje; kontaktujte správce.
+support.info.submitTxHex=Rezervní transakce byla zveřejněna s tímto výsledkem:\n
+support.result.success=Transakce hex byla úspěšně zadána.
support.sigCheck.button=Ověřit podpis
support.sigCheck.popup.info=Vložte souhrnnou zprávu procesu zprostředkování. S tímto nástrojem může každý uživatel zkontrolovat, zda se podpis zprostředkovatele shoduje se souhrnnou zprávou.
@@ -929,6 +1155,7 @@ support.sigCheck.popup.failed=Ověření podpisu selhalo
support.sigCheck.popup.invalidFormat=Zpráva nemá očekávaný formát. Zkopírujte a vložte souhrnnou zprávu ze sporu.
support.reOpenByTrader.prompt=Opravdu chcete spor znovu otevřít?
+support.reOpenByTrader.failed=Opětovné otevření sporu selhalo.
support.reOpenButton.label=Znovu otevřít
support.sendNotificationButton.label=Soukromé oznámení
support.reportButton.label=Zpráva
@@ -938,7 +1165,9 @@ support.sendingMessage=Odesílání zprávy...
support.receiverNotOnline=Příjemce není online. Zpráva je uložena v jejich schránce.
support.sendMessageError=Odeslání zprávy se nezdařilo. Chyba: {0}
support.receiverNotKnown=Příjemce není znám
-support.wrongVersion=Nabídka v tomto sporu byla vytvořena se starší verzí Haveno.\nTento spor nemůžete ukončit s touto verzí aplikace.\n\nPoužijte prosím starší verzi s verzí protokolu {0}
+support.wrongVersion=Nabídka v tomto sporu byla vytvořena se starší verzí Haveno.\n\
+Tento spor nemůžete ukončit s touto verzí aplikace.\n\n\
+Použijte prosím starší verzi s verzí protokolu {0}
support.openFile=Otevřete soubor, který chcete připojit (maximální velikost souboru: {0} kb)
support.attachmentTooLarge=Celková velikost vašich příloh je {0} kb a překračuje maximální povolenou velikost zprávy {1} kB.
support.maxSize=Max. povolená velikost souboru je {0} kB.
@@ -953,24 +1182,71 @@ support.closeTicket=Zavřít úkol
support.attachments=Přílohy:
support.savedInMailbox=Zpráva uložena ve schránce příjemce
support.arrived=Zpráva dorazila k příjemci
+support.transient=Zpráva je na cestě k příjemci
support.acknowledged=Přijetí zprávy potvrzeno příjemcem
support.error=Příjemce nemohl zpracovat zprávu. Chyba: {0}
+support.errorTimeout=vypršení platnosti. Zkuste zprávu odeslat znovu.
support.buyerAddress=Adresa kupujícího XMR
support.sellerAddress=Adresa prodejce XMR
support.role=Role
support.agent=Agent podpory
support.state=Stav
support.chat=Chat
+support.requested=Požádáno
support.closed=Zavřeno
-support.open=Otevřené
+support.open=Otevřeno
+support.moreButton=VÍCE...
+support.sendLogFiles=Odeslat soubory logů
+support.uploadTraderChat=Nahrát obchodní chat
support.process=Rozhodnout
support.buyerMaker=Kupující XMR/Tvůrce
support.sellerMaker=Prodejce XMR/Tvůrce
support.buyerTaker=Kupující XMR/Příjemce
support.sellerTaker=Prodávající XMR/Příjemce
+support.sendLogs.title=Odeslat logy
+support.sendLogs.backgroundInfo=Pokud se vyskytne chyba, rozhodčí a pracovníci podpory si často vyžádají kopie souborů log, aby mohli problém prozkoumat.\n\n\
+ Po stisku 'Odeslat' dojde ke kompresi a odeslání logů přímo rozhodci.
+support.sendLogs.step1=Vytvořit archiv Zip s log soubory
+support.sendLogs.step2=Požadavek připojení k rozhodci
+support.sendLogs.step3=Nahrát archivovaná data logů
+support.sendLogs.send=Odeslat
+support.sendLogs.cancel=Zrušit
+support.sendLogs.init=Zavádění
+support.sendLogs.retry=Opakování odeslání
+support.sendLogs.stopped=Přenos zastaven
+support.sendLogs.progress=Průběh přenosu: %.0f%%
+support.sendLogs.finished=Přenos dokončen!
+support.sendLogs.command=Stiskněte 'Odeslat' pro opakování, nebo 'Zastavit' pro zrušení
+support.txKeyImages=Klíčové obrázky
+support.txHash=Hash transakce
+support.txHex=Hex transakce
+support.signature=Podpis
+support.maker.penalty.fee=Poplatek penále tvůrce
+support.tx.miner.fee=Poplatek těžby
-support.backgroundInfo=Haveno není společnost, takže spory řeší jinak.\n\nObchodníci mohou v rámci aplikace komunikovat prostřednictvím zabezpečeného chatu na obrazovce otevřených obchodů a pokusit se o řešení sporů sami. Pokud to nestačí, arbitr rozhodne o situaci a určí výplatu obchodních prostředků.
-support.initialInfo=Do níže uvedeného textového pole zadejte popis problému. Přidejte co nejvíce informací k urychlení doby řešení sporu.\n\nZde je kontrolní seznam informací, které byste měli poskytnout:\n\t● Pokud kupujete XMR: Provedli jste převod Fiat nebo Cryptou? Pokud ano, klikli jste v aplikaci na tlačítko „Platba zahájena“?\n\t● Pokud jste prodejcem XMR: Obdrželi jste platbu Fiat nebo Cryptou? Pokud ano, klikli jste v aplikaci na tlačítko „Platba přijata“?\n\t● Kterou verzi Haveno používáte?\n\t● Jaký operační systém používáte?\n\t● Pokud se vyskytl problém s neúspěšnými transakcemi, zvažte přechod na nový datový adresář.\n\t Někdy dojde k poškození datového adresáře a vede to k podivným chybám.\n\t Viz: https://docs.haveno.exchange/backup-recovery.html#switch-to-a-new-data-directory\n\nSeznamte se prosím se základními pravidly procesu sporu:\n\t● Musíte odpovědět na požadavky {0} do 2 dnů.\n\t● Mediátoři reagují do 2 dnů. Rozhodci odpoví do 5 pracovních dnů.\n\t● Maximální doba sporu je 14 dní.\n\t● Musíte spolupracovat s {1} a poskytnout informace, které požaduje, aby jste vyřešili váš případ.\n\t● Při prvním spuštění aplikace jste přijali pravidla uvedena v dokumentu sporu v uživatelské smlouvě.\n\nDalší informace o procesu sporu naleznete na: {2}
+support.backgroundInfo=Haveno není společnost, takže spory řeší jinak.\n\n\
+Obchodníci mohou v rámci aplikace komunikovat prostřednictvím zabezpečeného chatu na obrazovce otevřených obchodů \
+ a sami se pokusit o řešení sporů. Pokud to nestačí, arbitr rozhodne o situaci \
+ a určí výplatu obchodních prostředků.
+support.initialInfo=Do níže uvedeného textového pole zadejte popis problému. \
+ Přidejte co nejvíce informací k urychlení doby řešení sporu.\n\n\
+ Zde je kontrolní seznam informací, které byste měli poskytnout:\n\
+ \● Pokud kupujete XMR: Provedli jste převod Fiat nebo Cryptou? Pokud ano, klikli jste v aplikaci na tlačítko 'Platba zahájena'?\n\
+ \t● Pokud jste prodejcem XMR: Obdrželi jste platbu fiat nebo kryptoměny? Pokud ano, \
+klikli jste v aplikaci \
+ na tlačítko 'Platba přijata'?\n\
+ \t● Kterou verzi Haveno používáte?\n\
+ \t● Jaký operační systém používáte?\n\
+ \t● Pokud se vyskytl problém s neúspěšnými transakcemi, zvažte přechod na nový datový adresář.\n\
+ \t Někdy dojde k poškození datového adresáře a vede to k podivným chybám.\n\
+ \t Viz: https://docs.haveno.exchange/backup-recovery.html#switch-to-a-new-data-directory\n\n\
+ Seznamte se prosím se základními pravidly procesu sporu:\n\
+\t● Musíte odpovědět na požadavky {0} do 2 dnů.\n\
+\t● Mediátoři reagují do 2 dnů. Rozhodci odpoví do 5 pracovních dnů.\n\
+\t● Maximální doba sporu je 14 dní.\n\
+\t● Musíte spolupracovat s {1} a poskytnout informace, které požaduje, aby jste vyřešili váš případ.\n\
+\t● Při prvním spuštění aplikace jste přijali pravidla uvedena v dokumentu sporu v uživatelské smlouvě.\n\n\
+Další informace o procesu sporu naleznete na: {2}
support.systemMsg=Systémová zpráva: {0}
support.youOpenedTicket=Otevřeli jste žádost o podporu.\n\n{0}\n\nVerze Haveno: {1}
support.youOpenedDispute=Otevřeli jste žádost o spor.\n\n{0}\n\nVerze Haveno: {1}
@@ -979,8 +1255,15 @@ support.peerOpenedTicket=Váš obchodní partner požádal o podporu kvůli tech
support.peerOpenedDispute=Váš obchodní partner požádal o spor.\n\n{0}\n\nHaveno verze: {1}
support.peerOpenedDisputeForMediation=Váš obchodní partner požádal o mediaci.\n\n{0}\n\nHaveno verze: {1}
support.mediatorsDisputeSummary=Systémová zpráva: Shrnutí sporu mediátora:\n{0}
+support.mediatorReceivedLogs=Systémová zpráva: Mediátor obdržel logy: {0}
support.mediatorsAddress=Adresa uzlu mediátora: {0}
-support.warning.disputesWithInvalidDonationAddress=Odložená výplatní transakce použila neplatnou adresu příjemce. Neshoduje se s žádnou z hodnot parametrů DAO pro platné dárcovské adresy.\n\nMůže to být pokus o podvod. Informujte prosím vývojáře o tomto incidentu a neuzavírejte tento případ, dokud nebude situace vyřešena!\n\nAdresa použitá ve sporu: {0}\n\nVšechny parametry pro darovací adresy DAO: {1}\n\nObchodní ID: {2} {3}
+support.warning.disputesWithInvalidDonationAddress=Odložená výplatní transakce použila neplatnou adresu příjemce. \
+ Neshoduje se s žádnou z hodnot parametrů DAO pro platné dárcovské adresy.\n\nMůže to být pokus o podvod. \
+ Informujte prosím vývojáře o tomto incidentu a neuzavírejte tento případ, dokud nebude situace vyřešena!\n\n\
+ Adresa použitá ve sporu: {0}\n\n\
+ Všechny parametry pro darovací adresy DAO: {1}\n\n\
+ Obchodní ID: {2}\
+ {3}
support.warning.disputesWithInvalidDonationAddress.mediator=\n\nStále chcete spor uzavřít?
support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\nVýplatu nesmíte provést.
support.warning.traderCloseOwnDisputeWarning=Obchodníci mohou sami zrušit úkol pro podporu pouze pokud došlo k výplatě prostředků.
@@ -994,7 +1277,7 @@ settings.tab.network=Informace o síti
settings.tab.about=O Haveno
setting.preferences.general=Základní nastavení
-setting.preferences.explorer=Monero Explorer
+setting.preferences.explorer=Průzkumník Monero
setting.preferences.deviation=Max. odchylka od tržní ceny
setting.preferences.avoidStandbyMode=Vyhněte se pohotovostnímu režimu
setting.preferences.useSoundForNotifications=Přehrávat zvuky pro upozornění
@@ -1002,12 +1285,10 @@ setting.preferences.autoConfirmXMR=Automatické potvrzení XMR
setting.preferences.autoConfirmEnabled=Povoleno
setting.preferences.autoConfirmRequiredConfirmations=Požadovaná potvrzení
setting.preferences.autoConfirmMaxTradeSize=Max. částka obchodu (XMR)
-setting.preferences.autoConfirmServiceAddresses=Monero Explorer URL (používá Tor, kromě localhost, LAN IP adres a názvů hostitele *.local)
+setting.preferences.autoConfirmServiceAddresses=Adresa průzkumníka Monero (používá Tor, kromě localhost, LAN IP adres a názvů hostitele *.local)
setting.preferences.deviationToLarge=Hodnoty vyšší než {0} % nejsou povoleny.
setting.preferences.txFee=Poplatek za výběr transakce (satoshi/vbyte)
setting.preferences.useCustomValue=Použijte vlastní hodnotu
-setting.preferences.txFeeMin=Transakční poplatek musí být alespoň {0} satoshi/vbyte
-setting.preferences.txFeeTooLarge=Váš vstup je nad jakoukoli rozumnou hodnotou (>5000 satoshi/vbyte). Transakční poplatek se obvykle pohybuje v rozmezí 50-400 satoshi/vbyte.
setting.preferences.ignorePeers=Ignorované peer uzly [onion addresa:port]
setting.preferences.ignoreDustThreshold=Min. hodnota výstupu bez drobných
setting.preferences.currenciesInList=Měny v seznamu zdrojů tržních cen
@@ -1027,11 +1308,12 @@ setting.preferences.sortWithNumOffers=Seřadit seznamy trhů s počtem nabídek/
setting.preferences.onlyShowPaymentMethodsFromAccount=Skrýt nepodporované způsoby platby
setting.preferences.denyApiTaker=Odmítat příjemce, kteří používají API
setting.preferences.notifyOnPreRelease=Získávat oznámení o beta verzích
-setting.preferences.resetAllFlags=Zrušit všechny "Nezobrazovat znovu"
+setting.preferences.resetAllFlags=Zrušit všechny \"Nezobrazovat znovu\"
settings.preferences.languageChange=Chcete-li použít změnu jazyka na všech obrazovkách, musíte restartovat aplikaci.
settings.preferences.supportLanguageWarning=V případě sporu mějte na paměti, že arbitráž je řešena v {0}.
settings.preferences.editCustomExplorer.headline=Nastavení Průzkumníku
-settings.preferences.editCustomExplorer.description=Ze seznamu vlevo vyberte průzkumníka definovaného systémem nebo si jej přizpůsobte podle svých vlastních preferencí.
+settings.preferences.editCustomExplorer.description=Ze seznamu vlevo vyberte průzkumníka definovaného systémem a nebo \
+ si jej přizpůsobte podle svých vlastních preferencí.
settings.preferences.editCustomExplorer.available=Dostupní průzkumníci
settings.preferences.editCustomExplorer.chosen=Nastavení zvoleného průzkumníka
settings.preferences.editCustomExplorer.name=Jméno
@@ -1046,14 +1328,21 @@ settings.net.moneroPeersLabel=Připojené peer uzly
settings.net.connection=Připojení
settings.net.connected=Připojeno
settings.net.useTorForXmrJLabel=Použít Tor pro Monero síť
+settings.net.useTorForXmrAfterSyncRadio=Po synchronizaci peněženky
+settings.net.useTorForXmrOffRadio=Nikdy
+settings.net.useTorForXmrOnRadio=Vždy
settings.net.moneroNodesLabel=Monero uzly, pro připojení
-settings.net.useProvidedNodesRadio=Použijte nabízené Monero Core uzly
+settings.net.useProvidedNodesRadio=Použít nabízené Monero uzly
settings.net.usePublicNodesRadio=Použít veřejnou síť Monero
-settings.net.useCustomNodesRadio=Použijte vlastní Monero Core uzel
+settings.net.useCustomNodesRadio=Použít vlastní Monero uzel
settings.net.warn.usePublicNodes=Pokud používáte veřejné Monero uzly, jste vystaveni riziku spojenému s používáním nedůvěryhodných vzdálených uzlů.\n\nProsím, přečtěte si více podrobností na [HYPERLINK:https://www.getmonero.org/resources/moneropedia/remote-node.html].\n\nJste si jistí, že chcete použít veřejné uzly?
settings.net.warn.usePublicNodes.useProvided=Ne, použijte nabízené uzly
settings.net.warn.usePublicNodes.usePublic=Ano, použít veřejnou síť
-settings.net.warn.useCustomNodes.B2XWarning=Ujistěte se, že váš Monero uzel je důvěryhodný Monero Core uzel!\n\nPřipojení k uzlům, které nedodržují pravidla konsensu Monero Core, může poškodit vaši peněženku a způsobit problémy v obchodním procesu.\n\nUživatelé, kteří se připojují k uzlům, které porušují pravidla konsensu, odpovídají za případné škody, které z toho vyplývají. Jakékoli výsledné spory budou rozhodnuty ve prospěch druhého obchodníka. Uživatelům, kteří ignorují tyto varovné a ochranné mechanismy, nebude poskytována technická podpora!
+settings.net.warn.useCustomNodes.B2XWarning=Ujistěte se, že váš Monero uzel je důvěryhodný Monero uzel!\n\n\
+ Připojení k uzlům, které nedodržují pravidla konsensu Monero, může poškodit vaši peněženku a způsobit problémy v obchodním procesu.\n\n\
+ Uživatelé, kteří se připojují k uzlům, které porušují pravidla konsensu, odpovídají za případné škody, které z toho vyplývají. \
+ Jakékoli výsledné spory budou rozhodnuty ve prospěch druhého obchodníka. Uživatelům, kteří ignorují \
+ tyto varovné a ochranné mechanismy, nebude poskytována technická podpora!
settings.net.warn.invalidXmrConfig=Připojení k síti Monero selhalo, protože je vaše konfigurace neplatná.\n\nVaše konfigurace byla resetována, aby byly místo toho použity poskytnuté uzly Monero. Budete muset restartovat aplikaci.
settings.net.localhostXmrNodeInfo=Základní informace: Haveno při spuštění hledá místní Monero uzel. Pokud je nalezen, Haveno bude komunikovat se sítí Monero výhradně skrze něj.
settings.net.p2PPeersLabel=Připojené uzly
@@ -1085,11 +1374,15 @@ settings.net.initialDataExchange={0} [Bootstrapping]
settings.net.peer=Peer
settings.net.inbound=příchozí
settings.net.outbound=odchozí
+settings.net.rescanOutputsLabel=Znovu oskenovat výstupy
+settings.net.rescanOutputsButton=Znovu oskenovat výstupy peněženky
+settings.net.rescanOutputsSuccess=Jste si jistí, že chcete znovu oskenovat výstupy vaší peněženky?
+settings.net.rescanOutputsFailed=Nepodařilo se oskenovat výstupy peněženky.\nChyba: {0}
setting.about.aboutHaveno=O projektu Haveno
setting.about.about=Haveno je software s otevřeným zdrojovým kódem, který usnadňuje směnu moneroů s národními měnami (a jinými kryptoměnami) prostřednictvím decentralizované sítě typu peer-to-peer způsobem, který silně chrání soukromí uživatelů. Zjistěte více o Haveno na naší webové stránce projektu.
setting.about.web=Webová stránka Haveno
setting.about.code=Zdrojový kód
-setting.about.agpl=AGPL Licence
+setting.about.agpl=AGPL licence
setting.about.support=Podpořte Haveno
setting.about.def=Haveno není společnost - je to projekt otevřený komunitě. Pokud se chcete zapojit nebo podpořit Haveno, postupujte podle níže uvedených odkazů.
setting.about.contribute=Přispět
@@ -1113,7 +1406,7 @@ setting.about.shortcuts.close=Zavřít Haveno
setting.about.shortcuts.close.value=''Ctrl + {0}'' nebo ''cmd + {0}'' nebo ''Ctrl + {1}'' nebo ''cmd + {1}''
setting.about.shortcuts.closePopup=Zavřete vyskakovací nebo dialogové okno
-setting.about.shortcuts.closePopup.value=Klávesa „ESCAPE“
+setting.about.shortcuts.closePopup.value=Klávesa 'ESCAPE'
setting.about.shortcuts.chatSendMsg=Odeslat obchodní soukromou zprávu
setting.about.shortcuts.chatSendMsg.value=''Ctrl + ENTER'' nebo ''alt + ENTER'' nebo ''cmd + ENTER''
@@ -1148,17 +1441,14 @@ setting.about.shortcuts.sendFilter=Nastavit filtr (privilegovaná aktivita)
setting.about.shortcuts.sendPrivateNotification=Odeslat soukromé oznámení partnerovi (privilegovaná aktivita)
setting.about.shortcuts.sendPrivateNotification.value=Otevřete informace o uživateli kliknutím na avatar a stiskněte: {0}
-setting.info.headline=Nová funkce automatického potvrzení XMR
-setting.info.msg=Při prodeji XMR za XMR můžete pomocí funkce automatického potvrzení ověřit, že do vaší peněženky bylo odesláno správné množství XMR, takže Haveno může automaticky označit obchod jako dokončený, což zrychlí obchodování pro všechny.\n\nAutomatické potvrzení zkontroluje transakci XMR alespoň na 2 uzlech průzkumníka XMR pomocí klíče soukromé transakce poskytnutého odesílatelem XMR. Ve výchozím nastavení používá Haveno uzly průzkumníka spuštěné přispěvateli Haveno, ale pro maximální soukromí a zabezpečení doporučujeme spustit vlastní uzel průzkumníka XMR.\n\nMůžete také nastavit maximální částku XMR na obchod, která se má automaticky potvrdit, a také počet požadovaných potvrzení zde v Nastavení.\n\nZobrazit další podrobnosti (včetně toho, jak nastavit vlastní uzel průzkumníka) na Haveno wiki: [HYPERLINK:https://haveno.exchange/wiki/Trading_Monero#Auto-confirming_trades]
####################################################################
# Account
####################################################################
+account.tab.arbitratorRegistration=Registrace rozhodce
account.tab.mediatorRegistration=Registrace mediátora
account.tab.refundAgentRegistration=Registrace rozhodce pro vrácení peněz
account.tab.signing=Podepisování
-account.info.headline=Vítejte ve vašem účtu Haveno
-account.info.msg=Zde můžete přidat obchodní účty pro národní měny & kryptoměny a vytvořit zálohu dat vaší peněženky a účtu.\n\nPři prvním spuštění Haveno byla vytvořena nová peněženka Monero.\n\nDůrazně doporučujeme zapsat si seed slova peněženek (viz záložka nahoře) a před financováním zvážit přidání hesla. Vklady a výběry moneroů jsou spravovány v sekci \ "Finance \".\n\nOchrana osobních údajů a zabezpečení: protože Haveno je decentralizovaná směnárna, všechna data jsou uložena ve vašem počítači. Neexistují žádné servery, takže nemáme přístup k vašim osobním informacím, vašim finančním prostředkům ani vaší IP adrese. Údaje, jako jsou čísla bankovních účtů, adresy cryptoů a monerou atd., jsou sdíleny pouze s obchodním partnerem za účelem uskutečnění obchodů, které zahájíte (v případě sporu uvidí Prostředník nebo Rozhodce stejná data jako váš obchodní partner).
account.menu.paymentAccount=Účty v národní měně
account.menu.altCoinsAccountView=Kryptoměnové účty
@@ -1169,11 +1459,16 @@ account.menu.backup=Záloha
account.menu.notifications=Oznámení
account.menu.walletInfo.balance.headLine=Zůstatky v peněžence
-account.menu.walletInfo.balance.info=Zde jsou zobrazeny celkové zůstatky v interní peněžence včetně nepotvrzených transakcí.\nInterní zůstatek XMR uvedený níže by měl odpovídat součtu hodnot 'Dostupný zůstatek' a 'Rezervováno v nabídkách' v pravém horním rohu aplikace.
+account.menu.walletInfo.balance.info=Zde jsou zobrazeny celkové zůstatky v interní peněžence včetně nepotvrzených transakcí.\n\
+ Interní zůstatek XMR uvedený níže by měl odpovídat součtu hodnot 'Dostupný zůstatek' a 'Rezervováno v nabídkách' v pravém horním rohu aplikace.
account.menu.walletInfo.xpub.headLine=Veřejné klíče (xpub)
account.menu.walletInfo.walletSelector={0} {1} peněženka
account.menu.walletInfo.path.headLine=HD identifikátory klíčů
-account.menu.walletInfo.path.info=Pokud importujete vaše seed slova do jiné peněženky (např. Electrum), budete muset nastavit také identifikátor klíčů (BIP32 path). Toto provádějte pouze ve výjimečných případech, např. pokud úplně ztratíte kontrolu nad Haveno peněženkou.\nMějte na paměti, že provádění transakcí pomocí jiných softwarových peněženek může snadno poškodit interní datové struktury systému Haveno, a znemožnit tak provádění obchodů.\n\nNIKDY neposílejte BSQ pomocí jiných softwarových peněženek než Haveno, protože byste tím velmi pravděpodobně vytvořili neplatnou BSQ transakci, a ztratili tak své BSQ.
+account.menu.walletInfo.path.info=Pokud importujete vaše seed slova do jiné peněženky (např. Electrum), budete muset nastavit také \
+ cestu. Toto provádějte pouze ve výjimečných případech, např. pokud úplně ztratíte kontrolu nad Haveno peněženkou a složkou dat.\n\
+ Mějte na paměti, že provádění transakcí pomocí jiných softwarových peněženek může snadno poškodit interní datové struktury \
+ systému Haveno, a znemožnit tak provádění obchodů.\n\n\
+NIKDY neposílejte BSQ pomocí jiných softwarových peněženek než Haveno, protože byste tím velmi pravděpodobně vytvořili neplatnou BSQ transakci, a ztratili tak své BSQ.
account.menu.walletInfo.openDetails=Zobrazit detailní data peněženky a soukromé klíče
@@ -1191,42 +1486,219 @@ account.arbitratorRegistration.registerSuccess=Úspěšně jste se zaregistroval
account.arbitratorRegistration.registerFailed=Registraci se nepodařilo dokončit. {0}
account.crypto.yourCryptoAccounts=Vaše kryptoměnové účty
-account.crypto.popup.wallet.msg=Ujistěte se, že dodržujete požadavky na používání peněženek {0}, jak je popsáno na webové stránce {1}.\nPoužití peněženek z centralizovaných směnáren, kde (a) nevlastníte své soukromé klíče nebo (b) které nepoužívají kompatibilní software peněženky, je riskantní: může to vést ke ztrátě obchodovaných prostředků!\nMediátor nebo rozhodce není specialista {2} a v takových případech nemůže pomoci.
+account.crypto.popup.wallet.msg=Ujistěte se, že dodržujete požadavky na používání peněženek {0}, jak je \
+popsáno na webové stránce {1}.\nPoužití peněženek z centralizovaných směnáren, kde (a) nevlastníte své soukromé klíče nebo \
+(b) které nepoužívají kompatibilní software peněženk, je riskantní: může to vést ke ztrátě obchodovaných prostředků!\nMediátor nebo rozhodce \
+není specialista {2} a v takových případech nemůže pomoci.
account.crypto.popup.wallet.confirm=Rozumím a potvrzuji, že vím, jakou peněženku musím použít.
# suppress inspection "UnusedProperty"
-account.crypto.popup.upx.msg=Obchodování s UPX na Haveno vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání UPX musíte použít buď oficiální peněženku GUI uPlexa nebo CLI peněženku uPlexa s povoleným příznakem store-tx-info (výchozí hodnota v nových verzích). Ujistěte se, že máte přístup ke klíči tx, který může být vyžadován v případě sporu.\nuplexa-wallet-cli (použijte příkaz get_tx_key)\nuplexa-wallet-gui (přejděte na záložku historie a pro potvrzení platby klikněte na tlačítko (P))\n\nV normálním block exploreru není přenos ověřitelný.\n\nV případě sporu musíte rozhodci poskytnout následující údaje:\n- Soukromý klíč tx\n- Hash transakce\n- Veřejnou adresa příjemce\n\nPokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde ke prohrání sporu. Odesílatel UPX odpovídá za zajištění ověření přenosu UPX rozhodci v případě sporu.\n\nNení požadováno žádné platební ID, pouze normální veřejná adresa.\nPokud si nejste jisti tímto procesem, vyhledejte další informace na discord kanálu uPlexa (https://discord.gg/vhdNSrV) nebo uPlexa Telegram Chatu (https://t.me/uplexaOfficial).
+account.crypto.popup.upx.msg=Obchodování s UPX na Haveno vyžaduje, abyste pochopili a splnili následující požadavky:\n\n\
+K odeslání UPX musíte použít buď oficiální peněženku GUI uPlexa nebo CLI peněženku uPlexa \
+s povoleným příznakem store-tx-info (výchozí hodnota v nových verzích). \
+Ujistěte se, že máte přístup \
+ke klíči tx, který může být vyžadován v případě sporu.\n\
+uplexa-wallet-cli (použijte příkaz get_tx_key)\n\
+uplexa-wallet-gui (přejděte na záložku historie a pro potvrzení platby klikněte na tlačítko (P))\n\n\
+V normálním block exploreru není přenos ověřitelný.\n\n\
+V případě sporu musíte rozhodci poskytnout následující údaje:\n\
+- Soukromý klíč tx\n\
+- Hash transakce\n\
+- Veřejnou adresa příjemce\n\n\
+Pokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde ke prohrání sporu. \
+Odesílatel UPX odpovídá za zajištění ověření přenosu UPX rozhodci \
+v případě sporu.\n\n\
+Není požadováno žádné platební ID, pouze normální veřejná adresa.\n\
+Pokud si nejste jisti tímto procesem, vyhledejte další informace na discord kanálu uPlexa (https://discord.gg/vhdNSrV) \
+nebo uPlexa Telegram Chatu (https://t.me/uplexaOfficial).
# suppress inspection "UnusedProperty"
-account.crypto.popup.arq.msg=Obchodování ARQ na Haveno vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání ARQ musíte použít buď oficiální peněženku ArQmA GUI nebo peněženku ArQmA CLI s povoleným příznakem store-tx-info (výchozí hodnota v nových verzích). Ujistěte se, že máte přístup ke klíči tx, který může být vyžadován v případě sporu.\narqma-wallet-cli (použijte příkaz get_tx_key)\narqma-wallet-gui (přejděte na kartu historie a pro potvrzení platby klikněte na tlačítko (P))\n\nV normálním blok exploreru není přenos ověřitelný.\n\nV případě sporu musíte mediátorovi nebo rozhodci poskytnout následující údaje:\n- Soukromý klíč tx\n- Hash transakce\n- Veřejnou adresu příjemce\n\nPokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde ke prohrání sporu. Odesílatel ARQ odpovídá za zajištění ověření převodu ARQ mediátorovi nebo rozhodci v případě sporu.\n\nNení požadováno žádné platební ID, pouze normální veřejná adresa.\nPokud si nejste jisti tímto procesem, navštivte discord kanál ArQmA (https://discord.gg/s9BQpJT) nebo fórum ArQmA (https://labs.arqma.com).
+account.crypto.popup.arq.msg=Obchodování ARQ na Haveno vyžaduje, abyste pochopili \
+a splnili následující požadavky:\n\n\
+K odeslání ARQ musíte použít buď oficiální peněženku ArQmA GUI nebo peněženku ArQmA CLI \
+s povoleným příznakem store-tx-info (výchozí hodnota v nových verzích). \
+Ujistěte se, že máte přístup ke klíči tx, který může být vyžadován v případě sporu.\n\
+arqma-wallet-cli (použijte příkaz get_tx_key)\n\
+arqma-wallet-gui (přejděte na kartu historie a pro potvrzení platby klikněte na tlačítko (P))\n\n\
+V normálním prohlížeči bloků není přenos ověřitelný.\n\n\
+V případě sporu musíte mediátorovi nebo rozhodci poskytnout následující údaje:\n\
+- Soukromý klíč tx\n\
+- Hash transakce\n\
+- Veřejnou adresu příjemce\n\n\
+Pokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde k prohrání sporu. \
+Odesílatel ARQ odpovídá za zajištění ověření převodu ARQ mediátorovi \
+nebo rozhodci v případě sporu.\n\n\
+Není požadováno žádné platební ID, pouze normální veřejná adresa.\n\
+Pokud si nejste jisti tímto procesem, navštivte discord kanál ArQmA (https://discord.gg/s9BQpJT) \
+nebo fórum ArQmA (https://labs.arqma.com).
# suppress inspection "UnusedProperty"
-account.crypto.popup.xmr.msg=Obchodování s XMR na Haveno vyžaduje, abyste pochopili následující požadavek.\n\nPokud prodáváte XMR, musíte být schopni v případě sporu poskytnout mediátorovi nebo rozhodci následující informace:\n- transakční klíč (Tx klíč, Tx tajný klíč nebo Tx soukromý klíč)\n- ID transakce (Tx ID nebo Tx Hash)\n- cílová adresa (adresa příjemce)\n\nNa wiki najdete podrobnosti, kde najdete tyto informace v populárních peněženkách Monero:\n[HYPERLINK:https://haveno.exchange/wiki/Trading_Monero#Proving_payments].\n\nNeposkytnutí požadovaných údajů o transakci bude mít za následek ztrátu sporů.\n\nVšimněte si také, že Haveno nyní nabízí automatické potvrzení transakcí XMR, aby byly obchody rychlejší, ale musíte to povolit v Nastavení.\n\nDalší informace o funkci automatického potvrzení najdete na wiki:\n[HYPERLINK:https://haveno.exchange/wiki/Trading_Monero#Auto-confirming_trades].
+account.crypto.popup.xmr.msg=Obchodování s XMR na Haveno vyžaduje, abyste pochopili následující požadavek.\n\n\
+Pokud prodáváte XMR, musíte být schopni v případě sporu poskytnout mediátorovi nebo rozhodci následující informace:\n\
+- transakční klíč (Tx klíč, Tx tajný klíč nebo Tx soukromý klíč)\n\
+- ID transakce (Tx ID nebo Tx Hash)\n\
+- cílová adresa (adresa příjemce)\n\n\
+Na wiki najdete podrobnosti, kde najdete tyto informace v populárních peněženkách Monero:\n[HYPERLINK:https://haveno.exchange/wiki/Trading_Monero#Proving_payments].\n\
+Neposkytnutí požadovaných údajů o transakci bude mít za následek ztrátu sporů.\n\n\
+Všimněte si také, že Haveno nyní nabízí automatické potvrzení transakcí XMR, aby byly obchody rychlejší, \
+ale musíte to povolit v Nastavení.\n\n\
+Další informace o funkci automatického potvrzení najdete na wiki: [HYPERLINK:https://haveno.exchange/wiki/Trading_Monero#Auto-confirming_trades].
# suppress inspection "UnusedProperty"
-account.crypto.popup.msr.msg=Obchodování MSR na Haveno vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání MSR musíte použít buď oficiální peněženku Masari GUI, peněženku Masari CLI s povoleným příznakem store-tx-info (ve výchozím nastavení povoleno) nebo webovou peněženku Masari (https://wallet.getmasari.org). Ujistěte se, že máte přístup ke klíči tx, který může být vyžadován v případě sporu.\nmasari-wallet-cli (použijte příkaz get_tx_key)\nmasari-wallet-gui (přejděte na kartu historie a klikněte na tlačítko (P) pro potvrzení platby)\n\nWebová peněženka Masari (jděte do Účet -> Historie transakcí a zobrazte podrobností o odeslané transakci)\n\nOvěření lze provést v peněžence.\nmasari-wallet-cli: pomocí příkazu (check_tx_key).\nmasari-wallet-gui: na stránce Pokročilé > Dokázat/Ověřit.\nOvěření lze provést v block exploreru\nOtevřete Block explorer (https://explorer.getmasari.org), použijte vyhledávací lištu k nalezení hash transakce.\nJakmile je transakce nalezena, přejděte dolů do oblasti „Prokázat odesílání“ a podle potřeby vyplňte podrobnosti.\nV případě sporu musíte zprostředkovateli nebo rozhodci poskytnout následující údaje:\n- Soukromý klíč tx\n- Hash transakce\n- Veřejnou adresu příjemce\n\nPokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde ke ztrátě sporu. Odesílatel MSR odpovídá za zajištění ověření přenosu MSR mediátorovi nebo rozhodci v případě sporu.\n\nNení požadováno žádné platební ID, pouze normální veřejná adresa.\nPokud si nejste jisti tímto procesem, požádejte o pomoc oficiální Masari Discord (https://discord.gg/sMCwMqs).
+account.crypto.popup.msr.msg=Obchodování MSR na Haveno vyžaduje, abyste pochopili a splnili \
+následující požadavky:\n\n\
+K odeslání MSR musíte použít buď oficiální peněženku Masari GUI, peněženku Masari CLI s povoleným příznakem \
+store-tx-info (ve výchozím nastavení povoleno) nebo webovou peněženku Masari (https://wallet.getmasari.org). Ujistěte se, že máte přístup ke klíči tx, \
+který může být vyžadován v případě sporu.\n\
+masari-wallet-cli (použijte příkaz get_tx_key)\n\
+masari-wallet-gui (přejděte na kartu historie a klikněte na tlačítko (P) pro potvrzení platby)\n\n\
+Webová peněženka Masari (jděte do Účet -> Historie transakcí a zobrazte podrobností o odeslané transakci)\n\n\
+Ověření lze provést v peněžence.\n\
+masari-wallet-cli: pomocí příkazu (check_tx_key).\n\
+masari-wallet-gui: na stránce Pokročilé > Dokázat/Ověřit.\n\
+Ověření lze provést v block exploreru\n\
+Otevřete Block explorer (https://explorer.getmasari.org), použijte vyhledávací lištu k nalezení hash transakce.\n\
+Jakmile je transakce nalezena, přejděte dolů do oblasti 'Prokázat odesílání' a podle potřeby vyplňte podrobnosti.\n\
+V případě sporu musíte zprostředkovateli nebo rozhodci poskytnout následující údaje:\n\
+- Soukromý klíč tx\n\
+- Hash transakce\n\
+- Veřejnou adresu příjemce\n\n\
+Pokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde ke ztrátě sporu. \
+Odesílatel MSR odpovídá za zajištění ověření přenosu MSR mediátorovi \
+nebo rozhodci v případě sporu.\n\n\
+Není požadováno žádné platební ID, pouze normální veřejná adresa.\n\
+Pokud si nejste jisti tímto procesem, požádejte o pomoc oficiální Masari Discord (https://discord.gg/sMCwMqs).
# suppress inspection "UnusedProperty"
-account.crypto.popup.blur.msg=Obchodování BLUR na Haveno vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání BLUR musíte použít Blur Network CLI nebo GUI peněženku.\n\nPoužíváte-li peněženku CLI, po odeslání transakce se zobrazí hash transakce (tx ID). Tyto informace si musíte uložit. Ihned po odeslání transakce musíte použít příkaz 'get_tx_key' pro načtení soukromého klíče transakce. Pokud tento krok neprovedete, pravděpodobně nebudete moci klíč získat později.\n\nPokud používáte peněženku GUI Blur Network, lze soukromý klíč transakce a ID transakce pohodlně nalézt na kartě Historie. Ihned po odeslání vyhledejte příslušnou transakci. Klikněte na "?" symbol v pravém dolním rohu pole obsahující transakci. Tyto informace si musíte uložit.\n\nV případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1.) ID transakce, 2.) soukromý klíč transakce a 3.) Adresu příjemce. Mediátor nebo rozhodce poté ověří přenos BLUR pomocí prohlížeče BLUR transakcí (https://blur.cash/#tx-viewer).\n\nNeposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. Ve všech sporných případech nese odesílatel BLUR 100% odpovědnosti za ověřování transakcí mediátorovi nebo rozhodci.\n\nPokud těmto požadavkům nerozumíte, neobchodujte na Haveno. Nejprve vyhledejte pomoc na Blur Network Discord (https://discord.gg/dMWaqVW).
+account.crypto.popup.blur.msg=Obchodování BLUR na Haveno vyžaduje, abyste pochopili \
+a splnili následující požadavky:\n\n\
+K odeslání BLUR musíte použít Blur Network CLI nebo GUI peněženku.\n\n\
+Používáte-li peněženku CLI, po odeslání transakce se zobrazí hash transakce (tx ID). Tyto informace si musíte uložit. \
+Ihned po odeslání transakce musíte použít příkaz 'get_tx_key' pro načtení soukromého klíče transakce. \
+Pokud tento krok neprovedete, pravděpodobně nebudete moci klíč získat později.\n\n\
+Pokud používáte peněženku GUI Blur Network, lze soukromý klíč transakce a ID transakce pohodlně nalézt \
+na kartě Historie. Ihned po odeslání vyhledejte příslušnou transakci. Klikněte na "?" symbol \
+v pravém dolním rohu pole obsahující transakci. Tyto informace si musíte uložit.\n\n\
+V případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1.) ID transakce, \
+2.) soukromý klíč transakce a 3.) Adresu příjemce. Mediátor nebo rozhodce poté ověří přenos BLUR \
+pomocí prohlížeče BLUR transakcí (https://blur.cash/#tx-viewer).\n\n\
+Neposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. \
+Ve všech sporných případech nese odesílatel BLUR 100% odpovědnosti za ověřování transakcí mediátorovi nebo rozhodci.\n\n\
+Pokud těmto požadavkům nerozumíte, neobchodujte na Haveno. Nejprve vyhledejte pomoc na Blur Network Discord (https://discord.gg/dMWaqVW).
# suppress inspection "UnusedProperty"
-account.crypto.popup.solo.msg=Obchodování Solo na Haveno vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání Solo musíte použít peněženku CLI Solo Network.\n\nPoužíváte-li peněženku CLI, po odeslání přenosu se zobrazí hash transakce (tx ID). Tyto informace si musíte uložit. Ihned po odeslání převodu musíte použít příkaz 'get_tx_key' pro načtení soukromého klíče transakce. Pokud tento krok neprovedete, pravděpodobně nebudete moci klíč získat později.\n\nV případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1.) ID transakce, 2.) Soukromý klíč transakce a 3.) Adresu příjemce. Mediátor nebo rozhodce poté ověří převod Solo pomocí Solo Block Exploreru vyhledáním transakce a poté pomocí funkce „Prokažte odesílání“ (https://explorer.minesolo.com/).\n\nneposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. Ve všech sporných případech nese Solo odesílatel 100% odpovědnost za ověřování transakcí mediátorovi nebo rozhodci.\n\nPokud těmto požadavkům nerozumíte, neobchodujte na Haveno. Nejprve vyhledejte pomoc na stránce Solo Network Discord (https://discord.minesolo.com/).
+account.crypto.popup.solo.msg=Obchodování Solo na Haveno vyžaduje, abyste pochopili a splnili \
+následující požadavky:\n\n\
+K odeslání Solo musíte použít peněženku CLI Solo Network.\n\n\
+Používáte-li peněženku CLI, po odeslání přenosu se zobrazí hash transakce (tx ID). Tyto informace si musíte uložit. \
+Ihned po odeslání převodu musíte použít příkaz 'get_tx_key' pro načtení soukromého klíče transakce. \
+Pokud tento krok neprovedete, pravděpodobně nebudete moci klíč získat později.\n\n\
+V případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1.) ID transakce, \
+2.) Soukromý klíč transakce a 3.) Adresu příjemce. Mediátor nebo rozhodce poté ověří převod Solo \
+pomocí Solo Block Exploreru vyhledáním transakce a poté pomocí funkce 'Prokažte odesílání' (https://explorer.minesolo.com/).\n\n\
+neposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. \
+Ve všech sporných případech nese Solo odesílatel 100% odpovědnost za ověřování transakcí mediátorovi nebo rozhodci.\n\n\
+Pokud těmto požadavkům nerozumíte, neobchodujte na Haveno. Nejprve vyhledejte pomoc na stránce Solo Network Discord (https://discord.minesolo.com/).
# suppress inspection "UnusedProperty"
-account.crypto.popup.cash2.msg=Obchodování CASH2 na Haveno vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání CASH2 musíte použít peněženku Cash2 Wallet verze 3 nebo vyšší.\n\nPo odeslání transakce se zobrazí ID transakce. Tyto informace si musíte uložit. Ihned po odeslání transakce musíte použít příkaz 'getTxKey' v simplewallet a získat tajný klíč transakce.\n\nV případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1) ID transakce, 2) Tajný klíč transakce a 3) Adresu Cash2 příjemce. Mediátor nebo rozhodce poté ověří převod CASH2 pomocí průzkumníku Cash2 Block Explorer (https://blocks.cash2.org).\n\nNeposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. Ve všech sporných případech nese odesílatel CASH2 100% odpovědnost za ověření transakcí mediátorovi nebo rozhodci.\n\nPokud těmto požadavkům nerozumíte, neobchodujte na Haveno. Nejprve vyhledejte pomoc na Cash2 Discord (https://discord.gg/FGfXAYN).
+account.crypto.popup.cash2.msg=Obchodování CASH2 na Haveno vyžaduje, abyste pochopili \
+a splnili následující požadavky:\n\n\
+K odeslání CASH2 musíte použít peněženku Cash2 Wallet verze 3 nebo vyšší.\n\n\
+Po odeslání transakce se zobrazí ID transakce. Tyto informace si musíte uložit. \
+Ihned po odeslání transakce musíte použít příkaz 'getTxKey' v simplewallet \
+a získat tajný klíč transakce.\n\n\
+V případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1) ID transakce, \
+2) Tajný klíč transakce a 3) Adresu Cash2 příjemce. Mediátor nebo rozhodce poté ověří převod CASH2 \
+pomocí průzkumníku Cash2 Block Explorer (https://blocks.cash2.org).\n\n\
+Neposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. \
+Ve všech sporných případech nese odesílatel CASH2 100% odpovědnost za ověření transakcí mediátorovi nebo rozhodci. \n\n
+Pokud těmto požadavkům nerozumíte, neobchodujte na Haveno. Nejprve vyhledejte pomoc na Cash2 Discord (https://discord.gg/FGfXAYN).
# suppress inspection "UnusedProperty"
-account.crypto.popup.qwertycoin.msg=Obchodování s Qwertycoinem na Haveno vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání QWC musíte použít oficiální QWC peněženku verze 5.1.3 nebo vyšší.\n\nPo odeslání transakce se zobrazí ID transakce. Tyto informace si musíte uložit. Ihned po odeslání transakce musíte použít příkaz 'get_Tx_Key' v simplewallet a získat tajný klíč transakce.\n\nV případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1) ID transakce, 2) Tajný klíč transakce a 3) Adresu QWC příjemce. Mediátor nebo rozhodce poté ověří přenos QWC pomocí Průzkumníka bloků QWC (https://explorer.qwertycoin.org).\n\nNeposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. Ve všech sporných případech nese odesílatel QWC 100% odpovědnost za ověřování transakcí mediátorovi nebo rozhodci.\n\nPokud těmto požadavkům nerozumíte, neobchodujte na Haveno. Nejprve vyhledejte pomoc na stránce QWC Discord (https://discord.gg/rUkfnpC).
+account.crypto.popup.qwertycoin.msg=Obchodování s Qwertycoinem na Haveno vyžaduje, abyste pochopili \
+a splnili následující požadavky:\n\n\
+K odeslání QWC musíte použít oficiální QWC peněženku verze 5.1.3 nebo vyšší.\n\n\
+Po odeslání transakce se zobrazí ID transakce. Tyto informace si musíte uložit. \
+Ihned po odeslání transakce musíte použít příkaz 'get_Tx_Key' v simplewallet \
+a získat tajný klíč transakce.\n\n\
+V případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1) ID transakce, \
+2) Tajný klíč transakce a 3) Adresu QWC příjemce. Mediátor nebo rozhodce poté ověří přenos QWC \
+pomocí Průzkumníka bloků QWC (https://explorer.qwertycoin.org).\n\n\
+Neposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. \
+Ve všech sporných případech nese odesílatel QWC 100% odpovědnost za ověřování transakcí mediátorovi nebo rozhodci.\n\n\
+Pokud těmto požadavkům nerozumíte, neobchodujte na Haveno. Nejprve vyhledejte pomoc na stránce QWC Discord (https://discord.gg/rUkfnpC).
# suppress inspection "UnusedProperty"
-account.crypto.popup.drgl.msg=Obchodování Dragonglass na Haveno vyžaduje, abyste pochopili a splnili následující požadavky:\n\nVzhledem k tomu, že Dragonglass poskytuje soukromí, není transakce na veřejném blockchainu ověřitelná. V případě potřeby můžete svou platbu prokázat pomocí vašeho soukromého klíče TXN.\nSoukromý klíč TXN je jednorázový klíč automaticky generovaný pro každou transakci, ke které lze přistupovat pouze z vaší DRGL peněženky.\nBuď pomocí GUI peněženky DRGL (uvnitř dialogu s podrobnostmi o transakci) nebo pomocí simplewallet CLI Dragonglass (pomocí příkazu "get_tx_key").\n\nVerze DRGL „Oathkeeper“ a vyšší jsou požadovány pro obě možnosti.\n\nV případě sporu musíte mediátorovi nebo rozhodci poskytnout následující údaje:\n- TXN-soukromý klíč\n- Hash transakce\n- Veřejnou adresu příjemce\n\nOvěření platby lze provést pomocí výše uvedených údajů jako vstupů na adrese (http://drgl.info/#check_txn).\n\nPokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde ke ztrátě sporu. Odesílatel Dragonglass odpovídá za ověření přenosu DRGL mediátorovi nebo rozhodci v případě sporu. Použití PaymentID není nutné.\n\nPokud si nejste jisti některou částí tohoto procesu, navštivte nápovědu pro Dragonglass na Discord (http://discord.drgl.info).
+account.crypto.popup.drgl.msg=Obchodování Dragonglass na Haveno vyžaduje, abyste pochopili a splnili \
+následující požadavky:\n\n\
+Vzhledem k tomu, že Dragonglass poskytuje soukromí, není transakce na veřejném blockchainu ověřitelná. V případě potřeby \
+můžete svou platbu prokázat pomocí vašeho soukromého klíče TXN.\n\
+Soukromý klíč TXN je jednorázový klíč automaticky generovaný pro každou transakci, \
+ke které lze přistupovat pouze z vaší DRGL peněženky.\n\
+Buď pomocí GUI peněženky DRGL (uvnitř dialogu s podrobnostmi o transakci) nebo pomocí simplewallet CLI Dragonglass (pomocí příkazu "get_tx_key").\n\n\
+Verze DRGL 'Oathkeeper' a vyšší jsou požadovány pro obě možnosti.\n\n\
+V případě sporu musíte mediátorovi nebo rozhodci poskytnout následující údaje:\n\
+- TXN-soukromý klíč\n\
+- Hash transakce\n\
+- Veřejnou adresu příjemce\n\n
+Ověření platby lze provést pomocí výše uvedených údajů jako vstupů na adrese (http://drgl.info/#check_txn).\n\n\
+Pokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde ke ztrátě sporu. \
+Odesílatel Dragonglass odpovídá za ověření přenosu DRGL mediátorovi nebo rozhodci v případě sporu. \
+Použití PaymentID není nutné.\n\n
+Pokud si nejste jisti některou částí tohoto procesu, navštivte Dragonglass na Discordu (http://discord.drgl.info) pro pomoc.
# suppress inspection "UnusedProperty"
-account.crypto.popup.ZEC.msg=Při použití Zcash můžete použít pouze transparentní adresy (začínající t), nikoli z-adresy (soukromé), protože mediátor nebo rozhodce by nemohl ověřit transakci pomocí z-adres.
+account.crypto.popup.ZEC.msg=Při použití Zcash můžete použít pouze transparentní adresy (začínající na t), nikoli \
+z-adresy (soukromé), protože mediátor nebo rozhodce by nemohl ověřit transakci pomocí z-adres.
# suppress inspection "UnusedProperty"
-account.crypto.popup.XZC.msg=Při použití Zcoinu můžete použít pouze transparentní (sledovatelné) adresy, nikoli nevysledovatelné adresy, protože mediátor nebo rozhodce by nemohl ověřit transakci s nevysledovatelnými adresami v blok exploreru.
+account.crypto.popup.XZC.msg=Při použití Zcoinu můžete použít pouze transparentní (sledovatelné) adresy, \
+nikoli nevysledovatelné adresy, protože mediátor nebo rozhodce by nemohl ověřit transakci s nevysledovatelnými adresami v blok exploreru.
# suppress inspection "UnusedProperty"
-account.crypto.popup.grin.msg=GRIN vyžaduje k vytvoření transakce interaktivní proces mezi odesílatelem a příjemcem. Nezapomeňte postupovat podle pokynů z webové stránky projektu GRIN, abyste spolehlivě odeslali a přijali GRIN (příjemce musí být online nebo alespoň online v určitém časovém rozmezí).\n\nHaveno podporuje pouze formát URL peněženky Grinbox (Wallet713).\n\nOdesílatel GRIN je povinen prokázat, že GRIN úspěšně odeslal. Pokud peněženka nemůže tento důkaz poskytnout, bude potenciální spor vyřešen ve prospěch příjemce GRIN. Ujistěte se, že používáte nejnovější software Grinbox, který podporuje důkaz transakcí a že chápete proces přenosu a přijímání GRIN a také způsob, jak vytvořit důkaz.\n\nViz https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only pro více informací o nástroji Grinbox proof.
+account.crypto.popup.grin.msg=GRIN vyžaduje k vytvoření transakce interaktivní proces mezi odesílatelem a příjemcem. \
+ Nezapomeňte postupovat podle pokynů z webové stránky projektu GRIN, abyste spolehlivě odeslali a přijali GRIN \
+ (příjemce musí být online nebo alespoň online v určitém časovém rozmezí).\n\n\
+ Haveno podporuje pouze formát URL peněženky Grinbox (Wallet713).\n\n\
+ Odesílatel GRIN je povinen prokázat, že GRIN úspěšně odeslal. Pokud peněženka nemůže tento důkaz poskytnout, \
+ bude potenciální spor vyřešen ve prospěch příjemce GRIN. Ujistěte se, že používáte \
+ nejnovější software Grinbox, který podporuje důkaz transakcí a že chápete proces přenosu \
+ a přijímání GRIN a také způsob, jak vytvořit důkaz.\n\n\
+ Viz https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only \
+pro více informací o nástroji Grinbox proof.
# suppress inspection "UnusedProperty"
-account.crypto.popup.beam.msg=BEAM vyžaduje k vytvoření transakce interaktivní proces mezi odesílatelem a příjemcem.\n\nNezapomeňte postupovat podle pokynů na webové stránce projektu BEAM, abyste spolehlivě odeslali a přijali BEAM (příjemce musí být online nebo alespoň online během určitého časového období).\n\nOdesílatel BEAM je povinen prokázat, že úspěšně odeslali BEAM. Nezapomeňte použít software peněženku, která může takový důkaz předložit. Pokud peněženka nemůže poskytnout důkaz, bude potenciální spor vyřešen ve prospěch příjemce BEAM.
+account.crypto.popup.beam.msg=BEAM vyžaduje k vytvoření transakce interaktivní proces \
+ mezi odesílatelem \
+ a příjemcem.\n\n\
+ Nezapomeňte postupovat podle pokynů na webové stránce projektu BEAM, abyste spolehlivě odeslali a přijali BEAM \
+ (příjemce musí být online nebo alespoň online během určitého časového období).\n\n\
+ Odesílatel BEAM je povinen prokázat, že úspěšně odeslali BEAM. \
+ Nezapomeňte použít software peněženku, která může takový důkaz předložit. Pokud peněženka nemůže poskytnout důkaz, \
+ bude potenciální spor vyřešen ve prospěch příjemce BEAM.
# suppress inspection "UnusedProperty"
-account.crypto.popup.pars.msg=Trading ParsiCoin na Haveno vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání PARS musíte použít oficiální ParsiCoin peněženku verze 3.0.0 nebo vyšší.\n\nV Peněženka GUI (ParsiPay) si můžete zkontrolovat svůj Hash Transakce a Klíč Transakce v sekci Transakce.\n\nV případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit: 1) Hash Transakce, 2) Transakční Klíč a 3) Adresu PARS příjemce. Mediátor nebo rozhodce poté ověří přenos PARS pomocí Block exploreru ParsiCoin (http://explorer.parsicoin.net/#check_payment).\n\nNeposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. Ve všech sporných případech nese odesílatel ParsiCoin 100% odpovědnost za ověřování transakcí mediátorovi nebo rozhodci.\n\nPokud těmto požadavkům nerozumíte, neobchodujte na Haveno. Nejprve vyhledejte pomoc na ParsiCoin Discord (https://discord.gg/c7qmFNh).
+account.crypto.popup.pars.msg=Trading ParsiCoin na Haveno vyžaduje, abyste pochopili a splnili následující požadavky:\n\n\
+K odeslání PARS musíte použít oficiální ParsiCoin peněženku verze 3.0.0 nebo vyšší.\n\n\
+V Peněženka GUI (ParsiPay) si můžete zkontrolovat svůj Hash Transakce a Klíč Transakce v sekci Transakce. \
+Je zapotřebí kliknout na transakci a potom na zobrazení detailů. \n\n\
+V případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit: 1) Hash Transakce, \
+2) Transakční Klíč a 3) Adresu PARS příjemce. Mediátor nebo rozhodce poté ověří přenos PARS \
+pomocí Block exploreru ParsiCoin (http://explorer.parsicoin.net/#check_payment).\n\n\
+Neposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. Ve všech sporných případech nese \
+odesílatel ParsiCoin 100% odpovědnost za ověřování transakcí mediátorovi nebo rozhodci.\n\n\
+Pokud těmto požadavkům nerozumíte, neobchodujte na Haveno. Nejprve vyhledejte pomoc na ParsiCoin Discord (https://discord.gg/c7qmFNh).
# suppress inspection "UnusedProperty"
-account.crypto.popup.blk-burnt.msg=Chcete-li obchodovat s burnt blackcoiny, musíte znát následující:\n\nBurnt blackcoiny jsou nevyčerpatelné. Aby je bylo možné obchodovat na Haveno, musí mít výstupní skripty podobu: OP_RETURN OP_PUSHDATA, následované přidruženými datovými bajty, které po hexadecimálním zakódování tvoří adresy. Například Burnt blackcoiny s adresou 666f6f („foo“ v UTF-8) budou mít následující skript:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nPro vytvoření Burnt blackcoinů lze použít příkaz „burn“ RPC, který je k dispozici v některých peněženkách.\n\nPro možné případy použití se můžete podívat na https://ibo.laboratorium.ee.\n\nVzhledem k tomu, že Burnt blackcoiny jsou nevyčerpatelné, nelze je znovu prodat. „Prodej“ Burnt blackcoinů znamená vypalování běžných blackcoinů (s přidruženými údaji rovnými cílové adrese).\n\nV případě sporu musí prodejce BLK poskytnout hash transakce.
+account.crypto.popup.blk-burnt.msg=Chcete-li obchodovat s burnt blackcoiny, musíte znát následující:\n\n\
+Burnt blackcoiny jsou nevyčerpatelné. Aby je bylo možné obchodovat na Haveno, musí mít výstupní skripty podobu: \
+OP_RETURN OP_PUSHDATA, následované přidruženými datovými bajty, které po hexadecimálním zakódování tvoří adresy. \
+Například Burnt blackcoiny s adresou 666f6f (“foo” v UTF-8) budou mít následující skript:\n\n\
+OP_RETURN OP_PUSHDATA 666f6f\n\n\
+Pro vytvoření Burnt blackcoinů lze použít příkaz ”burn” RPC, který je k dispozici v některých peněženkách.\n\n\
+Pro možné případy použití se můžete podívat na https://ibo.laboratorium.ee.\n\n\
+Vzhledem k tomu, že Burnt blackcoiny jsou nevyčerpatelné, nelze je znovu prodat. ”Prodej” \
+Burnt blackcoinů znamená vypalování běžných blackcoinů (s přidruženými údaji rovnými cílové adrese).\n\n\
+V případě sporu musí prodejce BLK poskytnout hash transakce.
# suppress inspection "UnusedProperty"
-account.crypto.popup.liquidbitcoin.msg=Obchodování s L-XMR na Haveno vyžaduje, abyste pochopili následující skutečnosti:\n\nKdyž přijímáte L-XMR za obchod na Haveno, nemůžete použít mobilní peněženku Green od Blockstreamu ani jinou custodial peněženku nebo peněženku na burze. L-XMR musíte přijmout pouze do peněženky Liquid Elements Core nebo do jiné L-XMR peněženky, která vám umožní získat slepý klíč pro vaši slepou adresu L-XMR.\n\nV případě, že je nutné zprostředkování, nebo pokud dojde k obchodnímu sporu, musíte zprostředkujícímu mediátorovi Haveno nebo agentovi, který vrací peníze zaslat slepý klíč pro vaši L-XMR adresu, aby mohli ověřit podrobnosti vaší důvěrné transakce na svém vlastním Elements Core full-nodu.\n\nNeposkytnutí požadovaných informací zprostředkovateli nebo agentovi pro vrácení peněz povede ke prohrání sporu. Ve všech sporných případech nese příjemce L-XMR 100% břemeno odpovědnosti za poskytnutí kryptografického důkazu zprostředkovateli nebo agentovi pro vrácení peněz.\n\nPokud těmto požadavkům nerozumíte, neobchodujte s L-XMR na Haveno.
+account.crypto.popup.liquidmonero.msg=Obchodování s L-XMR na Haveno vyžaduje, abyste rozuměli následujícím skutečnostem.:\n\n\
+Při přijímání L-XMR za obchod na platformě Haveno nemůžete použít mobilní aplikaci Blockstream Green Wallet nebo \
+peněženku custodial/směnárny. L-XMR musíte přijímat pouze do peněženky Liquid Elements Core nebo do jiné \
+L-XMR peněženky, která vám umožní získat zaslepovací(blinding) klíč pro vaši zaslepenou adresu L-XMR.\n\n\
+V případě nutnosti mediace nebo v případě vzniku obchodního sporu je nutné zveřejnit zaslepovací klíč pro \
+vaši přijímající adresu L-XMR mediátorovi Haveno nebo agentovi vrácení financí, aby mohl ověřit detaily \
+vaší důvěrné transakce na vlastním Elements Core full node.\n\n\
+Neposkytnutí požadovaných informací zprostředkovateli nebo agentovi vrácení financí, bude mít za následek ztrátu sporu. \
+Ve všech případech sporu nese příjemce L-XMR 100% břemeno odpovědnosti \
+poskytnutí kryptografického důkazu mediátorovi nebo agentovi pro vrácení financí.\n\n\
+Pokud těmto požadavkům nerozumíte, neobchodujte s L-XMR na Havenu.
account.traditional.yourTraditionalAccounts=Vaše účty v národní měně
@@ -1245,16 +1717,26 @@ account.password.removePw.headline=Odstraňte ochranu peněženky pomocí hesla
account.password.setPw.button=Nastavit heslo
account.password.setPw.headline=Nastavte ochranu peněženky pomocí hesla
account.password.info=S ochranou pomocí hesla budete muset zadat heslo při spuštění aplikace, při výběru monera z vaší peněženky a při zobrazení slov seedu peněženky.
-
account.seed.backup.title=Zálohujte svá klíčová slova peněženky.
-account.seed.info=Prosím, zapište si jak klíčová slova peněženky, tak datum. Kdykoliv můžete obnovit svou peněženku pomocí klíčových slov a data.\n\nKlíčová slova byste měli zapsat na kus papíru. Neukládejte je na počítač.\n\nVezměte prosím na vědomí, že klíčová slova NEJSOU náhradou za zálohu.\nMusíte vytvořit zálohu celého adresáře aplikace z obrazovky "Účet/Záloha", abyste mohli obnovit stav a data aplikace.
-account.seed.backup.warning=Prosím, poznamenejte si, že klíčová slova nejsou náhradou za zálohu.\nMusíte vytvořit zálohu celého adresáře aplikace z obrazovky "Účet/Záloha", abyste mohli obnovit stav a data aplikace.
-account.seed.warn.noPw.msg=Nenastavili jste si heslo k peněžence, které by chránilo zobrazení seed slov.\n\nChcete zobrazit seed slova?
+account.seed.info=Prosím, zapište si jak klíčová slova peněženky, tak datum. Kdykoliv můžete obnovit svou peněženku pomocí klíčových slov a data.\n\nKlíčová slova byste měli zapsat na kus papíru. Neukládejte je na počítač.\n\nVezměte prosím na vědomí, že klíčová slova NEJSOU náhradou za zálohu.\nMusíte vytvořit zálohu celého adresáře aplikace z obrazovky \"Účet/Záloha\", abyste mohli obnovit stav a data aplikace.
+account.seed.backup.warning=Prosím, poznamenejte si, že klíčová slova nejsou náhradou za zálohu.\nMusíte vytvořit zálohu celého adresáře aplikace z obrazovky \"Účet/Záloha\", abyste mohli obnovit stav a data aplikace.
+account.seed.warn.noPw.msg=Nenastavili jste si heslo k peněžence, které by chránilo zobrazení seed slov.\n\n\
+Chcete zobrazit seed slova?
account.seed.warn.noPw.yes=Ano, a už se mě znovu nezeptat
account.seed.enterPw=Chcete-li zobrazit seed slova, zadejte heslo
-account.seed.restore.info=Před použitím obnovení ze seed slov si vytvořte zálohu. Uvědomte si, že obnova peněženky je pouze pro naléhavé případy a může způsobit problémy s interní databází peněženky.\nNení to způsob, jak použít zálohu! K obnovení předchozího stavu aplikace použijte zálohu z adresáře dat aplikace.\n\nPo obnovení se aplikace automaticky vypne. Po restartování aplikace se bude znovu synchronizovat se sítí Monero. To může chvíli trvat a může spotřebovat hodně CPU, zejména pokud byla peněženka starší a měla mnoho transakcí. Vyhněte se přerušování tohoto procesu, jinak budete možná muset znovu odstranit soubor řetězu SPV nebo opakovat proces obnovy.
+account.seed.restore.info=Před použitím obnovení ze seed slov si vytvořte zálohu. Uvědomte si, že obnova peněženky je \
+ pouze pro naléhavé případy a může způsobit problémy s interní databází peněženky.\n\
+ Není to způsob, jak použít zálohu! K obnovení předchozího stavu aplikace \
+ použijte zálohu z adresáře dat aplikace.\n\n\
+ Po obnovení se aplikace automaticky vypne. Po restartování aplikace se bude znovu synchronizovat se sítí Monero. \
+ To může chvíli trvat a může spotřebovat hodně CPU, zejména pokud byla peněženka starší a měla mnoho transakcí. \
+ Vyhněte se přerušování tohoto procesu, jinak budete možná muset \
+ znovu odstranit soubor řetězu SPV nebo opakovat proces obnovy.
account.seed.restore.ok=Dobře, proveďte obnovu a vypněte Haveno
-
+account.keys.clipboard.warning=Upozorňujeme, že soukromé klíče peněženky jsou velmi citlivé finanční údaje.\n\n\
+ ● Nikomu, kdo vás o ně požádá, byste neměli sdělovat své klíče, pokud si nejste naprosto jisti, že mu můžete důvěřovat při nakládání s vašimi penězi! \n\n\
+ ● Data soukromých klíčů byste NEMĚLI kopírovat do schránky, pokud si nejste naprosto jisti, že používáte zabezpečené počítačové prostředí bez rizik malwaru. \n\n\
+ Mnoho lidí tímto způsobem přišlo o své Monero. Pokud máte JAKÉKOLI pochybnosti, okamžitě zavřete tento dialog a vyhledejte pomoc někoho znalého.
####################################################################
# Mobile notifications
@@ -1282,7 +1764,8 @@ account.notifications.priceAlert.low.label=Upozorněte, pokud bude cena XMR pod
account.notifications.priceAlert.setButton=Nastavit upozornění na cenu
account.notifications.priceAlert.removeButton=Odstraňte upozornění na cenu
account.notifications.trade.message.title=Obchodní stav se změnil
-account.notifications.trade.message.msg.conf=Vkladová transakce pro obchod s ID {0} je potvrzena. Otevřete prosím svou aplikaci Haveno a začněte s platbou.
+account.notifications.trade.message.msg.conf=Vkladová transakce pro obchod s ID {0} je potvrzena. \
+ Otevřete prosím svou aplikaci Haveno a začněte s platbou.
account.notifications.trade.message.msg.started=Kupující XMR zahájil platbu za obchod s ID {0}.
account.notifications.trade.message.msg.completed=Obchod s ID {0} je dokončen.
account.notifications.offer.message.title=Vaše nabídka byla přijata
@@ -1296,7 +1779,10 @@ account.notifications.marketAlert.offerType.label=Typ nabídky, o kterou mám z
account.notifications.marketAlert.offerType.buy=Nákupní nabídky (Chci prodat XMR)
account.notifications.marketAlert.offerType.sell=Prodejní nabídky (Chci si koupit XMR)
account.notifications.marketAlert.trigger=Nabídková cenová vzdálenost (%)
-account.notifications.marketAlert.trigger.info=Když je nastavena cenová vzdálenost, obdržíte upozornění pouze v případě, že je zveřejněna nabídka, která splňuje (nebo překračuje) vaše požadavky. Příklad: chcete prodat XMR, ale budete prodávat pouze s 2% přirážkou k aktuální tržní ceně. Nastavení tohoto pole na 2% zajistí, že budete dostávat upozornění pouze na nabídky s cenami, které jsou o 2% (nebo více) nad aktuální tržní cenou.
+account.notifications.marketAlert.trigger.info=Když je nastavena cenová vzdálenost, obdržíte upozornění pouze v případě, \
+že je zveřejněna nabídka, která splňuje (nebo překračuje) vaše požadavky. Příklad: chcete prodat XMR, \
+ale budete prodávat pouze s 2% přirážkou k aktuální tržní ceně. Nastavení tohoto pole na 2% zajistí, \
+že budete dostávat upozornění pouze na nabídky s cenami, které jsou o 2% (nebo více) nad aktuální tržní cenou.
account.notifications.marketAlert.trigger.prompt=Procentní vzdálenost od tržní ceny (např. 2,50%, -0,50% atd.)
account.notifications.marketAlert.addButton=Přidat upozornění na nabídku
account.notifications.marketAlert.manageAlertsButton=Spravovat upozornění na nabídku
@@ -1307,10 +1793,13 @@ account.notifications.marketAlert.manageAlerts.header.offerType=Typ nabídky
account.notifications.marketAlert.message.title=Upozornění na nabídku
account.notifications.marketAlert.message.msg.below=pod
account.notifications.marketAlert.message.msg.above=nad
-account.notifications.marketAlert.message.msg=Do nabídky Haveno byla zveřejněna nová nabídka ''{0} {1}'' s cenou {2} ({3} {4} tržní cena) a způsob platby ''{5}''.\nID nabídky: {6}.
+account.notifications.marketAlert.message.msg=Do Haveno byla zveřejněna nová nabídka ''{0} {1}'' s cenou {2} ({3} {4} tržní cena) a \
+ způsob platby ''{5}''.\n\
+ ID nabídky: {6}.
account.notifications.priceAlert.message.title=Upozornění na cenu pro {0}
account.notifications.priceAlert.message.msg=Vaše upozornění na cenu bylo aktivováno. Aktuální {0} cena je {1} {2}
-account.notifications.noWebCamFound.warning=Nebyla nalezena žádná webkamera.\n\nPoužijte e-mailu k odeslání tokenu a šifrovacího klíče z vašeho mobilního telefonu do aplikace Haveno.
+account.notifications.noWebCamFound.warning=Nebyla nalezena žádná webkamera.\n\n\
+ Použijte e-mailu k odeslání tokenu a šifrovacího klíče z vašeho mobilního telefonu do aplikace Haveno.
account.notifications.priceAlert.warning.highPriceTooLow=Vyšší cena musí být větší než nižší cena.
account.notifications.priceAlert.warning.lowerPriceTooHigh=Nižší cena musí být nižší než vyšší cena.
@@ -1342,10 +1831,14 @@ displayUpdateDownloadWindow.button.downloadLater=Stáhnout později
displayUpdateDownloadWindow.button.ignoreDownload=Ignorovat tuto verzi
displayUpdateDownloadWindow.headline=K dispozici je nová aktualizace Haveno!
displayUpdateDownloadWindow.download.failed.headline=Stahování selhalo
-displayUpdateDownloadWindow.download.failed=Stažení se nezdařilo.\nStáhněte a ručně ověřte na adrese [HYPERLINK:https://haveno.exchange/downloads]
-displayUpdateDownloadWindow.installer.failed=Nelze určit správný instalační program. Stáhněte a ručně ověřte na adrese [HYPERLINK:https://haveno.exchange/downloads]
-displayUpdateDownloadWindow.verify.failed=Ověření se nezdařilo.\nStáhněte a ručně ověřte na adrese [HYPERLINK:https://haveno.exchange/downloads]
-displayUpdateDownloadWindow.success=Nová verze byla úspěšně stažena a podpis ověřen.\n\nOtevřete adresář ke stažení, vypněte aplikaci a nainstalujte novou verzi.
+displayUpdateDownloadWindow.download.failed=Stažení se nezdařilo.\n\
+ Stáhněte a ručně ověřte na adrese [HYPERLINK:https://haveno.exchange/downloads]
+displayUpdateDownloadWindow.installer.failed=Nelze určit správný instalační program. Stáhněte a ručně ověřte na adrese \
+ [HYPERLINK:https://haveno.exchange/downloads]
+displayUpdateDownloadWindow.verify.failed=Ověření se nezdařilo.\n\
+ Stáhněte a ručně ověřte na adrese [HYPERLINK:https://haveno.exchange/downloads]
+displayUpdateDownloadWindow.success=Nová verze byla úspěšně stažena a podpis ověřen.\n\n\
+ Otevřete adresář ke stažení, vypněte aplikaci a nainstalujte novou verzi.
displayUpdateDownloadWindow.download.openDir=Otevřít adresář ke stažení
disputeSummaryWindow.title=Souhrn
@@ -1361,7 +1854,7 @@ disputeSummaryWindow.payoutAmount.invert=Poražený ve sporu odesílá transakci
disputeSummaryWindow.reason=Důvod sporu
disputeSummaryWindow.tradePeriodEnd=Konec obchodního období
disputeSummaryWindow.extraInfo=Detailní informace
-disputeSummaryWindow.delayedPayoutStatus=Delayed Payout Status
+disputeSummaryWindow.delayedPayoutStatus=Stav zpožděné transakce
# dynamic values are not recognized by IntelliJ
# suppress inspection "UnusedProperty"
@@ -1395,26 +1888,47 @@ disputeSummaryWindow.close.button=Zavřít úkol
# Do no change any line break or order of tokens as the structure is used for signature verification
# suppress inspection "TrailingSpacesInProperty"
-disputeSummaryWindow.close.msg=Ticket uzavřen {0}\n{1} adresa uzlu: {2}\n\nSouhrn:\nObchodní ID: {3}\nMěna: {4}\nVýše obchodu: {5}\nVýplatní částka pro kupujícího XMR: {6}\nVýplatní částka pro prodejce XMR: {7}\n\nDůvod sporu: {8}\n\nSouhrnné poznámky:\n{9}\n
+disputeSummaryWindow.close.msg=Úkol uzavřen {0}\n\
+ {1} adresa uzlu: {2}\n\n\
+ Souhrn:\n\
+ Obchodní ID: {3}\n\
+ Měna: {4}\n\
+ Důvod sporu: {5}\n\n\
+ Výše obchodu: {6}\n\
+ Výplatní částka pro kupujícího XMR: {7}\n\
+ Výplatní částka pro prodejce XMR: {8}\n\n\
+ Souhrnné poznámky:\n{9}\n
# Do no change any line break or order of tokens as the structure is used for signature verification
disputeSummaryWindow.close.msgWithSig={0}{1}{2}{3}
-disputeSummaryWindow.close.nextStepsForMediation=\nDalší kroky:\nOtevřete obchod a přijměte nebo odmítněte návrhy od mediátora
-disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nDalší kroky:\nNevyžadují se od vás žádné další kroky. Pokud rozhodce rozhodl ve váš prospěch, v sekci Prostředky/Transakce se zobrazí transakce „Vrácení peněz z rozhodčího řízení“
-disputeSummaryWindow.close.closePeer=Potřebujete také zavřít ticket obchodního partnera!
+disputeSummaryWindow.close.nextStepsForMediation=\nDalší kroky:\n\
+Otevřete obchod a přijměte nebo odmítněte návrhy od mediátora
+disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nDalší kroky:\n\
+Nevyžadují se od vás žádné další kroky. Pokud rozhodce rozhodl ve váš prospěch, v sekci Prostředky/Transakce se zobrazí transakce 'Vrácení peněz z rozhodčího řízení'
+disputeSummaryWindow.close.closePeer=Potřebujete také zavřít žádost obchodního partnera!
disputeSummaryWindow.close.txDetails.headline=Zveřejněte transakci vrácení peněz
# suppress inspection "TrailingSpacesInProperty"
disputeSummaryWindow.close.txDetails.buyer=Kupující obdrží {0} na adresu: {1}\n
# suppress inspection "TrailingSpacesInProperty"
disputeSummaryWindow.close.txDetails.seller=Prodejce obdrží {0} na adresu: {1}\n
-disputeSummaryWindow.close.txDetails=Výdaje: {0}\n{1} {2} Transakční poplatek: {3}\n\nOpravdu chcete tuto transakci zveřejnit?
+disputeSummaryWindow.close.txDetails=Výdaje: {0}\n\
+ {1} {2}\
+ Transakční poplatek: {3}\n\n\
+ Opravdu chcete tuto transakci zveřejnit?
disputeSummaryWindow.close.noPayout.headline=Uzavřít bez jakékoli výplaty
disputeSummaryWindow.close.noPayout.text=Chcete zavřít bez výplaty?
+disputeSummaryWindow.close.alreadyPaid.headline=Výplata již proběhla
+disputeSummaryWindow.close.alreadyPaid.text=Restartujte klienta pro provedení další výplaty u tohoto sporu
+
emptyWalletWindow.headline={0} nouzový nástroj peněženky
-emptyWalletWindow.info=Použijte jej pouze v naléhavých případech, pokud nemůžete získat přístup k vašim prostředkům z uživatelského rozhraní.\n\nUpozorňujeme, že při použití tohoto nástroje budou všechny otevřené nabídky automaticky uzavřeny.\n\nPřed použitím tohoto nástroje si prosím zálohujte datový adresář. Můžete to udělat na obrazovce \"Účet/Záloha\".\n\nNahlaste nám svůj problém a nahlaste zprávu o chybě na GitHubu nebo na fóru Haveno, abychom mohli prozkoumat, co způsobilo problém.
+emptyWalletWindow.info=Použijte jej pouze v naléhavých případech, pokud nemůžete získat přístup k vašim prostředkům z uživatelského rozhraní.\n\n\
+Upozorňujeme, že při použití tohoto nástroje budou všechny otevřené nabídky automaticky uzavřeny.\n\n\
+Před použitím tohoto nástroje si prosím zálohujte datový adresář. \
+Můžete to udělat na obrazovce \"Účet/Záloha\".\n\n\
+Nahlaste nám svůj problém a nahlaste nám chybu na GitHubu nebo na fóru Haveno, abychom mohli prozkoumat, co způsobilo problém.
emptyWalletWindow.balance=Váš zůstatek v peněžence
emptyWalletWindow.address=Vaše cílová adresa
emptyWalletWindow.button=Pošlete všechny prostředky
@@ -1427,12 +1941,12 @@ enterPrivKeyWindow.headline=Zadejte soukromý klíč pro registraci
filterWindow.headline=Upravit seznam filtrů
filterWindow.offers=Filtrované nabídky (oddělené čárkami)
filterWindow.onions=Onion adresy vyloučené z obchodování (oddělené čárkami)
-filterWindow.bannedFromNetwork=Onion adresy vyloučené ze síťové komunikace (oddělené čárkami)
+filterWindow.bannedFromNetwork=Onion adresy blokované ze síťové komunikace (oddělené čárkami)
filterWindow.accounts=Filtrovaná data obchodního účtu:\nFormát: seznam [ID platební metody | datové pole | hodnota] oddělený čárkami
-filterWindow.bannedCurrencies=Filtrované kódy měn (oddělené čárkami)
-filterWindow.bannedPaymentMethods=ID filtrované platební metody (oddělené čárkami)
-filterWindow.bannedAccountWitnessSignerPubKeys=Filtrované veřejné klíče účtů podepisujícího svědka (hex nebo pub klíče oddělené čárkou)
-filterWindow.bannedPrivilegedDevPubKeys=Filtrované privilegované klíče pub dev (hex nebo pub klíče oddělené čárkou)
+filterWindow.bannedCurrencies=Blokované kódy měn (oddělené čárkami)
+filterWindow.bannedPaymentMethods=ID blokované platební metody (oddělené čárkami)
+filterWindow.bannedAccountWitnessSignerPubKeys=Blokované veřejné klíče účtů podepisujícího svědka (hex nebo pub klíče oddělené čárkou)
+filterWindow.bannedPrivilegedDevPubKeys=Blokované privilegované klíče pub dev (hex nebo pub klíče oddělené čárkou)
filterWindow.arbitrators=Filtrovaní rozhodci (onion adresy oddělené čárkami)
filterWindow.mediators=Filtrovaní mediátoři (onion adresy oddělené čárkami)
filterWindow.refundAgents=Filtrovaní rozhodci pro vrácení peněz (onion adresy oddělené čárkami)
@@ -1453,24 +1967,33 @@ offerDetailsWindow.minXmrAmount=Min. částka XMR
offerDetailsWindow.min=(min. {0})
offerDetailsWindow.distance=(vzdálenost od tržní ceny: {0})
offerDetailsWindow.myTradingAccount=Můj obchodní účet
-offerDetailsWindow.offererBankId=(ID banky/BIC/SWIFT tvůrce)
-offerDetailsWindow.offerersBankName=(název banky tvůrce)
offerDetailsWindow.bankId=ID banky (např. BIC nebo SWIFT)
offerDetailsWindow.countryBank=Země původu banky tvůrce
offerDetailsWindow.commitment=Závazek
offerDetailsWindow.agree=Souhlasím
offerDetailsWindow.tac=Pravidla a podmínky
-offerDetailsWindow.confirm.maker=Potvrďte: Umístit nabídku {0} monero
-offerDetailsWindow.confirm.taker=Potvrďte: Využít nabídku {0} monero
+offerDetailsWindow.confirm.maker=Potvrďte: Přidat nabídku {0} monero
+offerDetailsWindow.confirm.makerCrypto=Potvrďte: Přidat nabídku do {0} {1}
+offerDetailsWindow.confirm.taker=Potvrďte: Přijmout nabídku {0} monero
+offerDetailsWindow.confirm.takerCrypto=Potvrďte: Přijmout nabídku {0} {1}
offerDetailsWindow.creationDate=Datum vzniku
offerDetailsWindow.makersOnion=Onion adresa tvůrce
+offerDetailsWindow.challenge=Passphrase nabídky
qRCodeWindow.headline=QR Kód
qRCodeWindow.msg=Použijte tento QR kód k financování vaší peněženky Haveno z vaší externí peněženky.
qRCodeWindow.request=Žádost o platbu:\n{0}
selectDepositTxWindow.headline=Vyberte vkladovou transakci ke sporu
-selectDepositTxWindow.msg=Vkladová transakce nebyla v obchodě uložena.\nVyberte prosím jednu z existujících multisig transakcí z vaší peněženky, která byla vkladovou transakcí použitou při selhání obchodu.\n\nSprávnou transakci najdete tak, že otevřete okno s podrobnostmi o obchodu (klikněte na ID obchodu v seznamu) a sledujete výstup transakce s platebním poplatkem za obchodní transakci k následující transakci, kde uvidíte transakci s multisig vklady (adresa začíná na 3). Toto ID transakce by mělo být viditelné v seznamu zde prezentovaném. Jakmile najdete správnou transakci, vyberte ji a pokračujte.\n\nOmlouváme se za nepříjemnosti, ale tento případ chyby by se měl stát velmi zřídka a v budoucnu se pokusíme najít lepší způsoby, jak jej vyřešit.
+selectDepositTxWindow.msg=Vkladová transakce nebyla v obchodě uložena.\n\
+Vyberte prosím jednu z existujících multisig transakcí z vaší peněženky, která byla \
+vkladovou transakcí použitou při selhání obchodu.\n\n\
+Správnou transakci najdete tak, že otevřete okno s podrobnostmi o obchodu (klikněte na ID obchodu v seznamu)\
+ a sledujete výstup transakce s platebním poplatkem za obchodní transakci k následující transakci, \
+kde uvidíte multisig vkladovou transakci (adresa začíná na 3). Toto ID transakce by mělo být \
+viditelné v seznamu zde prezentovaném. Jakmile najdete správnou transakci, vyberte ji a pokračujte.\n\n\
+Omlouváme se za nepříjemnosti, ale tento případ chyby by se měl stát velmi zřídka \
+a v budoucnu se pokusíme najít lepší způsoby, jak jej vyřešit.
selectDepositTxWindow.select=Vyberte vkladovou transakci
sendAlertMessageWindow.headline=Odeslat globální oznámení
@@ -1501,15 +2024,16 @@ setXMRTxKeyWindow.txKey=Transakční klíč (volitelný)
tacWindow.headline=Uživatelská dohoda
tacWindow.agree=Souhlasím
tacWindow.disagree=Nesouhlasím a odcházím
-tacWindow.arbitrationSystem=Řešení sporů
+tacWindow.arbitrationSystem=Rozhodnutí sporu
tradeDetailsWindow.headline=Obchod
-tradeDetailsWindow.disputedPayoutTxId=ID sporné platební transakce:
+tradeDetailsWindow.disputedPayoutTxId=ID sporné platební transakce
tradeDetailsWindow.tradeDate=Datum obchodu
tradeDetailsWindow.txFee=Poplatek za těžbu
tradeDetailsWindow.tradePeersOnion=Onion adresa obchodního partnera
tradeDetailsWindow.tradePeersPubKeyHash=Pubkey hash obchodních partnerů
tradeDetailsWindow.tradeState=Stav obchodu
+tradeDetailsWindow.tradePhase=Fáze obchodu
tradeDetailsWindow.agentAddresses=Rozhodce/Mediátor
tradeDetailsWindow.detailData=Detailní data
@@ -1519,6 +2043,7 @@ txDetailsWindow.xmr.noteReceived=Obdrželi jste XMR.
txDetailsWindow.sentTo=Odesláno na
txDetailsWindow.receivedWith=Přijato s
txDetailsWindow.txId=TxId
+txDetailsWindow.txKey=Klíč transakce
closedTradesSummaryWindow.headline=Souhrn uzavřených obchodů
closedTradesSummaryWindow.totalAmount.title=Celkový objem obchodů
@@ -1530,6 +2055,9 @@ closedTradesSummaryWindow.totalTradeFeeInXmr.title=Suma obchodních poplatků v
closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} z celkového objemu obchodů)
walletPasswordWindow.headline=Pro odemknutí zadejte heslo
+connectionFallback.headline=Chyba připojení
+connectionFallback.msg=Chyba při připojování k vlastním uzlům Monero.\n\nChcete vyzkoušet další nejlepší dostupný uzel Monero?
+
torNetworkSettingWindow.header=Nastavení sítě Tor
torNetworkSettingWindow.noBridges=Nepoužívat most (bridge)
torNetworkSettingWindow.providedBridges=Spojte se s poskytnutými mosty (bridges)
@@ -1549,11 +2077,10 @@ torNetworkSettingWindow.deleteFiles.button=Odstranit zastaralé soubory Tor a vy
torNetworkSettingWindow.deleteFiles.progress=Probíhá vypínání sítě Tor
torNetworkSettingWindow.deleteFiles.success=Zastaralé soubory Tor byly úspěšně odstraněny. Prosím restartujte aplikaci.
torNetworkSettingWindow.bridges.header=Je Tor blokovaný?
-torNetworkSettingWindow.bridges.info=Pokud je Tor zablokován vaším internetovým poskytovatelem nebo vaší zemí, můžete zkusit použít Tor mosty (bridges).\nNavštivte webovou stránku Tor na adrese: https://bridges.torproject.org/bridges, kde se dozvíte více o mostech a připojitelných přepravách.
+torNetworkSettingWindow.bridges.info=Pokud je Tor zablokován vaším internetovým poskytovatelem nebo vaší zemí, můžete zkusit použít Tor mosty (bridges).\n\
+Navštivte webovou stránku Tor na adrese: https://bridges.torproject.org/bridges, \
+kde se dozvíte více o mostech a pluggable transports.
-feeOptionWindow.headline=Vyberte měnu pro platbu obchodního poplatku
-feeOptionWindow.info=Můžete si vybrat, zda chcete zaplatit obchodní poplatek v BSQ nebo v XMR. Pokud zvolíte BSQ, oceníte zlevněný obchodní poplatek.
-feeOptionWindow.optionsLabel=Vyberte měnu pro platbu obchodního poplatku
feeOptionWindow.useXMR=Použít XMR
feeOptionWindow.fee={0} (≈ {1})
feeOptionWindow.xmrFeeWithFiatAndPercentage={0} (≈ {1} / {2})
@@ -1577,23 +2104,39 @@ popup.headline.error=Chyba
popup.doNotShowAgain=Znovu nezobrazovat
popup.reportError.log=Otevřít log
popup.reportError.gitHub=Nahlaste problém na GitHub
-popup.reportError={0}\n\nChcete-li nám pomoci vylepšit software, nahlaste tuto chybu otevřením nového problému na adrese https://github.com/bisq-network/bisq/issues.\nVýše uvedená chybová zpráva bude zkopírována do schránky po kliknutí na některé z níže uvedených tlačítek.\nUsnadníte ladění, pokud zahrnete soubor haveno.log stisknutím tlačítka „Otevřít log soubor“, uložením kopie a připojením ke zprávě o chybě.
+popup.reportError={0}\n\nChcete-li nám pomoci vylepšit software, nahlaste tuto chybu otevřením nového problému na adrese https://github.com/haveno-dex/haveno/issues.\n\
+Výše uvedená chybová zpráva bude zkopírována do schránky po kliknutí na některé z níže uvedených tlačítek.\n\
+Usnadníte ladění, pokud zahrnete soubor haveno.log stisknutím tlačítka 'Otevřít log soubor', uložením kopie a připojením ke hlášení chyby.
popup.error.tryRestart=Zkuste prosím restartovat aplikaci a zkontrolovat síťové připojení, abyste zjistili, zda můžete problém vyřešit.
popup.error.takeOfferRequestFailed=Když se někdo pokusil využít jednu z vašich nabídek, došlo k chybě:\n{0}
error.spvFileCorrupted=Při čtení řetězce SPV došlo k chybě.\nJe možné, že je poškozen řetězový soubor SPV.\n\nChybová zpráva: {0}\n\nChcete ji smazat a začít znovu synchronizovat?
error.deleteAddressEntryListFailed=Soubor AddressEntryList nelze smazat.\nChyba: {0}
-error.closedTradeWithUnconfirmedDepositTx=Vkladová transakce uzavřeného obchodu s obchodním ID {0} je stále nepotvrzená.\n\nProveďte prosím SPV resynchronizaci v \"Nastavení/Informace o síti\" a zkontrolujte, zda je transakce platná.
-error.closedTradeWithNoDepositTx=Vkladová transakce uzavřeného obchodu s obchodním ID {0} je nulová.\n\nChcete-li vyčistit seznam uzavřených obchodů, restartujte aplikaci.
+error.closedTradeWithUnconfirmedDepositTx=Vkladová transakce uzavřeného obchodu s obchodním ID {0} je stále \
+ nepotvrzená.\n\n\
+ Proveďte prosím SPV resynchronizaci v \"Nastavení/Informace o síti\" a zkontrolujte, zda je transakce platná.
+error.closedTradeWithNoDepositTx=Vkladová transakce uzavřeného obchodu s obchodním ID {0} je nulová.\n\n\
+ Chcete-li vyčistit seznam uzavřených obchodů, restartujte aplikaci.
popup.warning.walletNotInitialized=Peněženka ještě není inicializována
-popup.warning.osxKeyLoggerWarning=V souladu s přísnějšími bezpečnostními opatřeními v systému macOS 10.14 a novějších způsobí spuštění aplikace Java (Haveno používá Javu) upozornění na vyskakovací okno v systému MacOS („Haveno by chtěl přijímat stisknutí kláves z jakékoli aplikace“).\n\nChcete-li se tomuto problému vyhnout, otevřete své Nastavení macOS a přejděte do části "Zabezpečení a soukromí" -> "Soukromí" -> "Sledování vstupu" a ze seznamu na pravé straně odeberte „Haveno“.\n\nHaveno upgraduje na novější verzi Java, aby se tomuto problému vyhnul, jakmile budou vyřešena technická omezení (balíček Java Packager pro požadovanou verzi Java ještě není dodán).
-popup.warning.wrongVersion=Pravděpodobně máte nesprávnou verzi Haveno pro tento počítač.\nArchitektura vašeho počítače je: {0}.\nBinární kód Haveno, který jste nainstalovali, je: {1}.\nVypněte prosím a znovu nainstalujte správnou verzi ({2}).
-popup.warning.incompatibleDB=Zjistili jsme nekompatibilní soubory databáze!\n\nTyto databázové soubory nejsou kompatibilní s naší aktuální kódovou základnou:\n{0}\n\nVytvořili jsme zálohu poškozených souborů a aplikovali jsme výchozí hodnoty na novou verzi databáze.\n\nZáloha se nachází na adrese:\n{1}/db/backup_of_corrupted_data.\n\nZkontrolujte, zda máte nainstalovanou nejnovější verzi Haveno.\nMůžete si jej stáhnout na adrese: [HYPERLINK:https://haveno.exchange/downloads].\n\nRestartujte aplikaci.
-popup.warning.startupFailed.twoInstances=Haveno již běží. Nemůžete spustit dvě instance Haveno.
+popup.warning.wrongVersion=Pravděpodobně máte nesprávnou verzi Haveno pro tento počítač.\n\
+Architektura vašeho počítače je: {0}.\n\
+Binární kód Haveno, který jste nainstalovali, je: {1}.\n\
+Vypněte prosím a znovu nainstalujte správnou verzi ({2}).
+popup.warning.incompatibleDB=Zjistili jsme nekompatibilní soubory databáze!\n\n\
+Tyto databázové soubory nejsou kompatibilní s naší aktuální kódovou základnou:\n{0}\n\n\
+Vytvořili jsme zálohu poškozených souborů a aplikovali jsme výchozí hodnoty na novou verzi databáze.\n\n\
+Záloha se nachází na adrese:\n\
+{1}/db/backup_of_corrupted_data.\n\n\
+Zkontrolujte, zda máte nainstalovanou nejnovější verzi Haveno.\n\
+Můžete si jej stáhnout na adrese: [HYPERLINK:https://haveno.exchange/downloads].\n\n\
+Restartujte prosím aplikaci.
+popup.warning.startupFailed.twoInstances=Haveno již běží. Nemůžete mít spuštěné dvě instance Haveno.
popup.warning.tradePeriod.halfReached=Váš obchod s ID {0} dosáhl poloviny max. povoleného obchodního období a stále není dokončen.\n\nObdobí obchodování končí {1}\n\nDalší informace o stavu obchodu naleznete na adrese \"Portfolio/Otevřené obchody\".
-popup.warning.tradePeriod.ended=Váš obchod s ID {0} dosáhl max. povoleného obchodního období a není dokončen.\n\nObdobí obchodování skončilo {1}\n\nZkontrolujte prosím svůj obchod v sekci "Portfolio/Otevřené obchody\", abyste kontaktovali mediátora.
+popup.warning.tradePeriod.ended=Váš obchod s ID {0} dosáhl max. povoleného obchodního období a není dokončen.\n\n\
+ Období obchodování skončilo {1}\n\n\
+ Zkontrolujte prosím svůj obchod v sekci "Portfolio/Otevřené obchody\", abyste kontaktovali mediátora.
popup.warning.noTradingAccountSetup.headline=Nemáte nastaven obchodní účet
popup.warning.noTradingAccountSetup.msg=Než budete moci vytvořit nabídku, musíte si nastavit národní měnu nebo kryptoměnový účet.\nChcete si založit účet?
popup.warning.noArbitratorsAvailable=Nejsou k dispozici žádní rozhodci.
@@ -1608,48 +2151,94 @@ popup.warning.examplePercentageValue=Zadejte procento jako číslo \"5.4\" pro 5
popup.warning.noPriceFeedAvailable=Pro tuto měnu není k dispozici žádný zdroj cen. Nelze použít procentuální cenu.\nVyberte pevnou cenu.
popup.warning.sendMsgFailed=Odeslání zprávy vašemu obchodnímu partnerovi se nezdařilo.\nZkuste to prosím znovu a pokud to i nadále selže, nahlaste chybu.
popup.warning.messageTooLong=Vaše zpráva překračuje max. povolená velikost. Zašlete jej prosím v několika částech nebo ji nahrajte do služby, jako je https://pastebin.com.
-popup.warning.lockedUpFunds=Zamkli jste finanční prostředky z neúspěšného obchodu.\nUzamčený zůstatek: {0}\nVkladová tx adresa: {1}\nObchodní ID: {2}.\n\nOtevřete prosím úkol pro podporu výběrem obchodu na obrazovce otevřených obchodů a stisknutím \"alt + o\" nebo \"option + o\"."
+popup.warning.lockedUpFunds=Zamkli jste finanční prostředky z neúspěšného obchodu.\n\
+ Uzamčený zůstatek: {0}\n\
+ Adresa vkladové tx: {1}\n\
+ ID obchodu: {2}.\n\n\
+ Otevřete prosím úkol pro podporu výběrem obchodu na obrazovce otevřených obchodů a stisknutím \"alt + o\" nebo \"option + o\"."
-popup.warning.makerTxInvalid=Tato nabídka není platná. Prosím vyberte jinou nabídku.\n\n
+popup.warning.makerTxInvalid=Tato nabídka není platná. Prosím vyberte jinou nabídku.\n\n
takeOffer.cancelButton=Zrušit akceptaci nabídky
takeOffer.warningButton=Ignorovat a přesto pokračovat
# suppress inspection "UnusedProperty"
-popup.warning.nodeBanned=Jeden z {0} uzlů byl zabanován.
+popup.warning.nodeBanned=Jeden z {0} uzlů byl zablokován.
# suppress inspection "UnusedProperty"
popup.warning.priceRelay=cenové relé
popup.warning.seed=seed
-popup.warning.mandatoryUpdate.trading=Aktualizujte prosím na nejnovější verzi Haveno. Byla vydána povinná aktualizace, která zakazuje obchodování se starými verzemi. Další informace naleznete na fóru Haveno.
-popup.warning.burnXMR=Tato transakce není možná, protože poplatky za těžbu {0} by přesáhly částku převodu {1}. Počkejte prosím, dokud nebudou poplatky za těžbu opět nízké nebo dokud nenahromadíte více XMR k převodu.
+popup.warning.mandatoryUpdate.trading=Aktualizujte prosím na nejnovější verzi Haveno. \
+ Byla vydána povinná aktualizace, která zakazuje obchodování se starými verzemi. \
+ Další informace naleznete na fóru Haveno.
+popup.warning.noFilter=Nepřijali jsme objekt filtru od seedových uzlů. Prosím informujte správce sítě, aby zaregistrovali objekt filtru.
+popup.warning.burnXMR=Tato transakce není možná, protože poplatky za těžbu {0} by přesáhly částku převodu {1}. \
+ Počkejte prosím, dokud nebudou poplatky za těžbu opět nízké nebo dokud nenahromadíte více XMR k převodu.
-popup.warning.openOffer.makerFeeTxRejected=Transakční poplatek tvůrce za nabídku s ID {0} byl odmítnut sítí Monero.\nID transakce = {1}.\nNabídka byla odstraněna, aby se předešlo dalším problémům.\nPřejděte do \"Nastavení/Informace o síti\" a proveďte synchronizaci SPV.\nPro další pomoc prosím kontaktujte podpůrný kanál v Haveno Keybase týmu.
+popup.warning.openOffer.makerFeeTxRejected=Transakční poplatek tvůrce za nabídku s ID {0} byl odmítnut sítí Monero.\n\
+ ID transakce = {1}.\n\
+ Nabídka byla odstraněna, aby se předešlo dalším problémům.\n\
+ Přejděte do \"Nastavení/Informace o síti\" a proveďte synchronizaci SPV.\n\
+ Pro další pomoc prosím kontaktujte podpůrný kanál v Haveno Keybase týmu.
popup.warning.trade.txRejected.tradeFee=obchodní poplatek
popup.warning.trade.txRejected.deposit=vklad
-popup.warning.trade.txRejected=Síť Monero odmítla {0} transakci pro obchod s ID {1}.\nID transakce = {2}\nObchod byl přesunut do neúspěšných obchodů.\nPřejděte do části \"Nastavení/Informace o síti\" a proveďte synchronizaci SPV.\nPro další pomoc prosím kontaktujte podpůrný kanál v Haveno Keybase týmu.
+popup.warning.trade.txRejected=Síť Monero odmítla {0} transakci pro obchod s ID {1}.\n\
+ ID transakce = {2}\n\
+ Obchod byl přesunut do neúspěšných obchodů.\n\
+ Přejděte do části \"Nastavení/Informace o síti\" a proveďte synchronizaci SPV.\n\
+ Pro další pomoc prosím kontaktujte podpůrný kanál v Haveno Keybase týmu.
-popup.warning.openOfferWithInvalidMakerFeeTx=Transakční poplatek tvůrce za nabídku s ID {0} je neplatný.\nID transakce = {1}.\nPřejděte do \"Nastavení/Informace o síti\" a proveďte synchronizaci SPV.\nPro další pomoc prosím kontaktujte podpůrný kanál v Haveno Keybase týmu.
+popup.warning.openOfferWithInvalidMakerFeeTx=Transakční poplatek tvůrce za nabídku s ID {0} je neplatný.\n\
+ ID transakce = {1}.\n\
+ Přejděte do \"Nastavení/Informace o síti\" a proveďte synchronizaci SPV.\n\
+ Pro další pomoc prosím kontaktujte podpůrný kanál v Haveno Keybase týmu.
-popup.info.securityDepositInfo=Aby oba obchodníci dodržovali obchodní protokol, musí oba obchodníci zaplatit kauci.\n\nTento vklad je uložen ve vaší obchodní peněžence, dokud nebude váš obchod úspěšně dokončen a poté vám bude vrácen.\n\nPoznámka: Pokud vytváříte novou nabídku, musí program Haveno běžet, aby ji převzal jiný obchodník. Chcete-li zachovat své nabídky online, udržujte Haveno spuštěný a ujistěte se, že tento počítač zůstává online (tj. Zkontrolujte, zda se nepřepne do pohotovostního režimu...pohotovostní režim monitoru je v pořádku).
-
-popup.info.cashDepositInfo=Ujistěte se, že ve své oblasti máte pobočku banky, abyste mohli provést hotovostní vklad.\nID banky prodávajícího (BIC/SWIFT) je: {0}.
+popup.info.cashDepositInfo=Ujistěte se, že ve své oblasti máte pobočku banky, abyste mohli provést hotovostní vklad.\n\
+ ID banky prodávajícího (BIC/SWIFT) je: {0}.
popup.info.cashDepositInfo.confirm=Potvrzuji, že mohu provést vklad
-popup.info.shutDownWithOpenOffers=Haveno se vypíná, ale existují otevřené nabídky.\n\nTyto nabídky nebudou dostupné v síti P2P, pokud bude Haveno vypnutý, ale budou znovu publikovány do sítě P2P při příštím spuštění Haveno.\n\nChcete-li zachovat své nabídky online, udržujte Haveno spuštěný a ujistěte se, že tento počítač zůstává online (tj. Ujistěte se, že nepřejde do pohotovostního režimu...pohotovostní režim monitoru není problém).
-popup.info.qubesOSSetupInfo=Zdá se, že používáte Haveno na Qubes OS.\n\nUjistěte se, že je vaše Haveno qube nastaveno podle našeho průvodce nastavením na [HYPERLINK:https://haveno.exchange/wiki/Running_Haveno_on_Qubes].
+popup.info.shutDownWithOpenOffers=Haveno se vypíná, ale existují otevřené nabídky.\n\n\
+ Tyto nabídky nebudou dostupné v síti P2P, pokud bude Haveno vypnutý, ale budou znovu \
+ zveřejněny do sítě P2P při příštím spuštění Haveno. Chcete-li zachovat své nabídky \
+ online, udržujte Haveno spuštěné a připojení k internetu (ujistěte se, že počítač \
+nepřejde do pohotovostního režimu... pohotovostní režim monitoru není problém).
+popup.info.shutDownWithTradeInit={0}\n\
+ Tento obchod se ještě neinicializoval; jeho ukončení by pravděpodobně vedlo k jeho poškození. Počkejte prosím minutu a zkuste to znovu.
+popup.info.shutDownWithDisputeInit=Služba Haveno se vypíná, ale stále je zde čekající zpráva systému sporu.\n\
+ Před vypnutím prosím počkejte minutu.
+popup.info.shutDownQuery=Jste si jisti, že chcete opustit Haveno?
+popup.info.qubesOSSetupInfo=Zdá se, že používáte Haveno na Qubes OS.\n\n\
+ Ujistěte se, že je vaše Haveno qube nastaveno podle našeho průvodce nastavením na [HYPERLINK:https://haveno.exchange/wiki/Running_Haveno_on_Qubes].
+popup.info.p2pStatusIndicator.red={0}\n\n\
+ Váš uzel není připojen k síti P2P. V tomto stavu nemůže Haveno fungovat.
+popup.info.p2pStatusIndicator.yellow={0}\n\n\
+ Váš uzel nemá žádná příchozí připojení Tor. Haveno bude fungovat v pořádku, ale pokud tento stav přetrvává několik hodin, může to znamenat problémy s připojením.
+popup.info.p2pStatusIndicator.green={0}\n\n\
+ Dobrá zpráva, stav vašeho připojení P2P vypadá zdravě!
+popup.info.firewallSetupInfo=Zdá se, že tento počítač blokuje příchozí připojení Tor. \
+ K tomu může dojít v prostředích virtuálních počítačů, jako je Qubes/VirtualBox/Whonix. \n\n\
+ Nastavte prosím své prostředí tak, aby přijímalo příchozí připojení Tor, jinak vaše nabídky nebude moci nikdo přijmout.
popup.warn.downGradePrevention=Downgrade z verze {0} na verzi {1} není podporován. Použijte prosím nejnovější verzi Haveno.
+popup.warn.daoRequiresRestart=Vyskytl se problém se synchronizací stavu DAO. Pro odstranění problému je nutné restartovat aplikaci.
popup.privateNotification.headline=Důležité soukromé oznámení!
-popup.securityRecommendation.headline=Důležité bezpečnostní doporučení
-popup.securityRecommendation.msg=Chtěli bychom vám připomenout, abyste zvážili použití ochrany heslem pro vaši peněženku, pokud jste ji již neaktivovali.\n\nDůrazně se také doporučuje zapsat seed slova peněženky. Tato seed slova jsou jako hlavní heslo pro obnovení vaší peněženky Monero.\nV sekci "Seed peněženky" naleznete další informace.\n\nDále byste měli zálohovat úplnou složku dat aplikace v sekci \"Záloha\".
-
-popup.xmrLocalNode.msg=Haveno zjistil, že na tomto stroji (na localhostu) běží Monero uzel.\n\nUjistěte se, prosím, že tento uzel je plně synchronizován před spuštěním Havena.
-
+popup.xmrLocalNode.msg=Haveno zjistil, že na tomto stroji (na localhostu) běží Monero uzel.\n\n\Prosím ujistěte se, že tento uzel je plně synchronizován před spuštěním Havena.
popup.shutDownInProgress.headline=Probíhá vypínání
popup.shutDownInProgress.msg=Vypnutí aplikace může trvat několik sekund.\nProsím, nepřerušujte tento proces.
-popup.attention.forTradeWithId=Je třeba věnovat pozornost obchodu s ID {0}
-popup.attention.reasonForPaymentRuleChange=Verze 1.5.5 přináší zásadní změnu v pravidlech obchodování ohledně \"důvodu platby\" v bankovních převodech. Prosím nechte toto pole prázdné -- ID obchodu již v poli \"důvod platby\" NEPOUŽÍVEJTE.
+popup.attention.forTradeWithId=Je třeba věnovat pozornost obchodu ID {0}
+popup.attention.welcome.stagenet=Vítejte v testovací instanci Haveno!\n\n\
+Tato platforma umožňuje testovat protokol Haveno. Ujistěte se, že postupujete podle pokynů [HYPERLINK:https://github.com/haveno-dex/haveno/blob/master/docs/installing.md].\n\n\
+Pokud narazíte na nějaký problém, dejte nám prosím vědět [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].\n\n\
+Jedná se o testovací instanci. Nepoužívejte skutečné peníze!
+popup.attention.welcome.mainnet=Vítejte v Haveno!\n\n\
+Tato platforma umožňuje decentralizovaně obchodovat s měnou Monero za fiat měny nebo jiné kryptoměny.\n\n\
+Začněte tím, že si vytvoříte nový platební účet a poté vytvoříte nebo přijmete nabídku.\n\n\
+Pokud narazíte na nějaký problém, dejte nám prosím vědět [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].
+popup.attention.welcome.mainnet.test=Vítejte v Haveno!\n\n\
+Tato platforma umožňuje decentralizovaně obchodovat s měnou Monero za fiat měny nebo jiné kryptoměny.\n\n\
+Začněte tím, že si vytvoříte nový platební účet a poté vytvoříte nebo přijmete nabídku.\n\n\
+Pokud narazíte na nějaký problém, dejte nám prosím vědět [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].\n\n\
+Systém Haveno byl nedávno uvolněn k veřejnému testování. Používejte prosím nízké částky!
popup.info.multiplePaymentAccounts.headline=K dispozici jsou účty a více platebními metodami
popup.info.multiplePaymentAccounts.msg=Pro tuto nabídku máte k dispozici více platebních účtů. Ujistěte se, že jste vybrali ten správný.
@@ -1670,11 +2259,13 @@ popup.accountSigning.signAccounts.ECKey.error=Špatný ECKey rozhodce
popup.accountSigning.success.headline=Gratulujeme
popup.accountSigning.success.description=Všechny {0} platební účty byly úspěšně podepsány!
-popup.accountSigning.generalInformation=Podpisový stav všech vašich účtů najdete v sekci účtu.\n\nDalší informace naleznete na adrese [HYPERLINK:https://docs.haveno.exchange/payment-methods#account-signing].
+popup.accountSigning.generalInformation=Podpisový stav všech vašich účtů najdete v sekci účtu.\n\n
+ Další informace naleznete na adrese [HYPERLINK:https://docs.haveno.exchange/payment-methods#account-signing].
popup.accountSigning.signedByArbitrator=Jeden z vašich platebních účtů byl ověřen a podepsán rozhodcem. Obchodování s tímto účtem po úspěšném obchodování automaticky podepíše účet vašeho obchodního partnera.\n\n{0}
popup.accountSigning.signedByPeer=Jeden z vašich platebních účtů byl ověřen a podepsán obchodním partnerem. Váš počáteční obchodní limit bude zrušen a do {0} dnů budete moci podepsat další účty.\n\n{1}
popup.accountSigning.peerLimitLifted=Počáteční limit pro jeden z vašich účtů byl zrušen.\n\n{0}
-popup.accountSigning.peerSigner=Jeden z vašich účtů je dostatečně zralý, aby podepsal další platební účty, a počáteční limit pro jeden z vašich účtů byl zrušen.\n\n{0}
+popup.accountSigning.peerSigner=Jeden z vašich účtů je dostatečně zralý, aby podepsal další platební účty, \
+ a počáteční limit pro jeden z vašich účtů byl zrušen.\n\n{0}
popup.accountSigning.singleAccountSelect.headline=Importujte svědka stáří účtu k podepsání
popup.accountSigning.confirmSingleAccount.headline=Potvrďte vybrané svědky o stáří účtu
@@ -1689,12 +2280,22 @@ popup.accountSigning.unsignedPubKeys.signed=Pubkeys byly podepsány
popup.accountSigning.unsignedPubKeys.result.signed=Podepsané pubkeys
popup.accountSigning.unsignedPubKeys.result.failed=Nepodařilo se podepsat
+popup.info.buyerAsTakerWithoutDeposit.headline=Žádný vklad není od kupujícího požadován
+popup.info.buyerAsTakerWithoutDeposit=\
+ Vaše nabídka nebude vyžadovat bezpečnostní zálohu ani poplatek od kupujícího XMR.\n\n
+ Pro přijetí vaší nabídky musíte sdílet heslo se svým obchodním partnerem mimo Haveno.\n\n\
+ Heslo je automaticky vygenerováno a zobrazeno v detailech nabídky po jejím vytvoření.\
+
+popup.info.torMigration.msg=Váš uzel Haveno pravděpodobně používá zastaralou adresu Tor v2. \
+ Přepněte svůj uzel Haveno na adresu Tor v3. \
+ Nezapomeňte si předem zálohovat datový adresář.
+
####################################################################
# Notifications
####################################################################
notification.trade.headline=Oznámení o obchodu s ID {0}
-notification.ticket.headline=Úkol na podporu pro obchod s ID {0}
+notification.ticket.headline=Úkol pro podporu pro obchod s ID {0}
notification.trade.completed=Obchod je nyní dokončen a můžete si vybrat své prostředky.
notification.trade.accepted=Vaše nabídka byla přijata XMR {0}.
notification.trade.unlocked=Váš obchod má alespoň jedno potvrzení blockchainu.\nPlatbu můžete začít hned teď.
@@ -1717,7 +2318,7 @@ systemTray.show=Otevřít okno aplikace
systemTray.hide=Skrýt okno aplikace
systemTray.info=Informace o Haveno
systemTray.exit=Odejít
-systemTray.tooltip=Haveno: Decentralizovaná směnárna moneroů
+systemTray.tooltip=Haveno: Decentralizovaná směnárna monero
####################################################################
@@ -1735,7 +2336,12 @@ guiUtil.accountExport.exportFailed=Export do CSV selhal kvůli chybě.\nChyba =
guiUtil.accountExport.selectExportPath=Vyberte složku pro export
guiUtil.accountImport.imported=Obchodní účet importovaný z:\n{0}\n\nImportované účty:\n{1}
guiUtil.accountImport.noAccountsFound=Nebyly nalezeny žádné exportované obchodní účty na: {0}.\nNázev souboru je {1}."
-guiUtil.openWebBrowser.warning=Chystáte se otevřít webovou stránku ve webovém prohlížeči.\nChcete nyní otevřít webovou stránku?\n\nPokud nepoužíváte \"Tor Browser\" jako výchozí systémový webový prohlížeč, připojíte se k webové stránce přes nechráněné spojení.\n\nURL: \"{0}\"
+guiUtil.openWebBrowser.warning=Chystáte se otevřít webovou stránku \
+ve webovém prohlížeči.\n\
+Chcete nyní otevřít webovou stránku?\n\n\
+Pokud nepoužíváte \"Tor Browser\" jako výchozí systémový webový prohlížeč, \
+připojíte se k webové stránce přes nechráněné spojení.\n\n\
+URL: \"{0}\"
guiUtil.openWebBrowser.doOpen=Otevřít webovou stránku a znovu se neptat
guiUtil.openWebBrowser.copyUrl=Zkopírovat URL a zrušit
guiUtil.ofTradeAmount=obchodní částky
@@ -1760,11 +2366,12 @@ peerInfoIcon.tooltip.trade.traded={0} onion adresa: {1}\nUž jste s tímto partn
peerInfoIcon.tooltip.trade.notTraded={0} onion adresa: {1}\nDosud jste s tímto partnerem neobchodovali.\n{2}
peerInfoIcon.tooltip.age=Platební účet byl vytvořen před {0}.
peerInfoIcon.tooltip.unknownAge=Stáří platebního účtu není znám.
+peerInfoIcon.tooltip.dispute={0}nPočet sporů: {1}.\n{2}
tooltip.openPopupForDetails=Otevřít vyskakovací okno s podrobnostmi
tooltip.invalidTradeState.warning=Tento obchod je v neplatném stavu. Chcete-li získat další informace, otevřete okno s podrobnostmi
-tooltip.openBlockchainForAddress=Otevřít externí blockchain explorer pro adresu: {0}
-tooltip.openBlockchainForTx=Otevřete externí blockchain explorer pro transakci: {0}
+tooltip.openBlockchainForAddress=Otevřít externí průzkumník blockchainu pro adresu: {0}
+tooltip.openBlockchainForTx=Otevřít externí průzkumník blockchainu pro transakci: {0}
confidence.unknown=Neznámý stav transakce
confidence.seen=Viděno {0} partnery / 0 potvrzení
@@ -1784,6 +2391,10 @@ addressTextField.copyToClipboard=Zkopírujte adresu do schránky
addressTextField.addressCopiedToClipboard=Adresa byla zkopírována do schránky
addressTextField.openWallet.failed=Otevření výchozí peněženky Monero selhalo. Možná nemáte žádnou nainstalovanou?
+explorerAddressTextField.copyToClipboard=Kopírovat adresu do schránky
+explorerAddressTextField.blockExplorerIcon.tooltip=Otevřete průzkumník blockchainu s touto adresou
+explorerAddressTextField.missingTx.warning.tooltip=Chybí požadovaná adresa
+
peerInfoIcon.tooltip={0}\nŠtítek: {1}
txIdTextField.copyIcon.tooltip=Zkopírujte ID transakce do schránky
@@ -1797,11 +2408,11 @@ txIdTextField.missingTx.warning.tooltip=Chybí požadovaná transakce
navigation.account=\"Účet\"
navigation.account.walletSeed=\"Účet/Seed peněženky\"
-navigation.funds.availableForWithdrawal=\"Prostředky/Odeslat prostředky\"
+navigation.funds.availableForWithdrawal=\"Prostředky/Poslat finanční prostředky\"
navigation.portfolio.myOpenOffers=\"Portfolio/Moje otevřené nabídky\"
navigation.portfolio.pending=\"Portfolio/Otevřené obchody\"
navigation.portfolio.closedTrades=\"Portfolio/Historie\"
-navigation.funds.depositFunds=\"Prostředky/Přijmout prostředky\"
+navigation.funds.depositFunds=\"Prostředky/Přijmout finanční prostředky\"
navigation.settings.preferences=\"Nastavení/Preference\"
# suppress inspection "UnusedProperty"
navigation.funds.transactions=\"Prostředky/Transakce\"
@@ -1814,11 +2425,12 @@ navigation.support=\"Podpora\"
formatter.formatVolumeLabel={0} částka{1}
formatter.makerTaker=Tvůrce jako {0} {1} / Příjemce jako {2} {3}
+formatter.makerTakerLocked=Tvůrce jako {0} {1} / Příjemce jako {2} {3} 🔒
formatter.youAreAsMaker=Jste {1} {0} (jako tvůrce) / Příjemce je {3} {2}
formatter.youAreAsTaker=Jste {1} {0} (jako příjemce) / Tvůrce je {3} {2}
formatter.youAre={0}te {1} ({2}te {3})
formatter.youAreCreatingAnOffer.traditional=Vytváříte nabídku: {0} {1}
-formatter.youAreCreatingAnOffer.crypto=Vytváříte nabídku: {0} {1} ({2}te {3})
+formatter.youAreCreatingAnOffer.crypto=Vytváříte nabídku: {0} {1} ({2} {3})
formatter.asMaker={0} {1} jako tvůrce
formatter.asTaker={0} {1} jako příjemce
@@ -1838,18 +2450,20 @@ XMR_STAGENET=Monero Stagenet
time.year=Rok
time.month=Měsíc
+time.halfYear=Půlrok
+time.quarter=Čtvrtrok
time.week=Týden
time.day=Den
time.hour=Hodina
time.minute10=10 minut
-time.hours=hodiny
-time.days=dny
+time.hours=hodin
+time.days=dnů
time.1hour=1 hodina
time.1day=1 den
time.minute=minuta
time.second=sekunda
-time.minutes=minuty
-time.seconds=sekundy
+time.minutes=minut
+time.seconds=sekund
password.enterPassword=Vložte heslo
@@ -1859,11 +2473,12 @@ password.deriveKey=Odvozuji klíč z hesla
password.walletDecrypted=Peněženka úspěšně dešifrována a ochrana heslem byla odstraněna.
password.wrongPw=Zadali jste nesprávné heslo.\n\nZkuste prosím zadat heslo znovu a pečlivě zkontrolujte překlepy nebo pravopisné chyby.
password.walletEncrypted=Peněženka úspěšně šifrována a ochrana heslem povolena.
+password.walletEncryptionFailed=Heslo se nepodařilo nastavit
password.passwordsDoNotMatch=Zadaná 2 hesla se neshodují.
password.forgotPassword=Zapomněli jste heslo?
-password.backupReminder=Pamatujte, že při nastavování hesla do peněženky budou odstraněny všechny automaticky vytvořené zálohy z nezašifrované peněženky.\n\nPřed nastavením hesla se důrazně doporučuje provést zálohu adresáře aplikace a zapsat si počáteční slova!
-password.backupWasDone=Už jsem provedl zálohu
-password.setPassword=Nastavit heslo (Už jsem provedl zálohu)
+password.backupReminder=Pamatujte, že při nastavování hesla do peněženky budou smazány všechny automaticky vytvořené zálohy z nezašifrované peněženky.\n\n\
+ Před nastavením hesla se důrazně doporučuje provést zálohu adresáře aplikace a zapsat si seed slova!
+password.setPassword=Nastavit heslo (Už jsem provedl/a zálohu)
password.makeBackup=Provést zálohu
seed.seedWords=Seed slova peněženky
@@ -1872,14 +2487,25 @@ seed.date=Datum peněženky
seed.restore.title=Obnovit peněženky z seed slov
seed.restore=Obnovit peněženky
seed.creationDate=Datum vzniku
-seed.warn.walletNotEmpty.msg=Vaše peněženka Monero není prázdná.\n\nTuto peněženku musíte vyprázdnit, než se pokusíte obnovit starší, protože smíchání peněženek může vést ke zneplatnění záloh.\n\nDokončete své obchody, uzavřete všechny otevřené nabídky a přejděte do sekce Prostředky, kde si můžete vybrat své moneroy.\nV případě, že nemáte přístup ke svým moneroům, můžete použít nouzový nástroj k vyprázdnění peněženky.\nNouzový nástroj otevřete stisknutím kombinace kláves \"Alt+e\" nebo \"Cmd/Ctrl+e\".
+seed.warn.walletNotEmpty.msg=Vaše peněženka Monero není prázdná.\n\n\
+Tuto peněženku musíte vyprázdnit, než se pokusíte obnovit starší, protože smíchání peněženek \
+může vést ke zneplatnění záloh.\n\n\
+Dokončete své obchody, uzavřete všechny otevřené nabídky a přejděte do sekce Prostředky, kde si můžete vybrat své monero.\n\
+V případě, že nemáte přístup ke svým moneroům, můžete použít nouzový nástroj k vyprázdnění peněženky.\n\
+Nouzový nástroj otevřete stisknutím kombinace kláves \"Alt+e\" nebo \"Cmd/Ctrl+e\".
seed.warn.walletNotEmpty.restore=Chci přesto obnovit
seed.warn.walletNotEmpty.emptyWallet=Nejprve vyprázdním své peněženky
-seed.warn.notEncryptedAnymore=Vaše peněženky jsou šifrovány.\n\nPo obnovení již nebudou peněženky šifrovány a musíte nastavit nové heslo.\n\nChcete pokračovat?
-seed.warn.walletDateEmpty=Protože jste nezadali datum peněženky, bude muset haveno skenovat blockchain od roku 2013.10.09 (datum spuštění BIP39).\n\nPeněženky BIP39 byly poprvé představeny v haveno dne 2017.06.28 (verze v0.5). Tímto datem můžete ušetřit čas.\n\nV ideálním případě byste měli určit datum, kdy byl vytvořen váš seed peněženky.\n\n\nOpravdu chcete pokračovat bez zadání data peněženky?
+seed.warn.notEncryptedAnymore=Vaše peněženky jsou šifrovány.\n\n\
+Po obnovení již nebudou peněženky šifrovány a musíte nastavit nové heslo.\n\n\
+Chcete pokračovat?
+seed.warn.walletDateEmpty=Protože jste nezadali datum peněženky, bude muset haveno skenovat blockchain od roku 2013.10.09 (datum spuštění BIP39).\n\n\
+Peněženky BIP39 byly poprvé představeny v Haveno dne 2017.06.28 (verze v0.5). Použitím tohoto data můžete ušetřit čas.\n\n\
+V ideálním případě byste měli určit datum, kdy byl vytvořen váš seed peněženky.\n\n\n\
+Opravdu chcete pokračovat bez zadání data peněženky?
seed.restore.success=Peněženky byly úspěšně obnoveny pomocí nových seed slov.\n\nMusíte vypnout a restartovat aplikaci.
seed.restore.error=Při obnově peněženek pomocí seed slov došlo k chybě. {0}
-seed.restore.openOffers.warn=Máte otevřené nabídky, které budou odstraněny, pokud obnovíte ze seedu.\nJste si jisti, že chcete pokračovat?
+seed.restore.openOffers.warn=Máte otevřené nabídky, které budou odstraněny, pokud obnovíte ze seedu.\n\
+ Jste si jisti, že chcete pokračovat?
####################################################################
@@ -1895,9 +2521,10 @@ payment.account.owner=Celé jméno vlastníka účtu
payment.account.fullName=Celé jméno (křestní, střední, příjmení)
payment.account.state=Stát/Provincie/Region
payment.account.city=Město
+payment.account.address=Adresa
payment.bank.country=Země původu banky
-payment.account.name.email=Celé jméno / e-mail majitele účtu
-payment.account.name.emailAndHolderId=Celé jméno / e-mail / majitele účtu {0}
+payment.account.name.email=Celé jméno majitele účtu / e-mail
+payment.account.name.emailAndHolderId=Celé jméno majitele účtu / e-mail / {0}
payment.bank.name=Jméno banky
payment.select.account=Vyberte typ účtu
payment.select.region=Vyberte region
@@ -1909,14 +2536,58 @@ payment.email=E-mail
payment.country=Země
payment.extras=Zvláštní požadavky
payment.email.mobile=E-mail nebo mobilní číslo
-payment.crypto.address=Crypto adresa
-payment.crypto.tradeInstantCheckbox=Obchodujte ihned s tímto cryptoem (do 1 hodiny)
-payment.crypto.tradeInstant.popup=Pro okamžité obchodování je nutné, aby oba obchodní partneři byli online, aby mohli obchod dokončit za méně než 1 hodinu.\n\nPokud máte otevřené nabídky a nejste k dispozici, deaktivujte je na obrazovce „Portfolio“.
-payment.crypto=Crypto
-payment.select.crypto=Vyberte nebo vyhledejte crypto
+payment.email.mobile.cashtag=Cashtag, e-mail, nebo mobilní číslo.
+payment.email.mobile.username=Uživatelské jméno, e-mail, nebo mobilní číslo.
+payment.crypto.address=Adresa kryptoměny
+payment.crypto.tradeInstantCheckbox=Obchodujte okamžitě (do 1 hodiny) s touto kryptoměnou
+payment.crypto.tradeInstant.popup=Pro okamžité obchodování je nutné, aby oba obchodní partneři byli online, aby mohli \
+ obchod dokončit za méně než 1 hodinu.\n\n\
+ Pokud máte otevřené nabídky a nejste k dispozici, \
+ deaktivujte je na obrazovce 'Portfolio'.
+payment.crypto=Kryptoměna
+payment.select.crypto=Vyberte nebo vyhledejte kryptoměnu
payment.secret=Tajná otázka
payment.answer=Odpověď
payment.wallet=ID peněženky
+payment.capitual.cap=CAP kód
+payment.upi.virtualPaymentAddress=Virtuální platební adresa
+
+# suppress inspection "UnusedProperty"
+payment.swift.headline=Mezinárodní SWIFT Wire Transfer
+# suppress inspection "UnusedProperty"
+payment.swift.title.bank=Přijímající banka
+# suppress inspection "UnusedProperty"
+payment.swift.title.intermediary=Zprostředkující banka (klikněte pro rozbalení)
+# suppress inspection "UnusedProperty"
+payment.swift.country.bank=Země přijímající banky
+# suppress inspection "UnusedProperty"
+payment.swift.country.intermediary=Země zprostředkující banky
+# suppress inspection "UnusedProperty"
+payment.swift.swiftCode.bank=SWIFT kód přijímající banky
+# suppress inspection "UnusedProperty"
+payment.swift.swiftCode.intermediary=SWIFT kód zprostředkující banky
+# suppress inspection "UnusedProperty"
+payment.swift.name.bank=Název přijímající banky
+# suppress inspection "UnusedProperty"
+payment.swift.name.intermediary=Název zprostředkující banky
+# suppress inspection "UnusedProperty"
+payment.swift.branch.bank=Pobočka přijímající banky
+# suppress inspection "UnusedProperty"
+payment.swift.branch.intermediary=Pobočka zprostředkující banky
+# suppress inspection "UnusedProperty"
+payment.swift.address.bank=Adresa přijímající banky
+# suppress inspection "UnusedProperty"
+payment.swift.address.intermediary=Adresa zprostředkující banky
+# suppress inspection "UnusedProperty"
+payment.swift.address.beneficiary=Adresa příjemce
+# suppress inspection "UnusedProperty"
+payment.swift.phone.beneficiary=Telefon příjemce prostředků
+payment.swift.account=Číslo účtu (nebo IBAN)
+payment.swift.use.intermediary=Použít zprostředkující banku
+payment.swift.showPaymentInfo=Ukázat platební informace...
+payment.account.owner.address=Adresa majitele účtu
+payment.transferwiseUsd.address=(musí být v US, zvažte použití adresy banky)
+
payment.amazon.site=Kupte Amazon eGift zde:
payment.ask=Zjistěte pomocí obchodního chatu
payment.uphold.accountId=Uživatelské jméno, e-mail nebo číslo telefonu
@@ -1927,7 +2598,9 @@ payment.supportedCurrencies=Podporované měny
payment.supportedCurrenciesForReceiver=Měny pro příjem prostředků
payment.limitations=Omezení
payment.salt=Salt pro ověření stáří účtu
-payment.error.noHexSalt=Salt musí být ve formátu HEX.\nDoporučujeme upravit pole salt, pokud chcete salt převést ze starého účtu, aby bylo stáří vašeho účtu zachováno. Stáří účtu se ověřuje pomocí salt účtu a identifikačních údajů účtu (např. IBAN).
+payment.error.noHexSalt=Salt musí být ve formátu HEX.\n\
+ Doporučujeme upravit pole salt, pokud chcete salt převést ze starého účtu, aby bylo stáří vašeho účtu zachováno. \
+ Stáří účtu se ověřuje pomocí salt účtu a identifikačních údajů účtu (např. IBAN).
payment.accept.euro=Přijímejte obchody z těchto zemí eurozóny
payment.accept.nonEuro=Přijímejte obchody z těchto zemí mimo eurozónu
payment.accepted.countries=Akceptované země
@@ -1957,47 +2630,424 @@ payment.bankIdOptional=ID Banky (BIC/SWIFT) (volitelné)
payment.branchNr=Číslo pobočky
payment.branchNrOptional=Číslo pobočky (volitelné)
payment.accountNrLabel=Číslo účtu (IBAN)
+payment.iban=IBAN
+payment.tikkie.iban=IBAN použitý pro obchodování Haveno na Tikkie
payment.accountType=Typ účtu
payment.checking=Kontrola
payment.savings=Úspory
payment.personalId=Číslo občanského průkazu
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.zelle.info=Zelle je služba převodu peněz, která funguje nejlépe *prostřednictvím* jiné banky.\n\n1. Na této stránce zjistěte, zda (a jak) vaše banka spolupracuje se Zelle:\n[HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Zaznamenejte si zvláštní limity převodů - limity odesílání se liší podle banky a banky často určují samostatné denní, týdenní a měsíční limity.\n\n3. Pokud vaše banka s Zelle nepracuje, můžete ji stále používat prostřednictvím mobilní aplikace Zelle, ale vaše limity převodu budou mnohem nižší.\n\n4. Název uvedený na vašem účtu Haveno MUSÍ odpovídat názvu vašeho účtu Zelle/bankovního účtu.\n\nPokud nemůžete dokončit transakci Zelle, jak je uvedeno ve vaší obchodní smlouvě, můžete ztratit část (nebo vše) ze svého bezpečnostního vkladu.\n\nVzhledem k poněkud vyššímu riziku zpětného zúčtování společnosti Zelle se prodejcům doporučuje kontaktovat nepodepsané kupující prostřednictvím e-mailu nebo SMS, aby ověřili, že kupující skutečně vlastní účet Zelle uvedený v Haveno.
-payment.fasterPayments.newRequirements.info=Některé banky začaly ověřovat celé jméno příjemce pro převody Faster Payments. Váš současný účet Faster Payments nepožadoval celé jméno.\n\nZvažte prosím znovu vytvoření svého Faster Payments účtu v Havenou, abyste mohli budoucím kupujícím {0} poskytnout celé jméno.\n\nPři opětovném vytvoření účtu nezapomeňte zkopírovat přesný kód řazení, číslo účtu a hodnoty soli (salt) pro ověření věku ze starého účtu do nového účtu. Tím zajistíte zachování stáří a stavu vašeho stávajícího účtu.
-payment.moneyGram.info=Při používání MoneyGram musí XMR kupující zaslat autorizační číslo a fotografii potvrzení e-mailem prodejci XMR. Potvrzení musí jasně uvádět celé jméno prodejce, zemi, stát a částku. E-mail prodávajícího se kupujícímu zobrazí během procesu obchodování.
-payment.westernUnion.info=Při používání služby Western Union musí kupující XMR zaslat prodejci XMR e-mailem MTCN (sledovací číslo) a fotografii potvrzení. Potvrzení musí jasně uvádět celé jméno prodejce, město, zemi a částku. E-mail prodávajícího se kupujícímu zobrazí během procesu obchodování.
-payment.halCash.info=Při používání HalCash musí kupující XMR poslat prodejci XMR kód HalCash prostřednictvím textové zprávy z mobilního telefonu.\n\nUjistěte se, že nepřekračujete maximální částku, kterou vám banka umožňuje odesílat pomocí HalCash. Min. částka za výběr je 10 EUR a max. částka je 600 EUR. Pro opakované výběry je to 3000 EUR za příjemce za den a 6000 EUR za příjemce za měsíc. Zkontrolujte prosím tyto limity u své banky, abyste se ujistili, že používají stejné limity, jaké jsou zde uvedeny.\n\nČástka pro výběr musí být násobkem 10 EUR, protože z bankomatu nemůžete vybrat jiné částky. Uživatelské rozhraní na obrazovce vytvořit-nabídku and přijmout-nabídku upraví částku XMR tak, aby částka EUR byla správná. Nemůžete použít tržní cenu, protože částka v EURECH se mění s měnícími se cenami.\n\nV případě sporu musí kupující XMR poskytnout důkaz, že zaslal EURA.
+payment.zelle.info=Zelle je služba převodu peněz, která funguje nejlépe *prostřednictvím* jiné banky.\n\n\
+ 1. Na této stránce zjistěte, zda (a jak) vaše banka spolupracuje se Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n\
+ 2. Zaznamenejte si zvláštní limity převodů - limity odesílání se liší podle banky a banky často určují samostatné denní, týdenní a měsíční limity.\n\n\
+ 3. Pokud vaše banka s Zelle nepracuje, můžete ji stále používat prostřednictvím mobilní aplikace Zelle, ale vaše limity převodu budou mnohem nižší.\n\n\
+ 4. Název uvedený na vašem účtu Haveno MUSÍ odpovídat názvu vašeho účtu Zelle/bankovního účtu.\n\n\
+ Pokud nemůžete dokončit transakci Zelle, jak je uvedeno ve vaší obchodní smlouvě, můžete ztratit část (nebo vše) ze svého bezpečnostního vkladu.\n\n\
+ Vzhledem k poněkud vyššímu riziku zpětného zúčtování společnosti Zelle se prodejcům doporučuje kontaktovat nepodepsané kupující \
+ prostřednictvím e-mailu nebo SMS, aby ověřili, že kupující skutečně vlastní účet Zelle uvedený v Haveno.
+payment.fasterPayments.newRequirements.info=Některé banky začaly ověřovat celé jméno příjemce pro převody \
+Faster Payments. Váš současný účet Faster Payments nepožadoval celé jméno.\n\n\
+ Zvažte prosím znovu vytvoření svého Faster Payments účtu v Havenou, abyste mohli budoucím kupujícím {0} poskytnout celé jméno.\n\n\
+ Při opětovném vytvoření účtu nezapomeňte zkopírovat přesný kód řazení, číslo účtu a hodnoty soli (salt) pro ověření \
+ věku ze starého účtu do nového účtu. Tím zajistíte zachování stáří \
+ a stavu vašeho stávajícího účtu.
+payment.fasterPayments.ukSortCode="UK sort kód"
+payment.moneyGram.info=Při používání MoneyGram musí XMR kupující zaslat autorizační číslo a fotografii potvrzení e-mailem prodejci XMR. \
+ Potvrzení musí jasně uvádět celé jméno prodejce, zemi, stát a částku. E-mail prodávajícího se kupujícímu zobrazí během procesu obchodování.
+payment.westernUnion.info=Při používání služby Western Union musí kupující XMR zaslat prodejci XMR e-mailem MTCN (sledovací číslo) a fotografii potvrzení. \
+ Potvrzení musí jasně uvádět celé jméno prodejce, město, zemi a částku. E-mail prodávajícího se kupujícímu zobrazí během procesu obchodování.
+payment.halCash.info=Při používání HalCash musí kupující XMR poslat prodejci XMR kód HalCash prostřednictvím textové zprávy z mobilního telefonu.\n\n\
+ Ujistěte se, že nepřekračujete maximální částku, kterou vám banka umožňuje odesílat pomocí HalCash. \
+ Min. částka za výběr je 10 EUR a max. částka je 600 EUR. Pro opakované výběry je to 3000 EUR za příjemce za den \
+ a 6000 EUR za příjemce za měsíc. Zkontrolujte prosím tyto limity u své banky, abyste se ujistili, \
+ že používají stejné limity, jaké jsou zde uvedeny.\n\n\
+ Částka pro výběr musí být násobkem 10 EUR, protože z bankomatu nemůžete vybrat jiné částky. \
+ Uživatelské rozhraní na obrazovce vytvořit-nabídku and přijmout-nabídku upraví částku XMR tak, aby částka EUR byla správná. \
+ Nemůžete použít tržní cenu, protože částka v EURECH se mění s měnícími se cenami.\n\n\
+ V případě sporu musí kupující XMR poskytnout důkaz, že zaslal EURA.
# suppress inspection "UnusedMessageFormatParameter"
-payment.limits.info=Uvědomte si, že u všech bankovních převodů existuje určité riziko zpětného zúčtování. Aby se toto riziko zmírnilo, stanoví Haveno limity pro jednotlivé obchody na základě odhadované úrovně rizika zpětného zúčtování pro použitou platební metodu.\n\nU této platební metody je váš limit pro jednotlivé obchody pro nákup a prodej {2}.\n\nToto omezení se vztahuje pouze na velikost jednoho obchodu - můžete zadat tolik obchodů, kolik chcete.\n\nDalší podrobnosti najdete na wiki [HYPERLINK:https://docs.haveno.exchange/the-project/account_limits].
+payment.limits.info=Uvědomte si, že u všech bankovních převodů existuje určité riziko zpětného zúčtování. Aby se toto riziko zmírnilo, \
+ stanoví Haveno limity pro jednotlivé obchody na základě odhadované úrovně rizika zpětného zúčtování pro použitou platební metodu.\n\
+ \n\
+ U této platební metody je váš limit pro jednotlivé obchody pro nákup a prodej {2}.\n\
+ \n\
+ Toto omezení se vztahuje pouze na velikost jednoho obchodu - můžete zadat tolik obchodů, kolik chcete.\n\
+ \n\
+ Další podrobnosti najdete na wiki [HYPERLINK:https://docs.haveno.exchange/the-project/account_limits].
# suppress inspection "UnusedProperty"
-payment.limits.info.withSigning=Aby se omezilo riziko zpětného zúčtování, Haveno stanoví limity pro jednotlivé obchody pro tento typ platebního účtu na základě následujících 2 faktorů:\n\n1. Obecné riziko zpětného zúčtování pro platební metodu\n2. Stav podepisování účtu\n\nTento platební účet ještě není podepsán, takže je omezen na nákup {0} za obchod. Po podpisu se limity nákupu zvýší následovně:\n\n● Před podpisem a 30 dní po podpisu bude váš limit nákupu podle obchodu {0}\n● 30 dní po podpisu bude váš limit nákupu podle obchodu {1}\n● 60 dní po podpisu bude váš limit nákupu podle obchodu {2}\n\nPodpisy účtu neovlivňují prodejní limity. Můžete okamžitě prodat {2} v jednom obchodu.\n\nTato omezení platí pouze pro objem jednoho obchodu - můžete zadat tolik obchodů, kolik chcete.\n\nDalší podrobnosti najdete na wiki [HYPERLINK:https://docs.haveno.exchange/the-project/account_limits].
+payment.limits.info.withSigning=Aby se omezilo riziko zpětného zúčtování, Haveno stanoví limity pro jednotlivé obchody \
+ pro tento typ platebního účtu na základě následujících 2 faktorů:\n\n\
+ 1. Obecné riziko zpětného zúčtování pro platební metodu\n\
+ 2. Stav podepisování účtu\n\
+ \n\
+ Tento platební účet ještě není podepsán, takže je omezen na nákup {0} za obchod. \
+ Po podpisu se limity nákupu zvýší následovně:\n\
+ \n\
+ ● Před podpisem a 30 dní po podpisu bude váš limit nákupu podle obchodu {0}\n\
+ ● 30 dní po podpisu bude váš limit nákupu podle obchodu {1}\n\
+ ● 60 dní po podpisu bude váš limit nákupu podle obchodu {2}\n\
+ \n\
+ Podpisy účtu neovlivňují prodejní limity. Můžete okamžitě prodat {2} v jednom obchodu.\n\
+ \n\
+ Tato omezení platí pouze pro objem jednoho obchodu - můžete zadat tolik obchodů, kolik chcete.\n\
+ \n\
+ Další podrobnosti najdete na wiki [HYPERLINK:https://docs.haveno.exchange/the-project/account_limits].
-payment.cashDeposit.info=Potvrďte, že vám vaše banka umožňuje odesílat hotovostní vklady na účty jiných lidí. Například Bank of America a Wells Fargo již takové vklady nepovolují.
+payment.cashDeposit.info=Potvrďte, že vám vaše banka umožňuje odesílat hotovostní vklady na účty jiných lidí. \
+ Například Bank of America a Wells Fargo již takové vklady nepovolují.
-payment.revolut.info=Revolut vyžaduje „uživatelské jméno“ jako ID účtu, nikoli telefonní číslo nebo e-mail, jako tomu bylo v minulosti.
-payment.account.revolut.addUserNameInfo={0}\nVáš stávající účet Revolut ({1}) nemá "Uživatelské jméno".\nChcete-li aktualizovat údaje o svém účtu, zadejte své "Uživatelské jméno" Revolut.\nTo neovlivní stav podepisování věku vašeho účtu.
+payment.revolut.info=Revolut vyžaduje 'uživatelské jméno' jako ID účtu, nikoli telefonní číslo nebo e-mail, jako tomu bylo v minulosti.
+payment.account.revolut.addUserNameInfo={0}\n\
+ Váš stávající účet Revolut ({1}) nemá "Uživatelské jméno".\n\
+ Chcete-li aktualizovat údaje o svém účtu, zadejte své "Uživatelské jméno" Revolut.\n\
+ To neovlivní stav podepisování stáří vašeho účtu.
payment.revolut.addUserNameInfo.headLine=Aktualizujte účet Revolut
+payment.cashapp.info=Uvědomte si, že u aplikace Cash App je riziko zpětné úhrady (chargeback) vyšší než u většiny bankovních převodů.
+payment.venmo.info=Mějte na paměti, že u služby Venmo je riziko zpětné úhrady (chargeback) vyšší než u většiny bankovních převodů.
+payment.paypal.info=Uvědomte si prosím, že u služby PayPal je riziko zpětné úhrady (chargeback) vyšší než u většiny bankovních převodů.
+
payment.amazonGiftCard.upgrade=Platba kartou Amazon eGift nyní vyžaduje také nastavení země.
-payment.account.amazonGiftCard.addCountryInfo={0}\nVáš stávající účet pro platbu kartou Amazon eGift ({1}) nemá nastavenou zemi.\nVyberte prosím zemi, ve které je možné vaše karty Amazon eGift uplatnit.\nTato aktualizace vašeho účtu nebude mít vliv na stáří tohoto účtu.
+payment.account.amazonGiftCard.addCountryInfo={0}\n\
+ Váš stávající účet pro platbu kartou Amazon eGift ({1}) nemá nastavenou zemi.\n\
+ Vyberte prosím zemi, ve které je možné vaše karty Amazon eGift uplatnit.\n\
+ Tato aktualizace vašeho účtu nebude mít vliv na stáří tohoto účtu.
payment.amazonGiftCard.upgrade.headLine=Aktualizace účtu pro platbu kartou Amazon eGift
-payment.usPostalMoneyOrder.info=Obchodování pomocí amerických poštovních poukázek (USPMO) na Haveno vyžaduje, abyste rozuměli následujícímu:\n\n- Kupující XMR musí před odesláním napsat jméno prodejce XMR do polí plátce i příjemce a pořídit fotografii USPMO a obálku s dokladem o sledování ve vysokém rozlišení.\n- Kupující XMR musí odeslat USPMO prodejci XMR s potvrzením dodávky.\n\nV případě, že je nutná mediace, nebo pokud dojde k obchodnímu sporu, budete povinni poslat fotografie mediátorovi Haveno nebo zástupci pro vrácení peněz spolu s pořadovým číslem USPMO, číslem pošty a částkou dolaru, aby mohli ověřit podrobnosti na webu US Post Office.\n\nNeposkytnutí požadovaných informací mediátorovi nebo arbitrovi bude mít za následek ztrátu případu sporu.\n\nVe všech sporných případech nese odesílatel USPMO 100% břemeno odpovědnosti za poskytnutí důkazů mediátorovi nebo arbitrovi.\n\nPokud těmto požadavkům nerozumíte, neobchodujte pomocí USPMO na Haveno.
+payment.swift.info.account=Pečlivě si prostudujte základní pokyny pro používání SWIFT v Haveno:\n\
+\n\
+- vyplňte všechna pole kompletně a přesně \n\
+- kupující musí odeslat platbu v měně stanovené tvůrcem nabídky \n\
+- kupující použije u platby model sdílených poplatků (SHA) \n\
+- kupující a prodejce mohou platit poplatky, proto by se měli nejprve seznámit s poplatky své banky \n\
+\n\
+SWIFT je složitější než jiné platební metody, proto si prosím přečtěte kompletní pokyny na wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT].
+
+payment.swift.info.buyer=Pro nákup monero pomocí SWIFT, musíte:\n\
+\n\
+- odeslat platbu v měně, stanovené tvůrcem nabídky \n\
+- použít u platby model sdílených poplatků (SHA) \n\
+\n\
+Přečtěte si další pokyny na wiki, abyste se vyhnuli sankcím a zajistili hladký průběh obchodů [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT].
+
+payment.swift.info.seller=Odesílatelé SWIFT musí při odesílání plateb používat model sdílených poplatků (SHA).\n\
+\n\
+Pokud obdržíte platbu SWIFT, která nepoužívá SHA, otevřete mediační požadavek.\n\
+\n\
+Přečtěte si další pokyny na wiki, abyste se vyhnuli sankcím a zajistili hladký průběh obchodů [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT].
+
+payment.imps.info.account=Prosím, nezapomeňte uvést své:\n\n\
+ ● Celé jméno majitele účtu\n\
+ ● Číslo účtu\n\
+ ● IFSC číslo\n\n\
+Tyto údaje by měly odpovídat vašemu bankovnímu účtu, který budete používat pro odesílání / přijímání plateb.\n\n\
+Upozorňujeme, že na jednu transakci lze poslat maximálně 200 000 rupií. Pokud obchodujete s částkou vyšší než tato, bude třeba provést více transakcí. Uvědomte si však, že jejich maximální limit je 1 000 000 rupií, které lze odeslat za den.\n\n\
+Některé banky mají pro své zákazníky jiné limity.
+payment.imps.info.buyer=Platbu prosím zasílejte pouze na účet uvedený v systému Haveno.\n\n\
+Maximální velikost obchodu je 200 000 rupií na transakci.\n\n\
+Pokud váš obchod přesahuje 200 000 rupií, budete muset provést více převodů. Mějte však na paměti, že je stanoven maximální limit 1 000 000 rupií, který lze odeslat za den.\n\n\
+Vezměte prosím na vědomí, že některé banky mají pro své klienty jiné limity.
+payment.imps.info.seller=Pokud máte v úmyslu přijmout více než 200 000 rupií za obchod, měli byste počítat s tím, že kupující bude muset provést více převodů. Mějte však na paměti, že existuje maximální limit 1 000 000 rupií, které lze odeslat za den.\n\n\
+Vezměte prosím na vědomí, že některé banky mají pro své klienty jiné limity.
+
+payment.neft.info.account=Prosím, nezapomeňte uvést své:\n\n\
+ ● Celé jméno majitele účtu\n\
+ ● Číslo účtu\n\
+ ● IFSC číslo\n\n\
+Tyto údaje by měly odpovídat vašemu bankovnímu účtu, který budete používat pro odesílání/přijímání plateb.\n\n\
+Upozorňujeme, že na jednu transakci lze poslat maximálně 50 000 rupií. Pokud obchodujete s částkou vyšší než tato, bude třeba provést více transakcí.\n\n\
+Vezměte prosím na vědomí, že některé banky mají pro své klienty jiné limity.
+payment.neft.info.buyer=Platbu prosím zasílejte pouze na účet uvedený v systému Haveno.\n\n\
+Maximální velikost obchodu je 50 000 rupií na transakci.\n\n\
+Pokud váš obchod přesáhne 50 000 rupií, budete muset provést více převodů.\n\n\
+Vezměte prosím na vědomí, že některé banky mají pro své klienty různé limity.
+payment.neft.info.seller=Pokud máte v úmyslu získat více než 50 000 rupií za obchod, měli byste počítat s tím, že kupující bude muset provést více převodů.\n\n\
+Vezměte prosím na vědomí, že některé banky mají pro své klienty jiné limity.
+
+payment.paytm.info.account=Nezapomeňte uvést e-mail nebo telefonní číslo, které se shoduje s vaším e-mailem nebo telefonním číslem ve vašem účtu PayTM. \n\n\
+Když si uživatelé založí účet PayTM bez KYC, jsou omezeni: \n\n\
+ ● Na jednu transakci lze poslat maximálně 5 000 rupií.\n\
+ ● V peněžence PayTM můžete mít maximálně 10 000 rupií.\n\n\
+Pokud máte v úmyslu obchodovat s částkou vyšší než 5 000 za obchod, budete muset u společnosti PayTM vyplnit KYC. S KYC jsou uživatelé omezeni na:\n\n\
+ ● Na jednu transakci lze poslat maximálně 100 000 rupií.\n\
+ ● V peněžence PayTM můžete mít maximálně 100 000 rupií.\n\n\
+Uživatelé by také měli znát limity účtu. Obchody překračující limity účtu PayTM se pravděpodobně budou muset uskutečnit v průběhu více než jednoho dne, nebo budou zrušeny.
+payment.paytm.info.buyer=Platbu zasílejte pouze na uvedenou e-mailovou adresu nebo telefonní číslo.\n\n\
+Pokud máte v úmyslu obchodovat s částkou vyšší než 5 000 rupií za obchod, budete muset u společnosti PayTM vyplnit KYC.\n\n\
+Bez KYC lze na jednu transakci poslat 5 000 rupií.\n\n\
+S uživateli KYC lze na jednu transakci poslat 100 000 rupií.
+payment.paytm.info.seller=Pokud máte v úmyslu obchodovat s částkou vyšší než 5 000 rupií za obchod, budete muset u společnosti PayTM vyplnit KYC. S KYC jsou uživatelé omezeni na:\n\n\
+ ● Na jednu transakci lze poslat maximálně 100 000 rupií.\n\
+ ● V peněžence PayTM můžete mít maximálně 100 000 rupií.\n\n\
+Uživatelé by také měli znát limity účtu. Protože v peněžence PayTM můžete mít maximálně 100 000 rupií, dbejte na to, abyste své rupie pravidelně převáděli.
+
+payment.rtgs.info.account=RTGS je určen pro platby velkých obchodů ve výši 200 000 rupií a více.\n\n\
+Při nastavování platebního účtu RTGS nezapomeňte uvést své:\n\n\
+ ● Celé jméno majitele účtu\n\
+ ● Číslo účtu\n\
+ ● IFSC číslo\n\n\\
+Tyto údaje by měly odpovídat vašemu bankovnímu účtu, který budete používat pro odesílání/přijímání plateb.\n\n\
+Vezměte prosím na vědomí, že minimální částka obchodu, kterou lze poslat na jednu transakci, je 200 000 rupií. Pokud obchodujete pod touto částkou, buď bude obchod zrušen, nebo se oba obchodníci budou muset dohodnout na jiném způsobu platby (např. IMPS nebo UPI).
+payment.rtgs.info.buyer=Platbu prosím zasílejte pouze na účet uvedený v systému Haveno.\n\n\
+Vezměte prosím na vědomí, že minimální částka obchodu, kterou lze poslat na jednu transakci, je 200 000 rupií. Pokud obchodujete pod touto částkou, buď bude obchod zrušen, nebo se oba obchodníci budou muset dohodnout na jiném způsobu platby (např. IMPS nebo UPI).
+payment.rtgs.info.seller=Vezměte prosím na vědomí, že minimální částka obchodu, kterou lze poslat na jednu transakci, je 200 000 rupií. Pokud obchodujete pod touto částkou, buď bude obchod zrušen, nebo se oba obchodníci budou muset dohodnout na jiném způsobu platby (např. IMPS nebo UPI).
+
+payment.upi.info.account=Nezapomeňte uvést svou virtuální platební adresu (VPA), která se také nazývá UPI ID. Formát tohoto údaje je podobný e-mailovému ID: se znakem ”@” uprostřed. Vaše UPI ID může být například ”jméno_příjemce@název_banky” nebo ”telefonní_číslo@název_banky”. \n\n\
+Pro UPI je stanoven maximální limit 100 000 rupií, které lze poslat na jednu transakci. \n\n\
+Pokud máte v úmyslu obchodovat s částkou vyšší než 100 000 rupií na jeden obchod, je pravděpodobné, že obchody budou muset proběhnout více převody. \n\n\
+Vezměte prosím na vědomí, že některé banky mají pro své klienty různé limity.
+payment.upi.info.buyer=Platbu prosím zasílejte pouze na VPA / UPI ID uvedené v systému Haveno. \n\n\
+Maximální velikost obchodu je 100 000 rupií na transakci. \n\n\
+Pokud váš obchod přesahuje 100 000 rupií, budete muset provést více převodů. \n\n\
+Vezměte prosím na vědomí, že některé banky mají pro své klienty jiné limity.
+payment.upi.info.seller=Pokud máte v úmyslu přijmout více než 100 000 rupií za obchod, měli byste počítat s tím, že kupující bude muset provést více převodů. \n\n\
+Vezměte prosím na vědomí, že některé banky mají pro své klienty jiné limity.
+
+payment.celpay.info.account=Nezapomeňte uvést e-mail, na který je váš účet Celsius registrován. \
+ Tím zajistíte, že se při odesílání peněz zobrazí ze správného účtu a při jejich přijímání budou připsány na váš účet.\n\n\
+Uživatelé CelPay mohou poslat maximálně 2500 dolarů (nebo ekvivalent v jiné měně/krypto) za 24 hodin.\n\n\
+Obchody překračující limity účtu CelPay se pravděpodobně budou muset uskutečnit během více než jednoho dne, nebo budou zrušeny.\n\n\
+CelPay podporuje více stablecoinů:\n\n\
+ ● Stablecoiny USD: DAI, TrueUSD, USDC, ZUSD, BUSD, GUSD, PAX, USDT (ERC20)\n\
+ ● Stablecoiny CAD; TrueCAD\n\
+ ● Stablecoiny GBP; TrueGBP\n\
+ ● Stablecoiny HKD; TrueHKD\n\
+ ● Stablecoiny AUD; TrueAUD\n\n\
+Kupující XMR mohou prodávajícímu XMR poslat libovolnou odpovídající měnu stablecoin.
+payment.celpay.info.buyer=Platbu prosím zasílejte pouze na e-mailovou adresu, kterou prodejce XMR uvedl zasláním platebního odkazu.\n\n\
+CelPay je omezena na odeslání 2 500 dolarů (nebo jiné měny/krypto ekvivalentu) za 24 hodin.\n\n\
+Obchody překračující limit účtu CelPay se pravděpodobně budou muset uskutečnit v průběhu více než jednoho dne, nebo budou zrušeny.\n\n\
+CelPay podporuje více stablecoinů:\n\n\
+ ● USD Stablecoiny; DAI, TrueUSD, USDC, ZUSD, BUSD, GUSD, PAX, USDT (ERC20)\n\
+ ● CAD Stablecoiny; TrueCAD\n\
+ ● GBP Stablecoiny; TrueGBP\n\
+ ● HKD Stablecoiny; TrueHKD\n\
+ ● AUD Stablecoiny; TrueAUD\n\n\
+Kupující XMR mohou prodávajícímu XMR poslat libovolnou odpovídající měnu stablecoin.
+payment.celpay.info.seller=Prodejci XMR by měli očekávat, že obdrží platbu prostřednictvím zabezpečeného platebního odkazu. \
+ Ujistěte se, že odkaz na e-mailovou platbu obsahuje e-mailovou adresu zadanou kupujícím XMR.\n\n\
+Uživatelé CelPay mohou poslat maximálně 2500 dolarů (nebo ekvivalent v jiné měně/krypto) za 24 hodin.\n\n\
+Obchody překračující limity účtu CelPay se pravděpodobně budou muset uskutečnit během více než jednoho dne, nebo budou zrušeny.\n\n\
+CelPay podporuje více stablecoinů:\n\n\
+ ● USD Stablecoiny; DAI, TrueUSD, USDC, ZUSD, BUSD, GUSD, PAX, USDT (ERC20)\n\
+ ● CAD Stablecoiny; TrueCAD\n\
+ ● GBP Stablecoiny; TrueGBP\n\
+ ● HKD Stablecoiny; TrueHKD\n\
+ ● AUD Stablecoiny; TrueAUD\n\n\
+Prodávající XMR by měli očekávat, že od kupujícího XMR obdrží odpovídající měnu stablecoin. Je možné, aby kupující XMR zaslal libovolnou odpovídající měnu stablecoin.
+payment.celpay.supportedCurrenciesForReceiver=Podporované měny (Upozornění: všechny níže uvedené měny jsou v aplikaci Celcius podporovány jako stablecoiny. Obchody se týkají stablecoinů, nikoli fiat.)
+
+payment.nequi.info.account=Nezapomeňte uvést své telefonní číslo, které je spojeno s vaším účtem Nequi.\n\n\
+Při zakládání účtu Nequi jsou platební limity nastaveny na maximálně ~ 7 000 000 COP, které lze měsíčně odeslat.\n\n\
+Pokud máte v úmyslu obchodovat s částkou vyšší než 7 000 000 COP na jeden obchod, budete muset u společnosti Bancolombia provést KYC a zaplatit poplatek \
+ ve výši přibližně 15 000 COP. Poté budou všechny transakce zatíženy 0,4% daní. Ujistěte se prosím, že znáte aktuální výši daní.\n\n\
+Uživatelé by také měli znát limity účtu. Pokud obchodujete nad výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+payment.nequi.info.buyer=Platbu prosím zasílejte pouze na telefonní číslo uvedené v účtu XMR prodávajícího na Havenu.\n\n\
+Když si uživatelé založí účet Nequi, jsou limity plateb nastaveny na maximálně ~ 7 000 000 COP, které lze měsíčně odeslat.\n\n\
+Pokud máte v úmyslu obchodovat s částkou vyšší než 7 000 000 COP na jeden obchod, budete muset u společnosti Bancolombia provést KYC a zaplatit poplatek \
+ ve výši přibližně 15 000 COP. Poté budou všechny transakce zatíženy 0,4% daní. Ujistěte se prosím, že znáte aktuální výši daní.\n\n\
+Uživatelé by také měli znát limity účtu. Pokud obchodujete nad výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+payment.nequi.info.seller=Zkontrolujte, zda se přijatá platba shoduje s telefonním číslem uvedeným v účtu XMR kupujícího Haveno.\n\n\
+Když si uživatelé založí účet Nequi, jsou limity plateb nastaveny na maximálně ~ 7 000 000 COP, které lze měsíčně odeslat.\n\n\
+Pokud máte v úmyslu obchodovat s částkou vyšší než 7 000 000 COP na jeden obchod, budete muset u společnosti Bancolombia provést KYC a zaplatit poplatek \
+ ve výši přibližně 15 000 COP. Poté budou všechny transakce zatíženy 0,4% daní. Ujistěte se prosím, že znáte aktuální výši daní.\n\n\
+Uživatelé by také měli znát limity účtu. Pokud obchodujete nad výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+
+payment.bizum.info.account=K využívání služby Bizum potřebujete bankovní účet (IBAN) ve Španělsku a být zaregistrováni pro tuto službu.\n\n\
+Bizum lze použít pro obchody v rozmezí od 0,50 € do 1 000 €.\n\n\
+Maximální částka transakcí, které můžete odeslat/přijmout prostřednictvím služby Bizum, je 2 000 eur denně.\n\n\
+Uživatelé služby Bizum mohou měsíčně provést maximálně 150 operací.\n\n\
+Každá banka však může pro své klienty stanovit vlastní limity v rámci výše uvedených limitů.\n\n\
+Uživatelé by také měli znát limity účtu. Pokud obchodujete nad výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+payment.bizum.info.buyer=Platbu prosím zasílejte pouze na mobilní telefonní číslo prodávajícího XMR uvedené v systému Haveno.\n\n\
+Maximální velikost obchodu je 1 000 € na jednu platbu. Maximální objem transakcí, které můžete prostřednictvím Bizumu odeslat, je 2 000 eur za den.\n\n\
+Pokud překročíte výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+payment.bizum.info.seller=Ujistěte se prosím, že platba byla přijata z mobilního telefonního čísla kupujícího XMR, které je uvedeno v Haveno.\n\n\
+Maximální velikost obchodu je 1 000 EUR na jednu platbu. Maximální objem transakcí, které můžete přijmout pomocí služby Bizum, je 2 000 eur za den.\n\n\
+Pokud obchodujete nad výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+
+payment.pix.info.account=Nezapomeňte uvést vámi vybraný klíč Pix Key. Existují čtyři typy klíčů: \
+ CPF (Registr fyzických osob) nebo CNPJ (Národní registr právnických osob), e-mailová adresa, telefonní číslo nebo \
+ náhodný klíč vygenerovaný systémem, tzv. univerzální jedinečný identifikátor (UUID). Jiný klíč musí být použit pro \
+ každý účet Pix, který máte. Jednotlivci si mohou vytvořit až pět klíčů pro každý účet, který vlastní.\n\n\
+Při obchodování v Haveno by kupující XMR měli používat své klíče Pix v popise platby, aby prodávající XMR mohli snadno identifikovat, že platba pochází od nich.
+payment.pix.info.buyer=Platbu prosím zasílejte pouze na Pix Key uvedený v účtu XMR prodávajícího na Haveno.\n\n\
+Jako referenční číslo platby použijte svůj Pix Key, aby prodejce XMR mohl snadno identifikovat, že platba pochází od vás.
+payment.pix.info.seller=Zkontrolujte, zda se popis přijaté platby shoduje s klíčem Pix uvedeným v účtu XMR kupujícího na Havenu.
+payment.pix.key=Pix Key (CPF, CNPJ, e-mail, telefonní číslo nebo UUID)
+
+payment.monese.info.account=Monese je bankovní aplikace pro uživatele GBP, EUR a RON*. Monese umožňuje uživatelům posílat peníze do \
+ jiných účtů Monese a to okamžitě a zdarma v jakékoli podporované měně.\n\n\
+*Chcete-li si v Monese otevřít účet v RON, musíte buď žít v Rumunsku, nebo mít rumunské občanství.\n\n\
+Při zakládání účtu Monese v Havenu nezapomeňte uvést své jméno a telefonní číslo, které se shoduje s vaším \
+ Monese. Tím zajistíte, že se při odesílání peněz zobrazí ze správného účtu a při přijímání \
+ budou připsány na váš účet.
+payment.monese.info.buyer=Platbu prosím zasílejte pouze na telefonní číslo, které prodejce XMR uvedl ve svém účtu Haveno. Popis platby ponechte nevyplněný.
+payment.monese.info.seller=Prodávající XMR by měli očekávat, že obdrží platbu z telefonního čísla / jména uvedeného v účtu XMR kupujícího Haveno.
+
+payment.satispay.info.account=Pro používání služby Satispay potřebujete bankovní účet (IBAN) v Itálii a být zaregistrován pro tuto službu.\n\n\
+Limity účtu Satispay se nastavují individuálně. Pokud chcete obchodovat se zvýšenými částkami, musíte se obrátit na Satispay.
+ podporu, aby vám zvýšila limity. Uživatelé by si také měli být vědomi limitů na účtu. Pokud obchodujete nad výše uvedené limity, \
+ může být váš obchod zrušen a může být uložena pokuta.
+payment.satispay.info.buyer=Platbu prosím zasílejte pouze na mobilní telefonní číslo prodávajícího XMR uvedené v Haveno.\n\n\
+Limity účtu Satispay jsou nastaveny individuálně. Pokud chcete obchodovat se zvýšenými částkami, musíte se obrátit na Satispay.
+ podporu, aby vám zvýšila limity. Uživatelé by si měli být vědomi také limitů na účtu. Pokud obchodujete nad výše uvedené limity \
+ může být váš obchod zrušen a může být uložena pokuta.
+payment.satispay.info.seller=Ujistěte se prosím, že platba byla přijata z mobilního telefonního čísla / jména kupujícího XMR, jak je uvedeno v Haveno.\n\n\
+Limity účtu Satispay jsou nastaveny individuálně. Pokud chcete obchodovat se zvýšenými částkami, budete muset kontaktovat Satispay \
+ podporu, aby vám zvýšila limity. Uživatelé by si také měli být vědomi limitů na účtu. Pokud obchodujete nad výše uvedené limity \
+ může být váš obchod zrušen a může být uložena pokuta.
+
+payment.tikkie.info.account=K používání Tikkie potřebujete bankovní účet (IBAN) v Nizozemsku a být zaregistrováni pro tuto službu.\n\n\
+Když pošlete žádost o platbu Tikkie konkrétní osobě, můžete požádat o příjem maximálně 750 EUR na Tikkie \
+ žádost. Maximální částka, o kterou můžete požádat během 24 hodin, je 2 500 EUR na jeden účet Tikkie.\n\n\
+Každá banka však může v rámci těchto limitů stanovit pro své klienty vlastní limity.\n\n\
+Uživatelé by si také měli být vědomi limitů na účtech. Pokud obchodujete nad výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+payment.tikkie.info.buyer=Vyžádejte si prosím platební odkaz od prodejce XMR v chatu obchodníků. Jakmile prodejce XMR \
+ zašle platební odkaz, který odpovídá správné částce za obchod, přejděte prosím k platbě.\n\n\
+Když Prodejce XMR požádá o platbu Tikkie, může požádat o platbu maximálně 750 EUR za žádost Tikkie. Pokud \
+ je obchod vyšší než tato částka, bude muset prodejce XMR odeslat více žádostí, aby dosáhl celkové částky obchodu. Maximální částka \
+ o kterou můžete požádat za den, je 2 500 €.\n\n\
+Každá banka však může v rámci těchto limitů stanovit pro své klienty vlastní limity.\n\n\
+Uživatelé by si také měli být vědomi limitů na účtu. Pokud obchodujete nad výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+payment.tikkie.info.seller=Pošlete prosím odkaz na platbu prodejci XMR pomocí chatu obchodníků. Jakmile vám XMR \
+ kupující pošle platbu, zkontrolujte prosím, zda se jeho IBAN shoduje s údaji, které má v Haveno.\n\n\
+Když Prodejce XMR požádá o platbu Tikkie, může požádat maximálně o 750 EUR na jednu žádost Tikkie. Pokud \
+ je obchod vyšší než tato částka, bude muset prodejce XMR odeslat více žádostí, aby dosáhl celkové částky obchodu. Maximální částka \
+ o které můžete požádat za den, je 2 500 €.\n\n\
+Každá banka však může v rámci těchto limitů stanovit pro své klienty další vlastní limity.\n\n\
+Uživatelé by si také měli být vědomi limitů na účtu. Pokud obchodujete nad výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+
+payment.verse.info.account=Verse je způsob platby ve více měnách, který umožňuje odesílat a přijímat platby v EUR, SEK, HUF, DKK, PLN.\n\n\
+Při nastavování účtu Verse v Haveno nezapomeňte uvést uživatelské jméno, které odpovídá vašemu uživatelskému jménu ve \
+ Verse. Tím zajistíte, že se při odesílání peněz zobrazí jako odeslané ze správného účtu a při přijímání \
+ budou připsány na váš účet.\n\n\
+Uživatelé Verse jsou omezeni na odeslání nebo přijetí 10 000 EUR ročně (nebo ekvivalentní částky v cizí měně) pro \
+ kumulované platby odeslané z jejich platebního účtu nebo přijaté na jejich platební účet. Tuto částku může Verse na požádání zvýšit.
+payment.verse.info.buyer=Platbu prosím zasílejte pouze na uživatelské jméno, které prodejce XMR uvedl ve svém účtu Haveno. \
+ Popis platby prosím ponechte prázdný.\n\n\
+Uživatelé Verse jsou omezeni na odeslání nebo přijetí 10 000 EUR ročně (nebo ekvivalentní částky v cizí měně) pro \
+ kumulované platby odeslané z jejich platebního účtu nebo přijaté na jejich platební účet. Tuto částku může Verse na požádání zvýšit.
+payment.verse.info.seller=Prodávající XMR by měli očekávat, že obdrží platbu od uživatelského jména uvedeného v účtu XMR kupujícího na Havenu.\n\n\
+Uživatelé Verse jsou omezeni na odeslání nebo přijetí 10 000 EUR ročně (nebo ekvivalentní částky v cizí měně) pro \
+ kumulované platby odeslané z jejich platebního účtu nebo přijaté na jejich platební účet. Tuto částku může Verse na požádání zvýšit.
+
+payment.achTransfer.info.account=Při přidávání ACH jako platební metody v systému Haveno by se uživatelé měli ujistit, že vědí, \
+ kolik peněz bude odeslání a přijetí ACH převodu stát.
+payment.achTransfer.info.buyer=Ujistěte se, že jste si vědomi, kolik vás bude odeslání ACH převodu stát.\n\n\
+ Při platbě zasílejte pouze na platební údaje uvedené v účtu prodávajícího XMR pomocí převodu ACH.
+payment.achTransfer.info.seller=Ujistěte se prosím, že jste si vědomi toho, kolik vás bude přijetí ACH převodu stát peněz.\n\n\
+ Při přijímání platby zkontrolujte, zda je přijata z účtu kupujícího XMR jako převod ACH.
+
+payment.domesticWire.info.account=Při přidávání tuzemského bankovního převodu jako platební metody v systému Haveno by se uživatelé měli ujistit, že \
+ vědí, kolik je bude stát peněz odeslání a přijetí bankovního převodu.
+payment.domesticWire.info.buyer=Ujistěte se, že jste si vědomi, kolik vás bude odeslání bankovního převodu stát peněz.\n\n\
+ Při platbě zasílejte pouze na platební údaje uvedené v účtu prodávajícího XMR.
+payment.domesticWire.info.seller=Ujistěte se prosím, že jste si vědomi toho, kolik vás bude přijetí bankovního převodu stát peněz.\n\n\
+ Při přijímání platby zkontrolujte, zda byla přijata z účtu kupujícího XMR.
+
+payment.strike.info.account=Nezapomeňte uvést své uživatelské jméno Strike.\n\n\
+V systému Haveno se Strike používá pouze pro platby fiat na fiat.\n\n\
+Ujistěte se prosím, že znáte limity Strike:\n\n\
+Uživatelé, kteří se zaregistrovali pouze se svým e-mailem, jménem a telefonním číslem, mají následující limity:\n\n\
+ ● maximálně 100 USD na vklad\n\n
+ ● Maximální celkový vklad 1000 USD za týden\n\n
+ ● maximálně 100 USD na platbu\n\n\
+Uživatelé mohou své limity zvýšit tím, že společnosti Strike poskytnou více informací. Tito uživatelé mají následující limity:\n\n\n
+ ● 1 000 USD maximálně na jeden vklad\n\
+ ● Maximální celkový objem vkladů za týden ve výši 1 000 USD\n\
+ ● 1 000 USD maximálně za platbu\n\n\
+Pokud obchodujete nad výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+payment.strike.info.buyer=Platbu prosím zasílejte pouze na uživatelské jméno Strike prodávajícího XMR, které je uvedené v Haveno.\n\n\
+Maximální velikost obchodu je 1 000 USD na jednu platbu.\n\n\
+Pokud obchodujete nad výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+payment.strike.info.seller=Ujistěte se, že platba byla přijata z uživatelského jména Strike, které patří XMR kupujícímu a které je uvedeno v Haveno.\n\n\
+Maximální velikost obchodu je 1 000 USD na jednu platbu.\n\n\
+Pokud obchodujete nad výše uvedené limity, může být váš obchod zrušen a může vám být uložena pokuta.
+
+payment.transferwiseUsd.info.account=Vzhledem k bankovní regulaci USA má odesílání a přijímání plateb v USD více omezení \
+ než u většiny ostatních měn. Z tohoto důvodu nebyl USD přidán do platební metody Haveno Wise.\n\n\
+Platební metoda Wise-USD umožňuje uživatelům Haveno obchodovat v USD.\n\n\
+Každý, kdo má účet Wise, formálně Wise, může přidat Wise-USD jako platební metodu v systému Haveno. To umožní \
+ uživateli nakupovat a prodávat XMR za USD.\n\n\
+Při obchodování na Haveno by kupující XMR neměli uvádět v poznámce žádný důvod platby. Pokud je důvod platby vyžadován, \
+ měli by používat pouze celé jméno majitele účtu Wise-USD.
+payment.transferwiseUsd.info.buyer=Platbu prosím zasílejte pouze na e-mailovou adresu uvedenou v účtu Haveno Wise-USD prodávajícího XMR.
+payment.transferwiseUsd.info.seller=Zkontrolujte, zda se přijatá platba shoduje se jménem kupujícího XMR na účtu Wise-USD v systému Haveno.
+
+payment.usPostalMoneyOrder.info=Obchodování pomocí amerických poštovních poukázek (USPMO) na Haveno vyžaduje, abyste rozuměli následujícímu:\n\
+\n\
+- Kupující XMR musí před odesláním napsat jméno prodejce XMR do polí plátce i příjemce a pořídit fotografii USPMO a obálku s dokladem o sledování ve vysokém rozlišení.\n\
+- Kupující XMR musí odeslat USPMO prodejci XMR s potvrzením dodávky.\n\
+\n\
+V případě, že je nutná mediace, nebo pokud dojde k obchodnímu sporu, budete povinni poslat fotografie mediátorovi Haveno nebo zástupci pro vrácení peněz spolu s pořadovým číslem USPMO, číslem pošty a částkou dolaru, aby mohli ověřit podrobnosti na webu US Post Office.\n\n\
+Neposkytnutí požadovaných informací mediátorovi nebo arbitrovi bude mít za následek ztrátu případu sporu.\n\n\
+Ve všech sporných případech nese odesílatel USPMO 100% břemeno odpovědnosti za poskytnutí důkazů mediátorovi nebo arbitrovi.\n\n\
+Pokud těmto požadavkům nerozumíte, neobchodujte pomocí USPMO na Haveno.
+
+payment.payByMail.info=Obchodování pomocí služby Hotovost poštou na Havenu vyžaduje, abyste rozuměli následujícím podmínkám:\n\
+ \n\
+ ● Kupující XMR by měl zabalit hotovost do sáčku na peníze, který je odolný proti manipulaci.\n\
+ ● Kupující XMR by měl natočit nebo vyfotografovat proces balení hotovosti ve vysokém rozlišení s adresou a sledovacím číslem již připevněným na obalu.\n\
+ ● Kupující XMR by měl odeslat balíček s hotovostí prodávajícímu XMR s potvrzením o doručení a příslušným pojištěním.\n\
+ ● Prodávající XMR by měl natočit otevření balíku a ujistit se, že je na videu vidět sledovací číslo poskytnuté odesílatelem.\n\
+ ● Tvůrce nabídky musí uvést veškeré dodatečné podmínky v poli 'Další informace' na platebním účtu.\n\
+ ● Příjemce nabídky přijetím nabídky souhlasí s podmínkami tvůrce nabídky.\n\
+ \n\
+ Obchody Hotovost poštou kladou břemeno jednat čestně rovnoměrně na obě strany.\n\
+ \n\
+ ● Hotovostní poštovní obchody jsou méně ověřitelné než jiné tradiční obchody. To značně ztěžuje řešení sporů.\n\
+ ● Spory se snažte řešit přímo s partnerem pomocí chatu obchodníků. To je nejslibnější cesta k vyřešení jakéhokoli sporu o Hotovost poštou.\n\
+ ● Rozhodci mohou váš případ posoudit a přednést své doporučení, ale NEMOHOU vám zaručeně pomoci.\n\
+ ● Rozhodci rozhodnou na základě důkazů, které jim budou poskytnuty. Proto dodržujte a dokumentujte výše uvedené postupy, abyste měli důkazy pro případ sporu.\n\
+ ● Žádosti o náhradu jakýchkoli ztracených prostředků v důsledku obchodů Hotovost poštou na Haveno NEBUDOU brány v úvahu.\n\
+ \n\
+ Pokud těmto požadavkům nerozumíte, neobchodujte pomocí Hotovost poštou na Haveno.
payment.payByMail.contact=Kontaktní informace
payment.payByMail.contact.prompt=Obálka se jménem nebo pseudonymem by měla být adresována
+payment.payByMail.extraInfo.prompt=Uveďte prosím ve svých nabídkách: \n\n\
+Zemi, ve které se nacházíte (např. Francie); \n\
+Země / regiony, ze kterých byste přijímali obchody (např. Francie, EU nebo jakákoli evropská země); \n\
+Jakékoli zvláštní podmínky; \n\
+Jakékoli další údaje.
+payment.tradingRestrictions=Přečtěte si prosím podmínky tvůrce.\n\
+ Pokud nesplňujete požadavky, nepřijímejte tento obchod.
+payment.cashAtAtm.info=Výběr bez karty: Výběr z bankomatu bez karty a pomocí kódu\n\n\
+ Použití tohoto způsobu platby:\n\n\
+ 1. Vytvořte si platební účet Výběr bez karty a uveďte přijímané banky, regiony nebo jiné podmínky, které se zobrazí u nabídky.\n\n\n\
+ 2. Vytvořte nebo přijměte nabídku s tímto platebním účtem.\n\n\
+ 3. Po přijetí nabídky se domluvte s obchodním partnerem na čase dokončení platby a sdílejte podrobnosti o platbě.\n\n\
+ Pokud se vám nepodaří dokončit transakci, jak je uvedeno v obchodní smlouvě, můžete přijít o část (nebo celou) vaší kauci.
+payment.cashAtAtm.extraInfo.prompt=Uveďte prosím ve svých nabídkách: \n\n\
+Vámi přijímané banky / místa; \n\
+Jakékoli zvláštní podmínky; \n\
+Jakékoli další podrobnosti.
payment.f2f.contact=Kontaktní informace
payment.f2f.contact.prompt=Jak byste chtěli být kontaktováni obchodním partnerem? (e-mailová adresa, telefonní číslo, ...)
-payment.f2f.city=Město pro setkání „tváří v tvář“
+payment.f2f.city=Město pro setkání 'tváří v tvář'
payment.f2f.city.prompt=Město se zobrazí s nabídkou
payment.shared.optionalExtra=Volitelné další informace
-payment.shared.extraInfo=Dodatečné informace
-payment.shared.extraInfo.prompt=Uveďte jakékoli speciální požadavky, podmínky a detaily, které chcete zobrazit u vašich nabídek s tímto platebním účtem. (Uživatelé uvidí tyto informace předtím, než akceptují vaši nabídku.)
-payment.f2f.info=Obchody „tváří v tvář“ mají různá pravidla a přicházejí s jinými riziky než online transakce.\n\nHlavní rozdíly jsou:\n● Obchodní partneři si musí vyměňovat informace o místě a čase schůzky pomocí poskytnutých kontaktních údajů.\n● Obchodní partneři musí přinést své notebooky a na místě setkání potvrdit „platba odeslána“ a „platba přijata“.\n● Pokud má tvůrce speciální „podmínky“, musí uvést podmínky v textovém poli „Další informace“ na účtu.\n● Přijetím nabídky zadavatel souhlasí s uvedenými „podmínkami a podmínkami“ tvůrce.\n● V případě sporu nemůže být mediátor nebo rozhodce příliš nápomocný, protože je obvykle obtížné získat důkazy o tom, co se na schůzce stalo. V takových případech mohou být prostředky XMR uzamčeny na dobu neurčitou nebo dokud se obchodní partneři nedohodnou.\n\nAbyste si byli jisti, že plně rozumíte rozdílům v obchodech „tváří v tvář“, přečtěte si pokyny a doporučení na adrese: [HYPERLINK:https://docs.haveno.exchange/trading-rules.html#f2f-trading]
+payment.shared.extraInfo=Další informace
+payment.shared.extraInfo.offer=Další informace o nabídce
+payment.shared.extraInfo.prompt.paymentAccount=Uveďte jakékoli speciální požadavky, podmínky a detaily, které chcete zobrazit u vašich nabídek s tímto platebním účtem. (Uživatelé uvidí tyto informace předtím, než akceptují vaši nabídku.)
+payment.shared.extraInfo.prompt.offer=Definujte jakékoli speciální podmínky, podmínky nebo detaily, které chcete zobrazit u své nabídky.
+payment.shared.extraInfo.noDeposit=Kontaktní údaje a podmínky nabídky
+payment.f2f.info=Obchody 'tváří v tvář' mají různá pravidla a přicházejí s jinými riziky než online transakce.\n\n\
+ Hlavní rozdíly jsou:\n\
+ ● Obchodní partneři si musí vyměňovat informace o místě a čase schůzky pomocí poskytnutých kontaktních údajů.\n\
+ ● Obchodní partneři musí přinést své notebooky a na místě setkání potvrdit 'platba odeslána' a 'platba přijata'.\n\
+ ● Pokud má tvůrce speciální 'podmínky', musí uvést podmínky v textovém poli 'Další informace' na účtu.\n\
+ ● Přijetím nabídky zadavatel souhlasí s uvedenými 'podmínkami a podmínkami' tvůrce.\n\
+ ● V případě sporu nemůže být mediátor nebo rozhodce příliš nápomocný, protože je obvykle obtížné získat důkazy o tom, co se na schůzce stalo. \
+ V takových případech mohou být prostředky XMR uzamčeny na dobu neurčitou \
+ nebo dokud se obchodní partneři nedohodnou.\n\n\
+ Abyste si byli jisti, že plně rozumíte rozdílům v obchodech 'tváří v tvář', přečtěte si pokyny a doporučení \
+ na adrese: [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/F2F]
payment.f2f.info.openURL=Otevřít webovou stránku
payment.f2f.offerbook.tooltip.countryAndCity=Země a město: {0} / {1}
-payment.f2f.offerbook.tooltip.extra=Další informace: {0}
+payment.shared.extraInfo.tooltip=Další informace: {0}
+payment.ifsc=IFS kód
+payment.ifsc.validation=IFSC formát: XXXX0999999
payment.japan.bank=Banka
payment.japan.branch=Pobočka
@@ -2005,8 +3055,19 @@ payment.japan.account=Účet
payment.japan.recipient=Jméno
payment.australia.payid=PayID
payment.payid=PayID spojené s finanční institucí. Jako e-mailová adresa nebo mobilní telefon.
-payment.payid.info=PayID jako telefonní číslo, e-mailová adresa nebo australské obchodní číslo (ABN), které můžete bezpečně propojit se svou bankou, družstevní záložnou nebo účtem stavební spořitelny. Musíte mít již vytvořený PayID u své australské finanční instituce. Odesílající i přijímající finanční instituce musí podporovat PayID. Další informace najdete na [HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=Chcete-li platit dárkovou kartou Amazon eGift, budete muset prodejci XMR poslat kartu Amazon eGift přes svůj účet Amazon.\n\nHaveno zobrazí e-mail nebo mobilní číslo prodejce XMR, kam bude potřeba odeslat tuto dárkovou kartu. Na kartě ve zprávě pro příjemce musí být uvedeno ID obchodu. Pro další detaily a rady viz wiki: [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card].\n\nZde jsou tři důležité poznámky:\n- Preferujte dárkové karty v hodnotě do 100 USD, protože Amazon může považovat nákupy karet s vyššími částkami jako podezřelé a zablokovat je.\n- Na kartě do zprávy pro příjemce můžete přidat i vlastní originální text (např. "Happy birthday Susan!") spolu s ID obchodu. (V takovém případě o tom informujte protistranu pomocí obchodovacího chatu, aby mohli s jistotou ověřit, že obdržená dárková karta pochází od vás.)\n- Karty Amazon eGift lze uplatnit pouze na té stránce Amazon, na které byly také koupeny (např. karta koupená na amazon.it může být uplatněna zase jen na amazon.it).
+payment.payid.info=PayID jako telefonní číslo, e-mailová adresa nebo australské obchodní číslo (ABN), které můžete bezpečně propojit se svou \
+ bankou, družstevní záložnou nebo účtem stavební spořitelny. Musíte mít již vytvořený PayID u své australské finanční instituce. \
+ Odesílající i přijímající finanční instituce musí podporovat PayID. Další informace najdete na [HYPERLINK:https://payid.com.au/faqs/]
+payment.amazonGiftCard.info=Chcete-li platit dárkovou kartou Amazon eGift, budete muset prodejci XMR poslat kartu Amazon eGift přes svůj účet Amazon.\n\n\
+ Podívejte se do wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] pro podrobnosti a rady.\n\n\
+ Zde jsou tři důležité poznámky:\n\
+ - Preferujte dárkové karty v hodnotě do 100 USD, protože Amazon může považovat nákupy karet s vyššími částkami jako podezřelé a zablokovat je.\n\
+ - Na kartě do zprávy pro příjemce můžete přidat i vlastní originální text (např. "Happy birthday Susan!") spolu s ID obchodu (v takovém případě \
+ o tom informujte protistranu pomocí obchodovacího chatu, aby mohli s jistotou ověřit, že obdržená dárková karta pochází od vás.)\n\
+ - Karty Amazon eGift lze uplatnit pouze na té stránce Amazon, na které byly také koupeny (např. karta koupená na amazon.it může být uplatněna zase jen na amazon.it).
+payment.paysafe.info=Pro vaši ochranu důrazně nedoporučujeme používat Paysafecard PINy pro platby.\n\n\
+ Transakce provedené pomocí PINů nelze nezávisle ověřit pro řešení sporů. Pokud nastane problém, obnova prostředků nemusí být možná.\n\n\
+ Pro zajištění bezpečnosti transakcí a podpory řešení sporů vždy používejte platební metody, které poskytují ověřitelné záznamy.
# We use constants from the code so we do not use our normal naming convention
@@ -2017,8 +3078,9 @@ NATIONAL_BANK=Národní bankovní převod
SAME_BANK=Převod ve stejné bance
SPECIFIC_BANKS=Převody u konkrétních bank
US_POSTAL_MONEY_ORDER=Poukázka US Postal
-CASH_DEPOSIT=Vklad hotovosti na účet prodávajícího
-PAY_BY_MAIL=Odeslání hotovosti poštou
+CASH_DEPOSIT=Vklad hotovosti
+PAY_BY_MAIL=Hotovost poštou
+CASH_AT_ATM=Hotovost u bankomatu
MONEY_GRAM=MoneyGram
WESTERN_UNION=Western Union
F2F=Tváří v tvář (osobně)
@@ -2038,6 +3100,8 @@ CASH_DEPOSIT_SHORT=Vklad hotovosti
# suppress inspection "UnusedProperty"
PAY_BY_MAIL_SHORT=Hotovost poštou
# suppress inspection "UnusedProperty"
+CASH_AT_ATM_SHORT=Hotovost u bankomatu
+# suppress inspection "UnusedProperty"
MONEY_GRAM_SHORT=MoneyGram
# suppress inspection "UnusedProperty"
WESTERN_UNION_SHORT=Western Union
@@ -2066,7 +3130,7 @@ WECHAT_PAY=WeChat Pay
# suppress inspection "UnusedProperty"
SEPA=SEPA
# suppress inspection "UnusedProperty"
-SEPA_INSTANT=SEPA Okamžité platby
+SEPA_INSTANT=SEPA okamžité platby
# suppress inspection "UnusedProperty"
FASTER_PAYMENTS=Faster Payments
# suppress inspection "UnusedProperty"
@@ -2086,11 +3150,55 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
+# suppress inspection "UnusedProperty"
+TRANSFERWISE_USD=Wise-USD
+# suppress inspection "UnusedProperty"
+PAYSERA=Paysera
+# suppress inspection "UnusedProperty"
+PAXUM=Paxum
+# suppress inspection "UnusedProperty"
+NEFT=India/NEFT
+# suppress inspection "UnusedProperty"
+RTGS=India/RTGS
+# suppress inspection "UnusedProperty"
+IMPS=India/IMPS
+# suppress inspection "UnusedProperty"
+UPI=India/UPI
+# suppress inspection "UnusedProperty"
+PAYTM=India/PayTM
+# suppress inspection "UnusedProperty"
+NEQUI=Nequi
+# suppress inspection "UnusedProperty"
+BIZUM=Bizum
+# suppress inspection "UnusedProperty"
+PIX=Pix
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=Amazon eGift Card
# suppress inspection "UnusedProperty"
-BLOCK_CHAINS_INSTANT=Instantní kryptoměny
+BLOCK_CHAINS_INSTANT=Kryptoměny okamžité
+# suppress inspection "UnusedProperty"
+CAPITUAL=Capitual
+# suppress inspection "UnusedProperty"
+CELPAY=CelPay
+# suppress inspection "UnusedProperty"
+MONESE=Monese
+# suppress inspection "UnusedProperty"
+SATISPAY=Satispay
+# suppress inspection "UnusedProperty"
+TIKKIE=Tikkie
+# suppress inspection "UnusedProperty"
+VERSE=Verse
+# suppress inspection "UnusedProperty"
+STRIKE=Strike
+# suppress inspection "UnusedProperty"
+SWIFT=SWIFT mezinárodní bankovní převod
+# suppress inspection "UnusedProperty"
+ACH_TRANSFER=ACH Transfer
+# suppress inspection "UnusedProperty"
+DOMESTIC_WIRE_TRANSFER=Domestic Wire Transfer
+# suppress inspection "UnusedProperty"
+BSQ_SWAP=BSQ Swap
# Deprecated: Cannot be deleted as it would break old trade history entries
# suppress inspection "UnusedProperty"
@@ -2099,7 +3207,7 @@ OK_PAY=OKPay
CASH_APP=Cash App
# suppress inspection "UnusedProperty"
VENMO=Venmo
-
+PAYPAL=PayPal
# suppress inspection "UnusedProperty"
UPHOLD_SHORT=Uphold
@@ -2138,11 +3246,55 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
+# suppress inspection "UnusedProperty"
+TRANSFERWISE_USD_SHORT=Wise-USD
+# suppress inspection "UnusedProperty"
+PAYSERA_SHORT=Paysera
+# suppress inspection "UnusedProperty"
+PAXUM_SHORT=Paxum
+# suppress inspection "UnusedProperty"
+NEFT_SHORT=NEFT
+# suppress inspection "UnusedProperty"
+RTGS_SHORT=RTGS
+# suppress inspection "UnusedProperty"
+IMPS_SHORT=IMPS
+# suppress inspection "UnusedProperty"
+UPI_SHORT=UPI
+# suppress inspection "UnusedProperty"
+PAYTM_SHORT=PayTM
+# suppress inspection "UnusedProperty"
+NEQUI_SHORT=Nequi
+# suppress inspection "UnusedProperty"
+BIZUM_SHORT=Bizum
+# suppress inspection "UnusedProperty"
+PIX_SHORT=Pix
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=Amazon eGift Card
# suppress inspection "UnusedProperty"
-BLOCK_CHAINS_INSTANT_SHORT=Instantní kryptoměny
+BLOCK_CHAINS_INSTANT_SHORT=Kryptoměny okamžité
+# suppress inspection "UnusedProperty"
+CAPITUAL_SHORT=Capitual
+# suppress inspection "UnusedProperty"
+CELPAY_SHORT=CelPay
+# suppress inspection "UnusedProperty"
+MONESE_SHORT=Monese
+# suppress inspection "UnusedProperty"
+SATISPAY_SHORT=Satispay
+# suppress inspection "UnusedProperty"
+TIKKIE_SHORT=Tikkie
+# suppress inspection "UnusedProperty"
+VERSE_SHORT=Verse
+# suppress inspection "UnusedProperty"
+STRIKE_SHORT=Strike
+# suppress inspection "UnusedProperty"
+SWIFT_SHORT=SWIFT
+# suppress inspection "UnusedProperty"
+ACH_TRANSFER_SHORT=ACH
+# suppress inspection "UnusedProperty"
+DOMESTIC_WIRE_TRANSFER_SHORT=Domestic Wire
+# suppress inspection "UnusedProperty"
+BSQ_SWAP_SHORT=BSQ Swap
# Deprecated: Cannot be deleted as it would break old trade history entries
# suppress inspection "UnusedProperty"
@@ -2151,6 +3303,7 @@ OK_PAY_SHORT=OKPay
CASH_APP_SHORT=Cash App
# suppress inspection "UnusedProperty"
VENMO_SHORT=Venmo
+PAYPAL_SHORT=PayPal
####################################################################
@@ -2205,6 +3358,7 @@ validation.iban.checkSumNotNumeric=Kontrolní součet musí být číselný
validation.iban.nonNumericChars=Byl zjištěn nealfanumerický znak
validation.iban.checkSumInvalid=Kontrolní součet IBAN je neplatný
validation.iban.invalidLength=Číslo musí mít délku 15 až 34 znaků.
+validation.iban.sepaNotSupported=SEPA není v této zemi podporována
validation.interacETransfer.invalidAreaCode=Non-kanadské směrové číslo oblasti
validation.interacETransfer.invalidPhone=Zadejte platné 11místné telefonní číslo (např. 1-123-456-7890) nebo e-mailovou adresu
validation.interacETransfer.invalidQuestion=Musí obsahovat pouze písmena, čísla, mezery a/nebo symboly ' _ , . ? -
@@ -2227,5 +3381,8 @@ validation.phone.missingCountryCode=K ověření telefonního čísla je potřeb
validation.phone.invalidCharacters=Telefonní číslo {0} obsahuje neplatné znaky
validation.phone.insufficientDigits=V čísle {0} není dostatek číslic, aby mohlo být platné telefonní číslo
validation.phone.tooManyDigits=V čísle {0} je příliš mnoho číslic, než aby mohlo být platné telefonní číslo
-validation.phone.invalidDialingCode=Telefonní předvolba země pro číslo {0} je pro zemi {1} neplatná. Správné předčíslí je {2}.
+validation.phone.invalidDialingCode=Telefonní předvolba země pro číslo {0} je pro zemi {1} neplatná. \
+ Správné předčíslí je {2}.
validation.invalidAddressList=Seznam platných adres musí být oddělený čárkami
+validation.capitual.invalidFormat=Musí jít o platný kód formátu CAP: CAP-XXXXXX (6 alfanumerických znaků).
+
diff --git a/core/src/main/resources/i18n/displayStrings_de.properties b/core/src/main/resources/i18n/displayStrings_de.properties
index 7a7a5643af..c19f183f47 100644
--- a/core/src/main/resources/i18n/displayStrings_de.properties
+++ b/core/src/main/resources/i18n/displayStrings_de.properties
@@ -40,6 +40,8 @@ shared.buyMonero=Monero kaufen
shared.sellMonero=Monero verkaufen
shared.buyCurrency={0} kaufen
shared.sellCurrency={0} verkaufen
+shared.buyCurrencyLocked={0} kaufen 🔒
+shared.sellCurrencyLocked={0} verkaufen 🔒
shared.buyingXMRWith=kaufe XMR mit {0}
shared.sellingXMRFor=verkaufe XMR für {0}
shared.buyingCurrency=kaufe {0} (verkaufe XMR)
@@ -186,7 +188,7 @@ shared.total=Insgesamt
shared.totalsNeeded=Benötigte Gelder
shared.tradeWalletAddress=Adresse der Handels-Wallet
shared.tradeWalletBalance=Guthaben der Handels-Wallet
-shared.reserveExactAmount=Reservieren Sie nur die benötigten Mittel. Es kann erforderlich sein, eine Mining-Gebühr zu zahlen und 10 Bestätigungen (~20 Minuten) abzuwarten, bevor Ihr Angebot aktiv ist.
+shared.reserveExactAmount=Reserviere nur die notwendigen Mittel. Erfordert eine Mining-Gebühr und ca. 20 Minuten, bevor dein Angebot live geht.
shared.makerTxFee=Ersteller: {0}
shared.takerTxFee=Abnehmer: {0}
shared.iConfirm=Ich bestätige
@@ -330,6 +332,7 @@ offerbook.createOffer=Angebot erstellen
offerbook.takeOffer=Angebot annehmen
offerbook.takeOfferToBuy=Angebot annehmen {0} zu kaufen
offerbook.takeOfferToSell=Angebot annehmen {0} zu verkaufen
+offerbook.takeOffer.enterChallenge=Geben Sie das Angebots-Passphrase ein
offerbook.trader=Händler
offerbook.offerersBankId=Bankkennung des Erstellers (BIC/SWIFT): {0}
offerbook.offerersBankName=Bankname des Erstellers: {0}
@@ -340,6 +343,8 @@ offerbook.availableOffers=Verfügbare Angebote
offerbook.filterByCurrency=Nach Währung filtern
offerbook.filterByPaymentMethod=Nach Zahlungsmethode filtern
offerbook.matchingOffers=Angebote die meinen Zahlungskonten entsprechen
+offerbook.filterNoDeposit=Kein Deposit
+offerbook.noDepositOffers=Angebote ohne Einzahlung (Passphrase erforderlich)
offerbook.timeSinceSigning=Informationen zum Zahlungskonto
offerbook.timeSinceSigning.info=Dieses Konto wurde verifiziert und {0}
offerbook.timeSinceSigning.info.arbitrator=von einem Vermittler unterzeichnet und kann Partner-Konten unterzeichnen
@@ -485,7 +490,10 @@ createOffer.setDepositAsBuyer=Meine Kaution als Käufer festlegen (%)
createOffer.setDepositForBothTraders=Legen Sie die Kaution für beide Handelspartner fest (%)
createOffer.securityDepositInfo=Die Kaution ihres Käufers wird {0}
createOffer.securityDepositInfoAsBuyer=Ihre Kaution als Käufer wird {0}
-createOffer.minSecurityDepositUsed=Min. Kaution des Käufers wird verwendet
+createOffer.minSecurityDepositUsed=Der Mindest-Sicherheitsbetrag wird verwendet.
+createOffer.buyerAsTakerWithoutDeposit=Kein Deposit erforderlich vom Käufer (Passphrase geschützt)
+createOffer.myDeposit=Meine Sicherheitsleistung (%)
+createOffer.myDepositInfo=Ihre Sicherheitsleistung beträgt {0}
####################################################################
@@ -509,6 +517,8 @@ takeOffer.fundsBox.networkFee=Gesamte Mining-Gebühr
takeOffer.fundsBox.takeOfferSpinnerInfo=Angebot annehmen: {0}
takeOffer.fundsBox.paymentLabel=Haveno-Handel mit der ID {0}
takeOffer.fundsBox.fundsStructure=({0} Kaution, {1} Handelsgebühr, {2} Mining-Gebühr)
+takeOffer.fundsBox.noFundingRequiredTitle=Keine Finanzierung erforderlich
+takeOffer.fundsBox.noFundingRequiredDescription=Holen Sie sich das Angebots-Passwort vom Verkäufer außerhalb von Haveno, um dieses Angebot anzunehmen.
takeOffer.success.headline=Sie haben erfolgreich ein Angebot angenommen.
takeOffer.success.info=Sie können den Status Ihres Trades unter \"Portfolio/Offene Trades\" einsehen.
takeOffer.error.message=Bei der Angebotsannahme trat ein Fehler auf.\n\n{0}
@@ -630,7 +640,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=WICHTIGE VORAUSSETZUNG: \nNachd
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=Bitte senden Sie {0} per \"US Postal Money Order\" an den XMR-Verkäufer.\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Bitte schicken Sie {0} Bargeld per Post an den XMR Verkäufer. Genaue Anweisungen finden Sie im Handelsvertrag, oder Sie stellen über den Handels-Chat Fragen, wenn etwas unklar ist. Weitere Informationen über \"Bargeld per Post\" finden Sie im Haveno-Wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Bitte schicken Sie {0} Bargeld per Post an den XMR Verkäufer. Genaue Anweisungen finden Sie im Handelsvertrag, oder Sie stellen über den Handels-Chat Fragen, wenn etwas unklar ist. Weitere Informationen über \"Bargeld per Post\" finden Sie im Haveno-Wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Bitte zahlen Sie {0} mit der gewählten Zahlungsmethode an den XMR Verkäufer. Sie finden die Konto Details des Verkäufers im nächsten Fenster.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1464,6 +1474,7 @@ offerDetailsWindow.confirm.maker=Bestätigen: Anbieten monero zu {0}
offerDetailsWindow.confirm.taker=Bestätigen: Angebot annehmen monero zu {0}
offerDetailsWindow.creationDate=Erstellungsdatum
offerDetailsWindow.makersOnion=Onion-Adresse des Erstellers
+offerDetailsWindow.challenge=Angebots-Passphrase
qRCodeWindow.headline=QR Code
qRCodeWindow.msg=Bitte nutzen Sie diesen QR Code um Ihr Haveno Wallet von Ihrem externen Wallet aufzuladen.
@@ -1504,7 +1515,7 @@ tacWindow.disagree=Ich stimme nicht zu und beende
tacWindow.arbitrationSystem=Streitbeilegung
tradeDetailsWindow.headline=Handel
-tradeDetailsWindow.disputedPayoutTxId=Transaktions-ID der strittigen Auszahlung:
+tradeDetailsWindow.disputedPayoutTxId=Transaktions-ID der strittigen Auszahlung
tradeDetailsWindow.tradeDate=Handelsdatum
tradeDetailsWindow.txFee=Mining-Gebühr
tradeDetailsWindow.tradePeersOnion=Onion-Adresse des Handelspartners
@@ -1577,7 +1588,7 @@ popup.headline.error=Fehler
popup.doNotShowAgain=Nicht erneut anzeigen
popup.reportError.log=Protokolldatei öffnen
popup.reportError.gitHub=Auf GitHub-Issue-Tracker melden
-popup.reportError={0}\n\nUm uns bei der Verbesserung der Software zu helfen, erstellen Sie bitte einen Fehler-Bericht auf https://github.com/bisq-network/bisq/issues.\nDie Fehlermeldung wird in die Zwischenablage kopiert, wenn Sie auf einen der Knöpfe unten klicken.\nEs wird das Debuggen einfacher machen, wenn Sie die haveno.log Datei anfügen indem Sie "Logdatei öffnen" klicken, eine Kopie speichern und diese dem Fehler-Bericht anfügen.
+popup.reportError={0}\n\nUm uns bei der Verbesserung der Software zu helfen, erstellen Sie bitte einen Fehler-Bericht auf https://github.com/haveno-dex/haveno/issues.\nDie Fehlermeldung wird in die Zwischenablage kopiert, wenn Sie auf einen der Knöpfe unten klicken.\nEs wird das Debuggen einfacher machen, wenn Sie die haveno.log Datei anfügen indem Sie "Logdatei öffnen" klicken, eine Kopie speichern und diese dem Fehler-Bericht anfügen.
popup.error.tryRestart=Versuchen Sie bitte Ihre Anwendung neu zu starten und überprüfen Sie Ihre Netzwerkverbindung um zu sehen, ob Sie das Problem beheben können.
popup.error.takeOfferRequestFailed=Es ist ein Fehler aufgetreten, als jemand versuchte eins Ihrer Angebote anzunehmen:\n{0}
@@ -1620,7 +1631,7 @@ popup.warning.nodeBanned=Einer der {0} Nodes wurde gebannt.
popup.warning.priceRelay=Preisrelais
popup.warning.seed=Seed
popup.warning.mandatoryUpdate.trading=Bitte aktualisieren Sie auf die neueste Haveno-Version. Es wurde ein obligatorisches Update veröffentlicht, das den Handel mit alten Versionen deaktiviert. Bitte besuchen Sie das Haveno-Forum für weitere Informationen.
-popup.warning.noFilter=Wir haben kein Filterobjekt von den Seed Nodes erhalten. Diese Situation ist unerwartet. Bitte informieren Sie die Haveno Entwickler.
+popup.warning.noFilter=Wir haben kein Filterobjekt von den Seed-Knoten erhalten. Bitte informieren Sie die Netzwerkadministratoren, ein Filterobjekt zu registrieren.
popup.warning.burnXMR=Die Transaktion ist nicht möglich, da die Mininggebühren von {0} den übertragenen Betrag von {1} überschreiten würden. Bitte warten Sie, bis die Gebühren wieder niedrig sind, oder Sie mehr XMR zum übertragen angesammelt haben.
popup.warning.openOffer.makerFeeTxRejected=Die Verkäufergebühren-Transaktion für das Angebot mit der ID {0} wurde vom Monero-Netzwerk abgelehnt.\nTransaktions-ID={1}.\nDas Angebot wurde entfernt, um weitere Probleme zu vermeiden.\nBitte gehen Sie zu \"Einstellungen/Netzwerkinformationen\" und führen Sie eine SPV-Resynchronisierung durch.\nFür weitere Hilfe wenden Sie sich bitte an den Haveno-Support-Kanal des Haveno Keybase Teams.
@@ -1690,6 +1701,9 @@ popup.accountSigning.unsignedPubKeys.signed=Pubkeys wurden unterzeichnet
popup.accountSigning.unsignedPubKeys.result.signed=Unterzeichnete Pubkeys
popup.accountSigning.unsignedPubKeys.result.failed=Unterzeichnung fehlgeschlagen
+popup.info.buyerAsTakerWithoutDeposit.headline=Kein Depositum vom Käufer erforderlich
+popup.info.buyerAsTakerWithoutDeposit=Ihr Angebot erfordert keine Sicherheitsleistung oder Gebühr vom XMR-Käufer.\n\nUm Ihr Angebot anzunehmen, müssen Sie ein Passwort mit Ihrem Handelspartner außerhalb von Haveno teilen.\n\nDas Passwort wird automatisch generiert und nach der Erstellung in den Angebotsdetails angezeigt.
+
####################################################################
# Notifications
####################################################################
@@ -1815,6 +1829,7 @@ navigation.support=\"Support\"
formatter.formatVolumeLabel={0} Betrag{1}
formatter.makerTaker=Ersteller als {0} {1} / Abnehmer als {2} {3}
+formatter.makerTakerLocked=Ersteller als {0} {1} / Abnehmer als {2} {3} 🔒
formatter.youAreAsMaker=Sie sind: {1} {0} (Ersteller) / Abnehmer ist: {3} {2}
formatter.youAreAsTaker=Sie sind: {1} {0} (Abnehmer) / Ersteller ist: {3} {2}
formatter.youAre=Sie {0} {1} ({2} {3})
@@ -1962,8 +1977,6 @@ payment.accountType=Kontotyp
payment.checking=Überprüfe
payment.savings=Ersparnisse
payment.personalId=Personalausweis
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelle ist ein Geldtransferdienst, der am besten *durch* eine andere Bank funktioniert.\n\n1. Sehen Sie auf dieser Seite nach, ob (und wie) Ihre Bank mit Zelle zusammenarbeitet:\nhttps://www.zellepay.com/get-started\n\n2. Achten Sie besonders auf Ihre Überweisungslimits - die Sendelimits variieren je nach Bank, und die Banken geben oft separate Tages-, Wochen- und Monatslimits an.\n\n3. Wenn Ihre Bank nicht mit Zelle zusammenarbeitet, können Sie die Zahlungsmethode trotzdem über die Zelle Mobile App benutzen, aber Ihre Überweisungslimits werden viel niedriger sein.\n\n4. Der auf Ihrem Haveno-Konto angegebene Name MUSS mit dem Namen auf Ihrem Zelle/Bankkonto übereinstimmen. \n\nWenn Sie eine Zelle Transaktion nicht wie in Ihrem Handelsvertrag angegeben durchführen können, verlieren Sie möglicherweise einen Teil (oder die gesamte) Sicherheitskaution.\n\nWegen des etwas höheren Chargeback-Risikos von Zelle wird Verkäufern empfohlen, nicht unterzeichnete Käufer per E-Mail oder SMS zu kontaktieren, um zu überprüfen, ob der Käufer wirklich das in Haveno angegebene Zelle-Konto besitzt.
payment.fasterPayments.newRequirements.info=Einige Banken haben damit begonnen, den vollständigen Namen des Empfängers für Faster Payments Überweisungen zu überprüfen. Ihr aktuelles Faster Payments-Konto gibt keinen vollständigen Namen an.\n\nBitte erwägen Sie, Ihr Faster Payments-Konto in Haveno neu einzurichten, um zukünftigen {0} Käufern einen vollständigen Namen zu geben.\n\nWenn Sie das Konto neu erstellen, stellen Sie sicher, dass Sie die genaue Bankleitzahl, Kontonummer und die "Salt"-Werte für die Altersverifikation von Ihrem alten Konto auf Ihr neues Konto kopieren. Dadurch wird sichergestellt, dass das Alter und der Unterschriftsstatus Ihres bestehenden Kontos erhalten bleiben.
payment.moneyGram.info=Bei der Nutzung von MoneyGram, muss der XMR Käufer die MoneyGram Zulassungsnummer und ein Foto der Quittung per E-Mail an den XMR-Verkäufer senden. Die Quittung muss den vollständigen Namen, das Land, das Bundesland des Verkäufers und den Betrag deutlich zeigen. Der Käufer bekommt die E-Mail-Adresse des Verkäufers im Handelsprozess angezeigt.
@@ -1980,6 +1993,10 @@ payment.revolut.info=Revolut benötigt den "Benutzernamen" als Account ID und ni
payment.account.revolut.addUserNameInfo={0}\nDein existierendes Revolut Konto ({1}) hat keinen "Benutzernamen".\nBitte geben Sie Ihren Revolut "Benutzernamen" ein um Ihre Kontodaten zu aktualisieren.\nDas wird Ihr Kontoalter und die Verifizierung nicht beeinflussen.
payment.revolut.addUserNameInfo.headLine=Revolut Account updaten
+payment.cashapp.info=Bitte beachten Sie, dass Cash App ein höheres Rückbuchungsrisiko hat als die meisten Banküberweisungen.
+payment.venmo.info=Bitte beachten Sie, dass Venmo ein höheres Rückbuchungsrisiko hat als die meisten Banküberweisungen.
+payment.paypal.info=Bitte beachten Sie, dass PayPal ein höheres Rückbuchungsrisiko hat als die meisten Banküberweisungen.
+
payment.amazonGiftCard.upgrade=Bei der Zahlungsmethode Amazon Geschenkkarten muss das Land angegeben werden.
payment.account.amazonGiftCard.addCountryInfo={0}\nDein bestehendes Amazon Geschenkkarten Konto ({1}) wurde keinem Land zugeteilt.\nBitte geben Sie das Amazon Geschenkkarten Land ein um Ihre Kontodaten zu aktualisieren.\nDas wird ihr Kontoalter nicht beeinflussen.
payment.amazonGiftCard.upgrade.headLine=Amazon Geschenkkarte Konto updaten
@@ -2013,11 +2030,14 @@ payment.f2f.city=Stadt für ein "Angesicht zu Angesicht" Treffen
payment.f2f.city.prompt=Die Stadt wird mit dem Angebot angezeigt
payment.shared.optionalExtra=Freiwillige zusätzliche Informationen
payment.shared.extraInfo=Zusätzliche Informationen
-payment.shared.extraInfo.prompt=Gib spezielle Bedingungen, Abmachungen oder Details die bei ihren Angeboten unter diesem Zahlungskonto angezeigt werden sollen an. Nutzer werden diese Informationen vor der Annahme des Angebots sehen.
+payment.shared.extraInfo.offer=Zusätzliche Angebotsinformationen
+payment.shared.extraInfo.prompt.paymentAccount=Gib spezielle Bedingungen, Abmachungen oder Details die bei ihren Angeboten unter diesem Zahlungskonto angezeigt werden sollen an. Nutzer werden diese Informationen vor der Annahme des Angebots sehen.
+payment.shared.extraInfo.prompt.offer=Definieren Sie alle speziellen Begriffe, Bedingungen oder Details, die Sie mit Ihrem Angebot anzeigen möchten.
+payment.shared.extraInfo.noDeposit=Kontaktdaten und Angebotsbedingungen
payment.f2f.info=Persönliche 'Face to Face' Trades haben unterschiedliche Regeln und sind mit anderen Risiken verbunden als gewöhnliche Online-Trades.\n\nDie Hauptunterschiede sind:\n● Die Trading Partner müssen die Kontaktdaten und Informationen über den Ort und die Uhrzeit des Treffens 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 Ersteller eines Angebots 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 Arbitrator nicht viel tun, da es in der Regel schwierig ist zu bestimmen, was beim Treffen passiert ist. In solchen Fällen können die Monero auf unbestimmte Zeit oder bis zu einer Einigung der Trading Peers gesperrt werden.\n\nUm sicherzustellen, dass Sie die Besonderheiten der persönlichen 'Face to Face' Trades vollständig verstehen, lesen Sie bitte die Anweisungen und Empfehlungen unter: [HYPERLINK:https://docs.haveno.exchange/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.shared.extraInfo.tooltip=Zusätzliche Informationen: {0}
payment.japan.bank=Bank
payment.japan.branch=Filiale
@@ -2026,7 +2046,10 @@ payment.japan.recipient=Name
payment.australia.payid=PayID
payment.payid=PayIDs wie E-Mail Adressen oder Telefonnummern die mit Finanzinstitutionen verbunden sind.
payment.payid.info=Eine PayID wie eine Telefonnummer, E-Mail Adresse oder Australische Business Number (ABN) mit der Sie sicher Ihre Bank, Kreditgenossenschaft oder Bausparkassenkonto verlinken können. Sie müssen bereits eine PayID mit Ihrer Australischen Finanzinstitution erstellt haben. Beide Institutionen, die die sendet und die die empfängt, müssen PayID unterstützen. Weitere informationen finden Sie unter [HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=Um mit einer Amazon eGift Geschenkkarte zu bezahlen, müssen Sie eine Amazon eGift Geschenkkarte über Ihr Amazon-Konto an den XMR-Verkäufer senden. \n\nHaveno zeigt die E-Mail-Adresse oder Telefonnummer des XMR-Verkäufers an, an die die Geschenkkarte gesendet werden soll, und Sie müssen die Handels-ID in das Nachrichtenfeld der Geschenkkarte eintragen. Bitte lesen Sie das Wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] für weitere Details und empfohlene Vorgehensweisen. \n\nDrei wichtige Hinweise:\n- Versuchen Sie Geschenkkarten mit Beträgen von 100 USD oder weniger zu versenden, weil Amazon größere Geschenkkarten gerne als betrügerisch kennzeichnet\n- Versuchen Sie einen kreativen, glaubwürdigen Text für die Nachricht der Geschenkkarten zu verwenden (z.B. "Alles Gute zum Geburtstag Susi!"), zusammen mit der Handels-ID (und verwenden Sie den Handels-Chat, um Ihrem Handelspartner den von Ihnen gewählten Referenztext mitzuteilen, damit er Ihre Zahlung überprüfen kann)\n- Amazon Geschenkkarten können nur auf der Amazon-Website eingelöst werden, auf der sie gekauft wurden (z. B. kann eine auf amazon.it gekaufte Geschenkkarte nur auf amazon.it eingelöst werden)
+payment.amazonGiftCard.info=Um mit einer Amazon eGift Geschenkkarte zu bezahlen, müssen Sie eine Amazon eGift Geschenkkarte über Ihr Amazon-Konto an den XMR-Verkäufer senden. \n\nHaveno zeigt die E-Mail-Adresse oder Telefonnummer des XMR-Verkäufers an, an die die Geschenkkarte gesendet werden soll, und Sie müssen die Handels-ID in das Nachrichtenfeld der Geschenkkarte eintragen. Bitte lesen Sie das Wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] für weitere Details und empfohlene Vorgehensweisen. \n\nDrei wichtige Hinweise:\n- Versuchen Sie Geschenkkarten mit Beträgen von 100 USD oder weniger zu versenden, weil Amazon größere Geschenkkarten gerne als betrügerisch kennzeichnet\n- Versuchen Sie einen kreativen, glaubwürdigen Text für die Nachricht der Geschenkkarten zu verwenden (z.B. "Alles Gute zum Geburtstag Susi!"), zusammen mit der Handels-ID (und verwenden Sie den Handels-Chat, um Ihrem Handelspartner den von Ihnen gewählten Referenztext mitzuteilen, damit er Ihre Zahlung überprüfen kann)\n- Amazon Geschenkkarten können nur auf der Amazon-Website eingelöst werden, auf der sie gekauft wurden (z. B. kann eine auf amazon.it gekaufte Geschenkkarte nur auf amazon.it eingelöst werden)
+payment.paysafe.info=Zum Schutz Ihrer Sicherheit raten wir dringend davon ab, Paysafecard-PINs für Zahlungen zu verwenden.\n\n\
+ Transaktionen, die über PINs durchgeführt werden, können nicht unabhängig zur Streitbeilegung überprüft werden. Wenn ein Problem auftritt, kann die Rückerstattung von Geldern möglicherweise nicht möglich sein.\n\n\
+ Um die Transaktionssicherheit mit Streitbeilegung zu gewährleisten, verwenden Sie immer Zahlungsmethoden, die überprüfbare Aufzeichnungen bieten.
# We use constants from the code so we do not use our normal naming convention
@@ -2106,7 +2129,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=Amazon Gift-Karte
# suppress inspection "UnusedProperty"
@@ -2158,7 +2181,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=Amazon Gift-Karte
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_es.properties b/core/src/main/resources/i18n/displayStrings_es.properties
index 2ff762f847..5174d8b022 100644
--- a/core/src/main/resources/i18n/displayStrings_es.properties
+++ b/core/src/main/resources/i18n/displayStrings_es.properties
@@ -40,6 +40,8 @@ shared.buyMonero=Comprar monero
shared.sellMonero=Vender monero
shared.buyCurrency=Comprar {0}
shared.sellCurrency=Vender {0}
+shared.buyCurrencyLocked=Comprar {0} 🔒
+shared.sellCurrencyLocked=Vender {0} 🔒
shared.buyingXMRWith=Comprando XMR con {0}
shared.sellingXMRFor=Vendiendo XMR por {0}
shared.buyingCurrency=comprando {0} (Vendiendo XMR)
@@ -186,7 +188,7 @@ shared.total=Total
shared.totalsNeeded=Fondos necesarios
shared.tradeWalletAddress=Dirección de la cartera para intercambio
shared.tradeWalletBalance=Saldo de la cartera de intercambio
-shared.reserveExactAmount=Reserve solo los fondos necesarios. Podría requerir una tarifa de minería y 10 confirmaciones (~20 minutos) antes de que su oferta esté activa.
+shared.reserveExactAmount=Reserve solo los fondos necesarios. Requiere una tarifa de minería y aproximadamente 20 minutos antes de que tu oferta se haga pública.
shared.makerTxFee=Creador: {0}
shared.takerTxFee=Tomador: {0}
shared.iConfirm=Confirmo
@@ -330,6 +332,7 @@ offerbook.createOffer=Crear oferta
offerbook.takeOffer=Tomar oferta
offerbook.takeOfferToBuy=Tomar oferta de compra de {0}
offerbook.takeOfferToSell=Tomar oferta de venta de {0}
+offerbook.takeOffer.enterChallenge=Introduzca la frase secreta de la oferta
offerbook.trader=Trader
offerbook.offerersBankId=ID del banco del creador (BIC/SWIFT): {0}
offerbook.offerersBankName=Nombre del banco del creador: {0}
@@ -340,6 +343,8 @@ offerbook.availableOffers=Ofertas disponibles
offerbook.filterByCurrency=Filtrar por moneda
offerbook.filterByPaymentMethod=Filtrar por método de pago
offerbook.matchingOffers=Ofertas que concuerden con mis cuentas
+offerbook.filterNoDeposit=Sin depósito
+offerbook.noDepositOffers=Ofertas sin depósito (se requiere frase de paso)
offerbook.timeSinceSigning=Información de la cuenta
offerbook.timeSinceSigning.info=Esta cuenta fue verificada y {0}
offerbook.timeSinceSigning.info.arbitrator=firmada por un árbitro y puede firmar cuentas de pares
@@ -485,7 +490,10 @@ createOffer.setDepositAsBuyer=Establecer mi depósito de seguridad como comprado
createOffer.setDepositForBothTraders=Establecer el depósito de seguridad para los comerciantes (%)
createOffer.securityDepositInfo=Su depósito de seguridad como comprador será {0}
createOffer.securityDepositInfoAsBuyer=Su depósito de seguridad como comprador será {0}
-createOffer.minSecurityDepositUsed=En uso el depósito de seguridad mínimo
+createOffer.minSecurityDepositUsed=Se utiliza un depósito de seguridad mínimo
+createOffer.buyerAsTakerWithoutDeposit=No se requiere depósito del comprador (protegido por passphrase)
+createOffer.myDeposit=Mi depósito de seguridad (%)
+createOffer.myDepositInfo=Tu depósito de seguridad será {0}
####################################################################
@@ -509,6 +517,8 @@ takeOffer.fundsBox.networkFee=Comisiones de minado totales
takeOffer.fundsBox.takeOfferSpinnerInfo=Aceptando oferta: {0}
takeOffer.fundsBox.paymentLabel=Intercambio Haveno con ID {0}
takeOffer.fundsBox.fundsStructure=({0} depósito de seguridad {1} tasa de intercambio, {2} tarifa de minado)
+takeOffer.fundsBox.noFundingRequiredTitle=No se requiere financiamiento
+takeOffer.fundsBox.noFundingRequiredDescription=Obtén la frase de acceso de la oferta del vendedor fuera de Haveno para aceptar esta oferta.
takeOffer.success.headline=Ha aceptado la oferta con éxito.
takeOffer.success.info=Puede ver el estado de su intercambio en \"Portafolio/Intercambios abiertos\".
takeOffer.error.message=Un error ocurrió al tomar la oferta.\n\n{0}
@@ -630,7 +640,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=REQUERIMIENTO IMPORTANTE:\nDesp
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=Por favor envíe {0} mediante \"US Postal Money Order\" a el vendedor de XMR.\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Por favor envíe {0} usando \"Efectivo por Correo\" al vendedor. Las instrucciones específicas están en el contrato de intercambio, y si no queda claro, pregunte a través del chat de intercambio.\nVea más detalles acerca de Efectivo por Correo en la wiki de Haveno [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Por favor envíe {0} usando \"Efectivo por Correo\" al vendedor. Las instrucciones específicas están en el contrato de intercambio, y si no queda claro, pregunte a través del chat de intercambio.\nVea más detalles acerca de Efectivo por Correo en la wiki de Haveno [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Por favor pague {0} a través del método de pago especificado al vendedor XMR. Encontrará los detalles de la cuenta del vendedor en la siguiente pantalla.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1465,6 +1475,7 @@ offerDetailsWindow.confirm.maker=Confirmar: Poner oferta para {0} monero
offerDetailsWindow.confirm.taker=Confirmar: Tomar oferta {0} monero
offerDetailsWindow.creationDate=Fecha de creación
offerDetailsWindow.makersOnion=Dirección onion del creador
+offerDetailsWindow.challenge=Frase de contraseña de la oferta
qRCodeWindow.headline=Código QR
qRCodeWindow.msg=Por favor, utilice este código QR para fondear su billetera Haveno desde su billetera externa.
@@ -1578,7 +1589,7 @@ popup.headline.error=Error
popup.doNotShowAgain=No mostrar de nuevo
popup.reportError.log=Abrir archivo de registro
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 haveno.log presionando "Abrir archivo de log", guardando una copia y adjuntándola en su informe de errores.
+popup.reportError={0}\n\nPara ayudarnos a mejorar el software por favor reporte el fallo en nuestro rastreador de fallos en https://github.com/haveno-dex/haveno/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 haveno.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}
@@ -1621,7 +1632,7 @@ popup.warning.nodeBanned=Uno de los nodos {0} ha sido baneado.
popup.warning.priceRelay=retransmisión de precio
popup.warning.seed=semilla
popup.warning.mandatoryUpdate.trading=Por favor, actualice a la última versión de Haveno. Se lanzó una actualización obligatoria que inhabilita intercambios con versiones anteriores. Por favor, lea el Foro de Haveno para más información\n
-popup.warning.noFilter=No hemos recibido un objeto de filtro desde los nodos semilla. Esta situación no se esperaba. Por favor, informe a los desarrolladores Haveno.
+popup.warning.noFilter=No recibimos un objeto de filtro de los nodos semilla. Por favor, informe a los administradores de la red que registren un objeto de filtro.
popup.warning.burnXMR=Esta transacción no es posible, ya que las comisiones de minado de {0} excederían la cantidad a transferir de {1}. Por favor, espere a que las comisiones de minado bajen o hasta que haya acumulado más XMR para transferir.
popup.warning.openOffer.makerFeeTxRejected=La tasa de transacción para la oferta con ID {0} se rechazó por la red Monero.\nID de transacción={1}\nLa oferta se ha eliminado para evitar futuros problemas.\nPor favor vaya a \"Configuración/Información de red\" y haga una resincronización SPV.\nPara más ayuda por favor contacte con el equipo de soporte de Haveno en el canal de Haveno en Keybase.
@@ -1691,6 +1702,9 @@ popup.accountSigning.unsignedPubKeys.signed=Las claves públicas se firmaron
popup.accountSigning.unsignedPubKeys.result.signed=Claves públicas firmadas
popup.accountSigning.unsignedPubKeys.result.failed=Error al firmar
+popup.info.buyerAsTakerWithoutDeposit.headline=No se requiere depósito del comprador
+popup.info.buyerAsTakerWithoutDeposit=Tu oferta no requerirá un depósito de seguridad ni una tarifa del comprador de XMR.\n\nPara aceptar tu oferta, debes compartir una frase de acceso con tu compañero de comercio fuera de Haveno.\n\nLa frase de acceso se genera automáticamente y se muestra en los detalles de la oferta después de la creación.
+
####################################################################
# Notifications
####################################################################
@@ -1816,6 +1830,7 @@ navigation.support=\"Soporte\"
formatter.formatVolumeLabel={0} cantidad{1}
formatter.makerTaker=Creador como {0} {1} / Tomador como {2} {3}
+formatter.makerTakerLocked=Creador como {0} {1} / Tomador como {2} {3} 🔒
formatter.youAreAsMaker=Usted es: {1} {0} (creador) / El tomador es: {3} {2}
formatter.youAreAsTaker=Usted es: {1} {0} (tomador) / Creador es: {3} {2}
formatter.youAre=Usted es {0} {1} ({2} {3})
@@ -1963,8 +1978,6 @@ payment.accountType=Tipo de cuenta
payment.checking=Comprobando
payment.savings=Ahorros
payment.personalId=ID personal:
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelle es un servicio de transmisión de dinero que funciona mejor *a través* de otro banco..\n\n1. Compruebe esta página para ver si (y cómo) trabaja su banco con Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Preste atención a los límites de transferencia -límites de envío- que varían entre bancos, y que los bancos especifican a menudo diferentes límites diarios, semanales y mensuales..\n\n3. Si su banco no trabaja con Zelle, aún puede usarlo a través de la app móvil de Zelle, pero sus límites de transferencia serán mucho menores.\n\n4. El nombre especificado en su cuenta Haveno DEBE ser igual que el nombre en su cuenta de Zelle/bancaria. \n\nSi no puede completar una transacción Zelle tal como se especifica en el contrato, puede perder algo (o todo) el depósito de seguridad!\n\nDebido a que Zelle tiene cierto riesgo de reversión de pago, se aconseja que los vendedores contacten con los compradores no firmados a través de email o SMS para verificar que el comprador realmente tiene la cuenta de Zelle especificada en Haveno.
payment.fasterPayments.newRequirements.info=Algunos bancos han comenzado a verificar el nombre completo del receptor para las transferencias Faster Payments. Su cuenta actual Faster Payments no especifica un nombre completo.\n\nConsidere recrear su cuenta Faster Payments en Haveno para proporcionarle a los futuros compradores {0} un nombre completo.\n\nCuando vuelva a crear la cuenta, asegúrese de copiar el UK Short Code de forma precisa , el número de cuenta y los valores salt de la cuenta anterior a su cuenta nueva para la verificación de edad. Esto asegurará que la edad de su cuenta existente y el estado de la firma se conserven.
payment.moneyGram.info=Al utilizar MoneyGram, el comprador de XMR tiene que enviar el número de autorización y una foto del recibo al vendedor de XMR por correo electrónico. El recibo debe mostrar claramente el nobre completo del vendedor, país, estado y cantidad. El email del vendedor se mostrará al comprador durante el proceso de intercambio.
@@ -1981,6 +1994,10 @@ payment.revolut.info=Revolut requiere el 'nombre de usuario' como ID de cuenta y
payment.account.revolut.addUserNameInfo={0}\nSu cuenta de Revolut ({1}) no tiene un "nombre de usuario".\nPor favor introduzca su "nombre de usuario" en Revolut para actualizar sus datos de cuenta.\nEsto no afectará a su estado de edad de firmado de cuenta.
payment.revolut.addUserNameInfo.headLine=Actualizar cuenta Revolut
+payment.cashapp.info=Tenga en cuenta que Cash App tiene un mayor riesgo de contracargos que la mayoría de las transferencias bancarias.
+payment.venmo.info=Tenga en cuenta que Venmo tiene un mayor riesgo de contracargos que la mayoría de las transferencias bancarias.
+payment.paypal.info=Tenga en cuenta que PayPal tiene un mayor riesgo de contracargos que la mayoría de las transferencias bancarias.
+
payment.amazonGiftCard.upgrade=El método de pago Tarjetas regalo Amazon requiere que se especifique el país
payment.account.amazonGiftCard.addCountryInfo={0}\nSu cuenta actual de Tarjeta regalo Amazon ({1}) no tiene un País especificado.\nPor favor introduzca el país de su Tarjeta regalo Amazon para actualizar sus datos de cuenta.\nEsto no afectará el estatus de edad de su cuenta.
payment.amazonGiftCard.upgrade.headLine=Actualizar cuenta Tarjeta regalo Amazon
@@ -2014,11 +2031,14 @@ payment.f2f.city=Ciudad para la reunión 'cara a cara'
payment.f2f.city.prompt=La ciudad se mostrará con la oferta
payment.shared.optionalExtra=Información adicional opcional
payment.shared.extraInfo=Información adicional
-payment.shared.extraInfo.prompt=Defina cualquier término especial, condiciones o detalles que quiera mostrar junto a sus ofertas para esta cuenta de pago (otros usuarios podrán ver esta información antes de aceptar las ofertas).
+payment.shared.extraInfo.offer=Información adicional de la oferta
+payment.shared.extraInfo.prompt.paymentAccount=Defina cualquier término especial, condiciones o detalles que quiera mostrar junto a sus ofertas para esta cuenta de pago (otros usuarios podrán ver esta información antes de aceptar las ofertas).
+payment.shared.extraInfo.prompt.offer=Defina cualquier término, condición o detalle especial que le gustaría mostrar con su oferta.
+payment.shared.extraInfo.noDeposit=Detalles de contacto y términos de la oferta
payment.f2f.info=Los intercambios 'Cara a Cara' 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 XMR 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: [HYPERLINK:https://docs.haveno.exchange/trading-rules.html#f2f-trading]
payment.f2f.info.openURL=Abrir paǵina web
payment.f2f.offerbook.tooltip.countryAndCity=País y ciudad: {0} / {1}
-payment.f2f.offerbook.tooltip.extra=Información adicional: {0}
+payment.shared.extraInfo.tooltip=Información adicional: {0}
payment.japan.bank=Banco
payment.japan.branch=Branch
@@ -2027,7 +2047,10 @@ payment.japan.recipient=Nombre
payment.australia.payid=PayID
payment.payid=PayID conectado a una institución financiera. Como la dirección email o el número de móvil.
payment.payid.info=Un PayID como un número de teléfono, dirección email o Australian Business Number (ABN), que puede conectar con seguridad a su banco, unión de crédito o cuenta de construcción de sociedad. Necesita haber creado una PayID con su institución financiera australiana. Tanto para enviar y recibir las instituciones financieras deben soportar PayID. Para más información por favor compruebe [HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=Para pagar con Tarjeta eGift Amazon. necesitará enviar una Tarjeta eGift Amazon al vendedor XMR a través de su cuenta Amazon.\n\nHaveno mostrará la dirección e-mail del vendedor de XMR o el número de teléfono donde la tarjeta de regalo deberá enviarse. Por favor vea la wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] para más detalles y mejores prácticas.\n\nNotas importantes:\n- Pruebe a enviar las tarjetas regalo en cantidades de 100USD o menores, ya que Amazon está señalando tarjetas regalo mayores como fraudulentas.\n- Intente usar textos para el mensaje de la tarjeta regalo creíbles y creativos ("Feliz cumpleaños!").\n- Las tarjetas Amazon eGift pueden ser redimidas únicamente en la web de Amazon en la que se compraron (por ejemplo, una tarjeta comprada en amazon.it solo puede ser redimida en amazon.it)
+payment.amazonGiftCard.info=Para pagar con Tarjeta eGift Amazon. necesitará enviar una Tarjeta eGift Amazon al vendedor XMR a través de su cuenta Amazon.\n\nHaveno mostrará la dirección e-mail del vendedor de XMR o el número de teléfono donde la tarjeta de regalo deberá enviarse. Por favor vea la wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] para más detalles y mejores prácticas.\n\nNotas importantes:\n- Pruebe a enviar las tarjetas regalo en cantidades de 100USD o menores, ya que Amazon está señalando tarjetas regalo mayores como fraudulentas.\n- Intente usar textos para el mensaje de la tarjeta regalo creíbles y creativos ("Feliz cumpleaños!").\n- Las tarjetas Amazon eGift pueden ser redimidas únicamente en la web de Amazon en la que se compraron (por ejemplo, una tarjeta comprada en amazon.it solo puede ser redimida en amazon.it)
+payment.paysafe.info=Por su protección, desaconsejamos encarecidamente el uso de PINs de Paysafecard para pagos.\n\n\
+ Las transacciones realizadas mediante PINs no pueden ser verificadas de forma independiente para la resolución de disputas. Si surge un problema, recuperar los fondos puede no ser posible.\n\n\
+ Para garantizar la seguridad de las transacciones con resolución de disputas, utilice siempre métodos de pago que proporcionen registros verificables.
# We use constants from the code so we do not use our normal naming convention
@@ -2107,7 +2130,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=Tarjeta Amazon eGift
# suppress inspection "UnusedProperty"
@@ -2159,7 +2182,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=Tarjeta Amazon eGift
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_fa.properties b/core/src/main/resources/i18n/displayStrings_fa.properties
index ed78e6ec4f..d6e00ed380 100644
--- a/core/src/main/resources/i18n/displayStrings_fa.properties
+++ b/core/src/main/resources/i18n/displayStrings_fa.properties
@@ -40,6 +40,8 @@ shared.buyMonero=خرید بیتکوین
shared.sellMonero=بیتکوین بفروشید
shared.buyCurrency=خرید {0}
shared.sellCurrency=فروش {0}
+shared.buyCurrencyLocked=بخر {0} 🔒
+shared.sellCurrencyLocked=فروش {0} 🔒
shared.buyingXMRWith=خرید بیتکوین با {0}
shared.sellingXMRFor=فروش بیتکوین با {0}
shared.buyingCurrency=خرید {0} ( فروش بیتکوین)
@@ -186,7 +188,7 @@ shared.total=مجموع
shared.totalsNeeded=وجه مورد نیاز
shared.tradeWalletAddress=آدرس کیفپول معاملات
shared.tradeWalletBalance=موجودی کیفپول معاملات
-shared.reserveExactAmount=رزرو فقط مقدار مورد نیاز پول. قبل از فعال شدن پیشنهاد شما، ممکن است نیاز به هزینه استخراج و 10 تایید (~20 دقیقه) باشد.
+shared.reserveExactAmount=فقط وجوه مورد نیاز را رزرو کنید. نیاز به هزینه استخراج و حدود ۲۰ دقیقه زمان قبل از فعال شدن پیشنهاد شما دارد.
shared.makerTxFee=سفارش گذار: {0}
shared.takerTxFee=پذیرنده سفارش: {0}
shared.iConfirm=تایید میکنم
@@ -330,6 +332,7 @@ offerbook.createOffer=ایجاد پیشنهاد
offerbook.takeOffer=برداشتن پیشنهاد
offerbook.takeOfferToBuy=پیشنهاد خرید {0} را بردار
offerbook.takeOfferToSell=پیشنهاد فروش {0} را بردار
+offerbook.takeOffer.enterChallenge=عبارت عبور پیشنهاد را وارد کنید
offerbook.trader=معاملهگر
offerbook.offerersBankId=شناسه بانک سفارشگذار (BIC/SWIFT): {0}
offerbook.offerersBankName= نام بانک سفارشگذار : {0}
@@ -339,7 +342,9 @@ offerbook.offerersAcceptedBankSeats=بانکهای کشورهای پذیرف
offerbook.availableOffers=پیشنهادهای موجود
offerbook.filterByCurrency=فیلتر بر اساس ارز
offerbook.filterByPaymentMethod=فیلتر بر اساس روش پرداخت
-offerbook.matchingOffers=Offers matching my accounts
+offerbook.matchingOffers=پیشنهادات متناسب با حسابهای من
+offerbook.filterNoDeposit=هیچ سپردهای
+offerbook.noDepositOffers=پیشنهادهایی بدون ودیعه (نیاز به عبارت عبور)
offerbook.timeSinceSigning=Account info
offerbook.timeSinceSigning.info=This account was verified and {0}
offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
@@ -484,7 +489,10 @@ createOffer.setDepositAsBuyer=تنظیم سپردهی اطمینان من ب
createOffer.setDepositForBothTraders=Set both traders' security deposit (%)
createOffer.securityDepositInfo=سپردهی اطمینان خریدار شما {0} خواهد بود
createOffer.securityDepositInfoAsBuyer=سپردهی اطمینان شما به عنوان خریدار {0} خواهد بود
-createOffer.minSecurityDepositUsed=Min. buyer security deposit is used
+createOffer.minSecurityDepositUsed=حداقل سپرده امنیتی استفاده میشود
+createOffer.buyerAsTakerWithoutDeposit=هیچ سپردهای از خریدار مورد نیاز نیست (محافظت شده با پسعبارت)
+createOffer.myDeposit=سپرده امنیتی من (%)
+createOffer.myDepositInfo=ودیعه امنیتی شما {0} خواهد بود
####################################################################
@@ -508,6 +516,8 @@ takeOffer.fundsBox.networkFee=کل کارمزد استخراج
takeOffer.fundsBox.takeOfferSpinnerInfo=پذیرفتن پیشنهاد: {0}
takeOffer.fundsBox.paymentLabel=معامله Haveno با شناسهی {0}
takeOffer.fundsBox.fundsStructure=({0} سپردهی اطمینان، {1} هزینهی معامله، {2} هزینه تراکنش شبکه)
+takeOffer.fundsBox.noFundingRequiredTitle=نیاز به تأمین مالی نیست
+takeOffer.fundsBox.noFundingRequiredDescription=برای پذیرش این پیشنهاد، رمزعبور آن را از فروشنده خارج از هاونئو دریافت کنید.
takeOffer.success.headline=با موفقیت یک پیشنهاد را قبول کردهاید.
takeOffer.success.info=شما میتوانید وضعیت معاملهی خود را در \"سبد سهام /معاملات باز\" ببینید.
takeOffer.error.message=هنگام قبول کردن پیشنهاد، اتفاقی رخ داده است.\n\n{0}
@@ -629,7 +639,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=مورد الزامی مهم:\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=لطفاً {0} را توسط \"US Postal Money Order\" به فروشندهی بیتکوین پرداخت کنید.\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Please pay {0} via the specified payment method to the XMR seller. You''ll find the seller's account details on the next screen.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1460,6 +1470,7 @@ offerDetailsWindow.confirm.maker=تأیید: پیشنهاد را به {0} بگذ
offerDetailsWindow.confirm.taker=تأیید: پیشنهاد را به {0} بپذیرید
offerDetailsWindow.creationDate=تاریخ ایجاد
offerDetailsWindow.makersOnion=آدرس Onion سفارش گذار
+offerDetailsWindow.challenge=Passphrase de l'offre
qRCodeWindow.headline=QR Code
qRCodeWindow.msg=Please use this QR code for funding your Haveno wallet from your external wallet.
@@ -1573,7 +1584,7 @@ popup.headline.error=خطا
popup.doNotShowAgain=دوباره نشان نده
popup.reportError.log=باز کردن فایل گزارش
popup.reportError.gitHub=گزارش به پیگیر مسائل GitHub
-popup.reportError={0}\n\nTo help us to improve the software please report this bug by opening a new issue at https://github.com/bisq-network/bisq/issues.\nThe above error message will be copied to the clipboard when you click either of the buttons below.\nIt will make debugging easier if you include the haveno.log file by pressing "Open log file", saving a copy, and attaching it to your bug report.
+popup.reportError={0}\n\nTo help us to improve the software please report this bug by opening a new issue at https://github.com/haveno-dex/haveno/issues.\nThe above error message will be copied to the clipboard when you click either of the buttons below.\nIt will make debugging easier if you include the haveno.log file by pressing "Open log file", saving a copy, and attaching it to your bug report.
popup.error.tryRestart=لطفاً سعی کنید برنامه را مجدداً راه اندازی کنید و اتصال شبکه خود را بررسی کنید تا ببینید آیا می توانید مشکل را حل کنید یا خیر.
popup.error.takeOfferRequestFailed=وقتی کسی تلاش کرد تا یکی از پیشنهادات شما را بپذیرد خطایی رخ داد:\n{0}
@@ -1616,6 +1627,7 @@ popup.warning.nodeBanned=One of the {0} nodes got banned.
popup.warning.priceRelay=رله قیمت
popup.warning.seed=دانه
popup.warning.mandatoryUpdate.trading=Please update to the latest Haveno version. A mandatory update was released which disables trading for old versions. Please check out the Haveno Forum for more information.
+popup.warning.noFilter=ما شیء فیلتر را از گرههای اولیه دریافت نکردیم. لطفاً به مدیران شبکه اطلاع دهید که یک شیء فیلتر ثبت کنند.
popup.warning.burnXMR=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more XMR to transfer.
popup.warning.openOffer.makerFeeTxRejected=The maker fee transaction for offer with ID {0} was rejected by the Monero network.\nTransaction ID={1}.\nThe offer has been removed to avoid further problems.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Haveno support channel at the Haveno Keybase team.
@@ -1683,6 +1695,9 @@ popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed
popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys
popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign
+popup.info.buyerAsTakerWithoutDeposit.headline=هیچ پیشپرداختی از خریدار مورد نیاز نیست
+popup.info.buyerAsTakerWithoutDeposit=پیشنهاد شما نیاز به ودیعه امنیتی یا هزینه از خریدار XMR ندارد.\n\nبرای پذیرفتن پیشنهاد شما، باید یک پسعبارت را با شریک تجاری خود خارج از Haveno به اشتراک بگذارید.\n\nپسعبارت بهطور خودکار تولید میشود و پس از ایجاد در جزئیات پیشنهاد نمایش داده میشود.
+
####################################################################
# Notifications
####################################################################
@@ -1808,6 +1823,7 @@ navigation.support=\"پشتیبانی\"
formatter.formatVolumeLabel={0} مبلغ {1}
formatter.makerTaker=سفارش گذار به عنوان {0} {1} / پذیرنده به عنوان {2} {3}
+formatter.makerTakerLocked=سفارش گذار به عنوان {0} {1} / پذیرنده به عنوان {2} {3} 🔒
formatter.youAreAsMaker=You are: {1} {0} (maker) / Taker is: {3} {2}
formatter.youAreAsTaker=You are: {1} {0} (taker) / Maker is: {3} {2}
formatter.youAre=شما {0} {1} ({2} {3}) هستید
@@ -1955,8 +1971,6 @@ payment.accountType=نوع حساب
payment.checking=بررسی
payment.savings=اندوخته ها
payment.personalId=شناسه شخصی
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Haveno account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Haveno.
payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Haveno to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved.
payment.moneyGram.info=When using MoneyGram the XMR buyer has to send the Authorisation number and a photo of the receipt by email to the XMR seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process.
@@ -1973,12 +1987,14 @@ payment.revolut.info=Revolut requires the 'Username' as account ID not the phone
payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''Username''.\nPlease enter your Revolut ''Username'' to update your account data.\nThis will not affect your account age signing status.
payment.revolut.addUserNameInfo.headLine=Update Revolut account
+payment.cashapp.info=لطفاً توجه داشته باشید که Cash App ریسک بازپرداخت بالاتری نسبت به بیشتر انتقالات بانکی دارد.
+payment.venmo.info=لطفاً توجه داشته باشید که Venmo ریسک بازپرداخت بالاتری نسبت به بیشتر انتقالات بانکی دارد.
+payment.paypal.info=لطفاً توجه داشته باشید که PayPal ریسک بازپرداخت بالاتری نسبت به بیشتر انتقالات بانکی دارد.
+
payment.amazonGiftCard.upgrade=Amazon gift cards payment method requires the country to be specified.
payment.account.amazonGiftCard.addCountryInfo={0}\nYour existing Amazon Gift Card account ({1}) does not have a Country specified.\nPlease enter your Amazon Gift Card Country to update your account data.\nThis will not affect your account age status.
payment.amazonGiftCard.upgrade.headLine=Update Amazon Gift Card account
-payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Haveno requires that you understand the following:\n\n- XMR buyers must write the XMR Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- XMR buyers must send the USPMO to the XMR seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Haveno mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Haveno.
-
payment.payByMail.contact=اطلاعات تماس
payment.payByMail.contact.prompt=Name or nym envelope should be addressed to
payment.f2f.contact=اطلاعات تماس
@@ -1987,11 +2003,13 @@ payment.f2f.city=شهر جهت ملاقات 'رو در رو'
payment.f2f.city.prompt=نام شهر به همراه پیشنهاد نمایش داده خواهد شد
payment.shared.optionalExtra=اطلاعات اضافی اختیاری
payment.shared.extraInfo=اطلاعات اضافی
-payment.shared.extraInfo.prompt=Define any special terms, conditions, or details you would like to be displayed with your offers for this payment account (users will see this info before accepting offers).
-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 be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the XMR 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: [HYPERLINK:https://docs.haveno.exchange/trading-rules.html#f2f-trading]
+payment.shared.extraInfo.offer=اطلاعات اضافی پیشنهاد
+payment.shared.extraInfo.prompt.paymentAccount=هرگونه اصطلاحات، شرایط یا جزئیات خاصی که میخواهید همراه با پیشنهادات شما برای این حساب پرداخت نمایش داده شود را تعریف کنید (کاربران قبل از پذیرش پیشنهادات این اطلاعات را مشاهده خواهند کرد).
+payment.shared.extraInfo.prompt.offer=هر اصطلاح، شرایط یا جزئیات خاصی که مایلید همراه با پیشنهاد خود نمایش داده شود را تعریف کنید.
+payment.shared.extraInfo.noDeposit=جزئیات تماس و شرایط پیشنهاد
payment.f2f.info.openURL=باز کردن صفحه وب
payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
-payment.f2f.offerbook.tooltip.extra=اطلاعات اضافی: {0}
+payment.shared.extraInfo.tooltip=اطلاعات اضافی: {0}
payment.japan.bank=بانک
payment.japan.branch=Branch
@@ -2000,7 +2018,10 @@ payment.japan.recipient=نام
payment.australia.payid=PayID
payment.payid=PayID linked to financial institution. Like email address or mobile phone.
payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.paysafe.info=برای حفاظت از شما، به شدت از استفاده از پینهای Paysafecard برای پرداخت جلوگیری میکنیم.\n\n\
+ تراکنشهای انجام شده از طریق پینها نمیتوانند به طور مستقل برای حل اختلاف تأیید شوند. اگر مشکلی پیش آید، بازیابی وجوه ممکن است غیرممکن باشد.\n\n\
+ برای اطمینان از امنیت تراکنش و حل اختلاف، همیشه از روشهای پرداختی استفاده کنید که سوابق قابل تاییدی ارائه میدهند.
# We use constants from the code so we do not use our normal naming convention
@@ -2080,7 +2101,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=Amazon eGift Card
# suppress inspection "UnusedProperty"
@@ -2132,7 +2153,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=Amazon eGift Card
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_fr.properties b/core/src/main/resources/i18n/displayStrings_fr.properties
index 252b31466e..2025ed4d66 100644
--- a/core/src/main/resources/i18n/displayStrings_fr.properties
+++ b/core/src/main/resources/i18n/displayStrings_fr.properties
@@ -40,6 +40,8 @@ shared.buyMonero=Achat Monero
shared.sellMonero=Vendre des Moneros
shared.buyCurrency=Achat {0}
shared.sellCurrency=Vendre {0}
+shared.buyCurrencyLocked=Achat {0} 🔒
+shared.sellCurrencyLocked=Vendre {0} 🔒
shared.buyingXMRWith=achat XMR avec {0}
shared.sellingXMRFor=vendre XMR pour {0}
shared.buyingCurrency=achat {0} (vente XMR)
@@ -186,7 +188,7 @@ shared.total=Total
shared.totalsNeeded=Fonds nécessaires
shared.tradeWalletAddress=Adresse du portefeuille de trading
shared.tradeWalletBalance=Solde du portefeuille de trading
-shared.reserveExactAmount=Réservez uniquement les fonds nécessaires. Il peut être nécessaire de payer des frais de minage et d'attendre 10 confirmations (~20 minutes) avant que votre offre ne soit active.
+shared.reserveExactAmount=Réservez uniquement les fonds nécessaires. Nécessite des frais de minage et environ 20 minutes avant que votre offre ne soit mise en ligne.
shared.makerTxFee=Maker: {0}
shared.takerTxFee=Taker: {0}
shared.iConfirm=Je confirme
@@ -330,6 +332,7 @@ offerbook.createOffer=Créer un ordre
offerbook.takeOffer=Accepter un ordre
offerbook.takeOfferToBuy=Accepter l''ordre d''achat {0}
offerbook.takeOfferToSell=Accepter l''ordre de vente {0}
+offerbook.takeOffer.enterChallenge=Entrez la phrase secrète de l'offre
offerbook.trader=Échanger
offerbook.offerersBankId=ID de la banque du maker (BIC/SWIFT): {0}
offerbook.offerersBankName=Nom de la banque du maker: {0}
@@ -340,6 +343,8 @@ offerbook.availableOffers=Ordres disponibles
offerbook.filterByCurrency=Filtrer par devise
offerbook.filterByPaymentMethod=Filtrer par mode de paiement
offerbook.matchingOffers=Offres correspondants à mes comptes
+offerbook.filterNoDeposit=Aucun dépôt
+offerbook.noDepositOffers=Offres sans dépôt (passphrase requise)
offerbook.timeSinceSigning=Informations du compte
offerbook.timeSinceSigning.info=Ce compte a été vérifié et {0}
offerbook.timeSinceSigning.info.arbitrator=signé par un arbitre et pouvant signer des comptes pairs
@@ -485,7 +490,10 @@ createOffer.setDepositAsBuyer=Définir mon dépôt de garantie en tant qu'achete
createOffer.setDepositForBothTraders=Établissez le dépôt de sécurité des deux traders (%)
createOffer.securityDepositInfo=Le dépôt de garantie de votre acheteur sera de {0}
createOffer.securityDepositInfoAsBuyer=Votre dépôt de garantie en tant qu''acheteur sera de {0}
-createOffer.minSecurityDepositUsed=Le minimum de dépôt de garantie de l'acheteur est utilisé
+createOffer.minSecurityDepositUsed=Le dépôt de sécurité minimum est utilisé
+createOffer.buyerAsTakerWithoutDeposit=Aucun dépôt requis de la part de l'acheteur (protégé par un mot de passe)
+createOffer.myDeposit=Mon dépôt de garantie (%)
+createOffer.myDepositInfo=Votre dépôt de garantie sera de {0}
####################################################################
@@ -509,6 +517,8 @@ takeOffer.fundsBox.networkFee=Total des frais de minage
takeOffer.fundsBox.takeOfferSpinnerInfo=Acceptation de l'offre : {0}
takeOffer.fundsBox.paymentLabel=Transaction Haveno avec l''ID {0}
takeOffer.fundsBox.fundsStructure=({0} dépôt de garantie, {1} frais de transaction, {2} frais de minage)
+takeOffer.fundsBox.noFundingRequiredTitle=Aucun financement requis
+takeOffer.fundsBox.noFundingRequiredDescription=Obtenez la phrase secrète de l'offre auprès du vendeur en dehors de Haveno pour accepter cette offre.
takeOffer.success.headline=Vous avez accepté un ordre avec succès.
takeOffer.success.info=Vous pouvez voir vos transactions dans \"Portfolio/Échanges en cours\".
takeOffer.error.message=Une erreur s''est produite pendant l’'acceptation de l''ordre.\n\n{0}
@@ -630,7 +640,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=CONDITIONS REQUISES:\nAprès av
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=Merci d''envoyer {0} par \"US Postal Money Order\" au vendeur de XMR.\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Veuillez envoyer {0} en utlisant \"Pay by Mail\" au vendeur de XMR. Les instructions spécifiques sont dans le contrat de trade, ou si ce n'est pas clair, vous pouvez poser des questions via le chat des trader. Pour plus de détails sur Pay by Mail, allez sur le wiki Haveno \n[LIEN:https://haveno.exchange/wiki/Cash_by_Mail]\n
+portfolio.pending.step2_buyer.payByMail=Veuillez envoyer {0} en utlisant \"Pay by Mail\" au vendeur de XMR. Les instructions spécifiques sont dans le contrat de trade, ou si ce n'est pas clair, vous pouvez poser des questions via le chat des trader. Pour plus de détails sur Pay by Mail, allez sur le wiki Haveno \n[LIEN:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail]\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Veuillez payer {0} via la méthode de paiement spécifiée par le vendeur de XMR. Vous trouverez les informations du compte du vendeur à l'écran suivant.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1466,6 +1476,7 @@ offerDetailsWindow.confirm.maker=Confirmer: Placer un ordre de {0} monero
offerDetailsWindow.confirm.taker=Confirmer: Acceptez l''ordre de {0} monero
offerDetailsWindow.creationDate=Date de création
offerDetailsWindow.makersOnion=Adresse onion du maker
+offerDetailsWindow.challenge=Phrase secrète de l'offre
qRCodeWindow.headline=QR Code
qRCodeWindow.msg=Veuillez utiliser le code QR pour recharger du portefeuille externe au portefeuille Haveno.
@@ -1506,7 +1517,7 @@ tacWindow.disagree=Je ne suis pas d'accord et je quitte
tacWindow.arbitrationSystem=Règlement du litige
tradeDetailsWindow.headline=Échange
-tradeDetailsWindow.disputedPayoutTxId=ID de la transaction de versement contestée :
+tradeDetailsWindow.disputedPayoutTxId=ID de la transaction de versement contestée
tradeDetailsWindow.tradeDate=Date de l'échange
tradeDetailsWindow.txFee=Frais de minage
tradeDetailsWindow.tradePeersOnion=Adresse onion du pair de trading
@@ -1579,7 +1590,7 @@ popup.headline.error=Erreur
popup.doNotShowAgain=Ne plus montrer
popup.reportError.log=Ouvrir le dossier de log
popup.reportError.gitHub=Signaler au Tracker de problème GitHub
-popup.reportError={0}\n\nAfin de nous aider à améliorer le logiciel, veuillez signaler ce bug en ouvrant un nouveau ticket de support sur https://github.com/bisq-network/bisq/issues.\nLe message d''erreur ci-dessus sera copié dans le presse-papier lorsque vous cliquerez sur l''un des boutons ci-dessous.\nCela facilitera le dépannage si vous incluez le fichier haveno.log en appuyant sur "ouvrir le fichier de log", en sauvegardant une copie, et en l''attachant à votre rapport de bug.
+popup.reportError={0}\n\nAfin de nous aider à améliorer le logiciel, veuillez signaler ce bug en ouvrant un nouveau ticket de support sur https://github.com/haveno-dex/haveno/issues.\nLe message d''erreur ci-dessus sera copié dans le presse-papier lorsque vous cliquerez sur l''un des boutons ci-dessous.\nCela facilitera le dépannage si vous incluez le fichier haveno.log en appuyant sur "ouvrir le fichier de log", en sauvegardant une copie, et en l''attachant à votre rapport de bug.
popup.error.tryRestart=Veuillez essayer de redémarrer votre application et vérifier votre connexion réseau pour voir si vous pouvez résoudre ce problème.
popup.error.takeOfferRequestFailed=Une erreur est survenue pendant que quelqu''un essayait d''accepter l''un de vos ordres:\n{0}
@@ -1622,7 +1633,7 @@ popup.warning.nodeBanned=Un des noeuds {0} a été banni.
popup.warning.priceRelay=Relais de prix
popup.warning.seed=seed
popup.warning.mandatoryUpdate.trading=Veuillez faire une mise à jour vers la dernière version de Haveno. Une mise à jour obligatoire a été publiée, laquelle désactive le trading sur les anciennes versions. Veuillez consulter le Forum Haveno pour obtenir plus d'informations.
-popup.warning.noFilter=Nous n'avons pas reçu d'object de filtre de la part des noeuds source. Ceci n'est pas une situation attendue. Veuillez informer les développeurs de Haveno
+popup.warning.noFilter=Nous n'avons pas reçu d'objet de filtre des nœuds de seed. Veuillez informer les administrateurs du réseau d'enregistrer un objet de filtre.
popup.warning.burnXMR=Cette transaction n''est pas possible, car les frais de minage de {0} dépasseraient le montant à transférer de {1}. Veuillez patienter jusqu''à ce que les frais de minage soient de nouveau bas ou jusqu''à ce que vous ayez accumulé plus de XMR à transférer.
popup.warning.openOffer.makerFeeTxRejected=La transaction de frais de maker pour l''offre avec ID {0} a été rejetée par le réseau Monero.\nID de transaction={1}.\nL''offre a été retirée pour éviter d''autres problèmes.\nAllez dans \"Paramètres/Info sur le réseau réseau\" et faites une resynchronisation SPV.\nPour obtenir de l''aide, le canal support de l''équipe Haveno disposible sur Keybase.
@@ -1692,6 +1703,9 @@ popup.accountSigning.unsignedPubKeys.signed=Les clés publiques ont été signé
popup.accountSigning.unsignedPubKeys.result.signed=Clés publiques signées
popup.accountSigning.unsignedPubKeys.result.failed=Échec de la signature
+popup.info.buyerAsTakerWithoutDeposit.headline=Aucun dépôt requis de la part de l'acheteur
+popup.info.buyerAsTakerWithoutDeposit=Votre offre ne nécessitera pas de dépôt de sécurité ni de frais de la part de l'acheteur XMR.\n\nPour accepter votre offre, vous devez partager un mot de passe avec votre partenaire commercial en dehors de Haveno.\n\nLe mot de passe est généré automatiquement et affiché dans les détails de l'offre après sa création.
+
####################################################################
# Notifications
####################################################################
@@ -1817,6 +1831,7 @@ navigation.support=\"Assistance\"
formatter.formatVolumeLabel={0} montant{1}
formatter.makerTaker=Maker comme {0} {1} / Taker comme {2} {3}
+formatter.makerTakerLocked=Maker comme {0} {1} / Taker comme {2} {3} 🔒
formatter.youAreAsMaker=Vous êtes {1} {0} (maker) / Le preneur est: {3} {2}
formatter.youAreAsTaker=Vous êtes: {1} {0} (preneur) / Le maker est: {3} {2}
formatter.youAre=Vous êtes {0} {1} ({2} {3})
@@ -1982,6 +1997,10 @@ payment.revolut.info=Revolut nécessite le 'Nom d'utilisateur' en tant qu'ID de
payment.account.revolut.addUserNameInfo={0}\nVotre compte Revolut existant ({1}) n'a pas de "Nom d'utilisateur".\nVeuillez entrer votre "Nom d'utilisateur" Revolut pour mettre à jour les données de votre compte.\nCeci n'affectera pas l'âge du compte.
payment.revolut.addUserNameInfo.headLine=Mettre à jour le compte Revolut
+payment.cashapp.info=Veuillez noter que Cash App présente un risque de rétrofacturation plus élevé que la plupart des virements bancaires.
+payment.venmo.info=Veuillez noter que Venmo présente un risque de rétrofacturation plus élevé que la plupart des virements bancaires.
+payment.paypal.info=Veuillez noter que PayPal présente un risque de rétrofacturation plus élevé que la plupart des virements bancaires.
+
payment.amazonGiftCard.upgrade=La méthode de paiement via carte cadeaux Amazon nécessite que le pays soit spécifié.
payment.account.amazonGiftCard.addCountryInfo={0}\nVotre compte carte cadeau Amazon existant ({1}) n'a pas de pays spécifé.\nVeuillez entrer le pays de votre compte carte cadeau Amazon pour mettre à jour les données de votre compte.\nCeci n'affectera pas le statut de l'âge du compte.
payment.amazonGiftCard.upgrade.headLine=Mettre à jour le compte des cartes cadeaux Amazon
@@ -2015,11 +2034,14 @@ payment.f2f.city=Ville pour la rencontre en face à face
payment.f2f.city.prompt=La ville sera affichée en même temps que l'ordre
payment.shared.optionalExtra=Informations complémentaires facultatives
payment.shared.extraInfo=Informations complémentaires
-payment.shared.extraInfo.prompt=Définissez n'importe quels termes spécifiques, conditons ou détails que vous souhaiteriez voir affichés avec vos offres pour ce compte de paiement (les utilisateurs verront ces informations avant d'accepter les offres).
+payment.shared.extraInfo.offer=Informations supplémentaires sur l'offre
+payment.shared.extraInfo.prompt.paymentAccount=Définissez n'importe quels termes spécifiques, conditons ou détails que vous souhaiteriez voir affichés avec vos offres pour ce compte de paiement (les utilisateurs verront ces informations avant d'accepter les offres).
+payment.shared.extraInfo.prompt.offer=Définissez tous les termes, conditions ou détails spéciaux que vous souhaitez afficher avec votre offre.
+payment.shared.extraInfo.noDeposit=Coordonnées et conditions de l'offre
payment.f2f.info=Les transactions en 'face à face' ont des règles différentes et comportent des risques différents de ceux des transactions en ligne.\n\nLes principales différences sont les suivantes:\n● Les pairs de trading doivent échanger des informations sur le lieu et l'heure de la réunion en utilisant les coordonnées de contanct qu'ils ont fournies.\n● Les pairs de trading doivent apporter leur ordinateur portable et faire la confirmation du 'paiement envoyé' et du 'paiement reçu' sur le lieu de la réunion.\n● Si un maker a des 'termes et conditions' spéciaux, il doit les indiquer dans le champ 'Informations supplémentaires' dans le compte.\n● En acceptant une offre, le taker accepte les 'termes et conditions' du maker.\n● En cas de litige, le médiateur ou l'arbitre ne peut pas beaucoup aider car il est généralement difficile d'obtenir des preuves irréfutables de ce qui s'est passé lors de la réunion. Dans ce cas, les fonds en XMR peuvent être bloqué s indéfiniment tant que les pairs ne parviennent pas à un accord.\n\nPour vous assurer de bien comprendre les spécificités des transactions 'face à face', veuillez lire les instructions et les recommandations à [LIEN:https://docs.haveno.exchange/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.extra=Informations complémentaires: {0}
+payment.shared.extraInfo.tooltip=Informations complémentaires: {0}
payment.japan.bank=Banque
payment.japan.branch=Filiale
@@ -2028,7 +2050,10 @@ payment.japan.recipient=Nom
payment.australia.payid=ID de paiement
payment.payid=ID de paiement lié à une institution financière. Comme l'addresse email ou le téléphone portable.
payment.payid.info=Un PayID, tel qu'un numéro de téléphone, une adresse électronique ou un numéro d'entreprise australien (ABN), que vous pouvez lier en toute sécurité à votre compte bancaire, votre crédit mutuel ou votre société de crédit immobilier. Vous devez avoir déjà créé un PayID auprès de votre institution financière australienne. Les institutions financières émettrices et réceptrices doivent toutes deux prendre en charge PayID. Pour plus d'informations, veuillez consulter [LIEN:https://payid.com.au/faqs/].
-payment.amazonGiftCard.info=Pour payer avec une carte cadeau Amazon eGift Card, vous devrez envoyer une carte cadeau Amazon eGift Card au vendeur de XMR via votre compte Amazon. \n\nHaveno indiquera l'adresse e-mail ou le numéro de téléphone du vendeur XMR où la carte cadeau doit être envoyée, et vous devrez inclure l'ID du trade dans le champ de messagerie de la carte cadeau. Veuillez consulter le wiki [LIEN:https://haveno.exchange/wiki/Amazon_eGift_card] pour plus de détails et pour les meilleures pratiques à adopter. \n\nTrois remarques importantes :\n- essayez d'envoyer des cartes-cadeaux d'un montant inférieur ou égal à 100 USD, car Amazon est connu pour signaler les cartes-cadeaux plus importantes comme frauduleuses\n- essayez d'utiliser un texte créatif et crédible pour le message de la carte cadeau (par exemple, "Joyeux anniversaire Susan !") ainsi que l'ID du trade (et utilisez le chat du trader pour indiquer à votre pair de trading le texte de référence que vous avez choisi afin qu'il puisse vérifier votre paiement).\n- Les cartes cadeaux électroniques Amazon ne peuvent être échangées que sur le site Amazon où elles ont été achetées (par exemple, une carte cadeau achetée sur amazon.it ne peut être échangée que sur amazon.it).
+payment.amazonGiftCard.info=Pour payer avec une carte cadeau Amazon eGift Card, vous devrez envoyer une carte cadeau Amazon eGift Card au vendeur de XMR via votre compte Amazon. \n\nHaveno indiquera l'adresse e-mail ou le numéro de téléphone du vendeur XMR où la carte cadeau doit être envoyée, et vous devrez inclure l'ID du trade dans le champ de messagerie de la carte cadeau. Veuillez consulter le wiki [LIEN:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] pour plus de détails et pour les meilleures pratiques à adopter. \n\nTrois remarques importantes :\n- essayez d'envoyer des cartes-cadeaux d'un montant inférieur ou égal à 100 USD, car Amazon est connu pour signaler les cartes-cadeaux plus importantes comme frauduleuses\n- essayez d'utiliser un texte créatif et crédible pour le message de la carte cadeau (par exemple, "Joyeux anniversaire Susan !") ainsi que l'ID du trade (et utilisez le chat du trader pour indiquer à votre pair de trading le texte de référence que vous avez choisi afin qu'il puisse vérifier votre paiement).\n- Les cartes cadeaux électroniques Amazon ne peuvent être échangées que sur le site Amazon où elles ont été achetées (par exemple, une carte cadeau achetée sur amazon.it ne peut être échangée que sur amazon.it).
+payment.paysafe.info=Pour votre protection, nous déconseillons fortement d'utiliser les PINs Paysafecard pour les paiements.\n\n\
+ Les transactions effectuées via des PINs ne peuvent pas être vérifiées de manière indépendante pour la résolution des litiges. En cas de problème, la récupération des fonds peut ne pas être possible.\n\n\
+ Pour garantir la sécurité des transactions et la résolution des litiges, utilisez toujours des méthodes de paiement qui fournissent des preuves vérifiables.
# We use constants from the code so we do not use our normal naming convention
@@ -2108,7 +2133,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=eCarte cadeau Amazon
# suppress inspection "UnusedProperty"
@@ -2160,7 +2185,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=eCarte cadeau Amazon
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_it.properties b/core/src/main/resources/i18n/displayStrings_it.properties
index b2f67e19cd..f482f5b9c7 100644
--- a/core/src/main/resources/i18n/displayStrings_it.properties
+++ b/core/src/main/resources/i18n/displayStrings_it.properties
@@ -40,6 +40,8 @@ shared.buyMonero=Acquista monero
shared.sellMonero=Vendi monero
shared.buyCurrency=Acquista {0}
shared.sellCurrency=Vendi {0}
+shared.buyCurrencyLocked=Acquista {0} 🔒
+shared.sellCurrencyLocked=Vendi {0} 🔒
shared.buyingXMRWith=acquistando XMR con {0}
shared.sellingXMRFor=vendendo XMR per {0}
shared.buyingCurrency=comprando {0} (vendendo XMR)
@@ -186,7 +188,7 @@ shared.total=Totale
shared.totalsNeeded=Fondi richiesti
shared.tradeWalletAddress=Indirizzo del portafoglio per gli scambi
shared.tradeWalletBalance=Saldo del portafogli per gli scambi
-shared.reserveExactAmount=Riserva solo i fondi necessari. Potrebbe essere richiesta una tassa di mining e 10 conferme (~20 minuti) prima che la tua offerta sia attiva.
+shared.reserveExactAmount=Riserva solo i fondi necessari. Richiede una tassa di mining e circa 20 minuti prima che la tua offerta diventi attiva.
shared.makerTxFee=Maker: {0}
shared.takerTxFee=Taker: {0}
shared.iConfirm=Confermo
@@ -330,6 +332,7 @@ offerbook.createOffer=Crea offerta
offerbook.takeOffer=Accetta offerta
offerbook.takeOfferToBuy=Accetta l'offerta per acquistare {0}
offerbook.takeOfferToSell=Accetta l'offerta per vendere {0}
+offerbook.takeOffer.enterChallenge=Inserisci la passphrase dell'offerta
offerbook.trader=Trader
offerbook.offerersBankId=ID banca del Maker (BIC/SWIFT): {0}
offerbook.offerersBankName=Nome della banca del Maker: {0}
@@ -339,7 +342,9 @@ offerbook.offerersAcceptedBankSeats=Sede accettata dei paesi bancari (acquirente
offerbook.availableOffers=Offerte disponibili
offerbook.filterByCurrency=Filtra per valuta
offerbook.filterByPaymentMethod=Filtra per metodo di pagamento
-offerbook.matchingOffers=Offers matching my accounts
+offerbook.matchingOffers=Offerte che corrispondono ai miei account
+offerbook.filterNoDeposit=Nessun deposito
+offerbook.noDepositOffers=Offerte senza deposito (passphrase richiesta)
offerbook.timeSinceSigning=Account info
offerbook.timeSinceSigning.info=Questo account è stato verificato e {0}
offerbook.timeSinceSigning.info.arbitrator=firmato da un arbitro e può firmare account peer
@@ -484,7 +489,10 @@ createOffer.setDepositAsBuyer=Imposta il mio deposito cauzionale come acquirente
createOffer.setDepositForBothTraders=Set both traders' security deposit (%)
createOffer.securityDepositInfo=Il deposito cauzionale dell'acquirente sarà {0}
createOffer.securityDepositInfoAsBuyer=Il tuo deposito cauzionale come acquirente sarà {0}
-createOffer.minSecurityDepositUsed=Viene utilizzato il minimo deposito cauzionale dell'acquirente
+createOffer.minSecurityDepositUsed=Il deposito di sicurezza minimo è utilizzato
+createOffer.buyerAsTakerWithoutDeposit=Nessun deposito richiesto dal compratore (protetto da passphrase)
+createOffer.myDeposit=Il mio deposito di sicurezza (%)
+createOffer.myDepositInfo=Il tuo deposito di sicurezza sarà {0}
####################################################################
@@ -508,6 +516,8 @@ takeOffer.fundsBox.networkFee=Totale commissioni di mining
takeOffer.fundsBox.takeOfferSpinnerInfo=Accettare l'offerta: {0}
takeOffer.fundsBox.paymentLabel=Scambia Haveno con ID {0}
takeOffer.fundsBox.fundsStructure=({0} deposito cauzionale, {1} commissione commerciale, {2} commissione mineraria)
+takeOffer.fundsBox.noFundingRequiredTitle=Nessun finanziamento richiesto
+takeOffer.fundsBox.noFundingRequiredDescription=Ottieni la passphrase dell'offerta dal venditore fuori da Haveno per accettare questa offerta.
takeOffer.success.headline=Hai accettato con successo un'offerta.
takeOffer.success.info=Puoi vedere lo stato del tuo scambio su \"Portafoglio/Scambi aperti\".
takeOffer.error.message=Si è verificato un errore durante l'accettazione dell'offerta.\n\n{0}
@@ -629,7 +639,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=REQUISITO IMPORTANTE:\nDopo ave
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=Invia {0} tramite \"Vaglia Postale Statunitense\" al venditore XMR.\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Please pay {0} via the specified payment method to the XMR seller. You''ll find the seller's account details on the next screen.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1463,6 +1473,7 @@ offerDetailsWindow.confirm.maker=Conferma: Piazza l'offerta a {0} monero
offerDetailsWindow.confirm.taker=Conferma: Accetta l'offerta a {0} monero
offerDetailsWindow.creationDate=Data di creazione
offerDetailsWindow.makersOnion=Indirizzo .onion del maker
+offerDetailsWindow.challenge=Passphrase dell'offerta
qRCodeWindow.headline=QR Code
qRCodeWindow.msg=Please use this QR code for funding your Haveno wallet from your external wallet.
@@ -1503,7 +1514,7 @@ tacWindow.disagree=Non accetto ed esco
tacWindow.arbitrationSystem=Risoluzione disputa
tradeDetailsWindow.headline=Scambio
-tradeDetailsWindow.disputedPayoutTxId=ID transazione di pagamento contestato:
+tradeDetailsWindow.disputedPayoutTxId=ID transazione di pagamento contestato
tradeDetailsWindow.tradeDate=Data di scambio
tradeDetailsWindow.txFee=Commissione di mining
tradeDetailsWindow.tradePeersOnion=Indirizzi onion peer di trading
@@ -1576,7 +1587,7 @@ popup.headline.error=Errore
popup.doNotShowAgain=Non mostrare di nuovo
popup.reportError.log=Apri file di registro
popup.reportError.gitHub=Segnala sugli errori di GitHub
-popup.reportError={0}\n\nPer aiutarci a migliorare il software, segnala questo errore aprendo un nuova segnalazione su https://github.com/bisq-network/bisq/issues.\nIl messaggio di errore sopra verrà copiato negli appunti quando si fa clic su uno dei pulsanti di seguito.\nFaciliterà il debug se includi il file haveno.log premendo "Apri file di registro", salvando una copia e allegandolo alla tua segnalazione di bug.\n
+popup.reportError={0}\n\nPer aiutarci a migliorare il software, segnala questo errore aprendo un nuova segnalazione su https://github.com/haveno-dex/haveno/issues.\nIl messaggio di errore sopra verrà copiato negli appunti quando si fa clic su uno dei pulsanti di seguito.\nFaciliterà il debug se includi il file haveno.log premendo "Apri file di registro", salvando una copia e allegandolo alla tua segnalazione di bug.\n
popup.error.tryRestart=Prova a riavviare l'applicazione e controlla la connessione di rete per vedere se riesci a risolvere il problema.
popup.error.takeOfferRequestFailed=Si è verificato un errore quando qualcuno ha tentato di accettare una delle tue offerte:\n{0}
@@ -1619,6 +1630,7 @@ popup.warning.nodeBanned=One of the {0} nodes got banned.
popup.warning.priceRelay=ripetitore di prezzo
popup.warning.seed=seme
popup.warning.mandatoryUpdate.trading=Si prega di aggiornare Haveno all'ultima versione. È stato rilasciato un aggiornamento obbligatorio che disabilita il trading per le vecchie versioni. Per ulteriori informazioni, consultare il forum Haveno.
+popup.warning.noFilter=Non abbiamo ricevuto un oggetto filtro dai nodi seme. Si prega di informare gli amministratori di rete di registrare un oggetto filtro.
popup.warning.burnXMR=Questa transazione non è possibile, poiché le commissioni di mining di {0} supererebbero l'importo da trasferire di {1}. Attendi fino a quando le commissioni di mining non saranno nuovamente basse o fino a quando non avrai accumulato più XMR da trasferire.
popup.warning.openOffer.makerFeeTxRejected=La commissione della transazione del creatore dell'offerta con ID {0} è stata rifiutata dalla rete Monero.\nTransazione ID={1}.\nL'offerta è stata rimossa per evitare ulteriori problemi.\nVai su \"Impostazioni/Informazioni di rete\" ed esegui una risincronizzazione SPV.\nPer ulteriore assistenza, contattare il canale di supporto Haveno nel team di Haveno Keybase.
@@ -1686,6 +1698,9 @@ popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed
popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys
popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign
+popup.info.buyerAsTakerWithoutDeposit.headline=Nessun deposito richiesto dal compratore
+popup.info.buyerAsTakerWithoutDeposit=La tua offerta non richiederà un deposito di sicurezza o una commissione da parte dell'acquirente XMR.\n\nPer accettare la tua offerta, devi condividere una passphrase con il tuo partner commerciale al di fuori di Haveno.\n\nLa passphrase viene generata automaticamente e mostrata nei dettagli dell'offerta dopo la creazione.
+
####################################################################
# Notifications
####################################################################
@@ -1811,6 +1826,7 @@ navigation.support=\"Supporto\"
formatter.formatVolumeLabel={0} importo{1}
formatter.makerTaker=Maker come {0} {1} / Taker come {2} {3}
+formatter.makerTakerLocked=Maker come {0} {1} / Taker come {2} {3} 🔒
formatter.youAreAsMaker=You are: {1} {0} (maker) / Taker is: {3} {2}
formatter.youAreAsTaker=You are: {1} {0} (taker) / Maker is: {3} {2}
formatter.youAre=Sei {0} {1} ({2} {3})
@@ -1958,8 +1974,6 @@ payment.accountType=Tipologia conto
payment.checking=Verifica
payment.savings=Risparmi
payment.personalId=ID personale
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Haveno account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Haveno.
payment.fasterPayments.newRequirements.info=Alcune banche hanno iniziato a verificare il nome completo del destinatario per i trasferimenti di Faster Payments (UK). Il tuo attuale account Faster Payments non specifica un nome completo.\n\nTi consigliamo di ricreare il tuo account Faster Payments in Haveno per fornire ai futuri acquirenti {0} un nome completo.\n\nQuando si ricrea l'account, assicurarsi di copiare il codice di ordinamento preciso, il numero di account e i valori salt della verifica dell'età dal vecchio account al nuovo account. Ciò garantirà il mantenimento dell'età del tuo account esistente e lo stato della firma.\n
payment.moneyGram.info=When using MoneyGram the XMR buyer has to send the Authorisation number and a photo of the receipt by email to the XMR seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process.
@@ -1976,12 +1990,14 @@ payment.revolut.info=Revolut requires the 'Username' as account ID not the phone
payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''Username''.\nPlease enter your Revolut ''Username'' to update your account data.\nThis will not affect your account age signing status.
payment.revolut.addUserNameInfo.headLine=Update Revolut account
+payment.cashapp.info=Si prega di notare che Cash App ha un rischio di chargeback più elevato rispetto alla maggior parte dei bonifici bancari.
+payment.venmo.info=Si prega di notare che Venmo ha un rischio di chargeback più elevato rispetto alla maggior parte dei bonifici bancari.
+payment.paypal.info=Si prega di notare che PayPal ha un rischio di chargeback più elevato rispetto alla maggior parte dei bonifici bancari.
+
payment.amazonGiftCard.upgrade=Amazon gift cards payment method requires the country to be specified.
payment.account.amazonGiftCard.addCountryInfo={0}\nYour existing Amazon Gift Card account ({1}) does not have a Country specified.\nPlease enter your Amazon Gift Card Country to update your account data.\nThis will not affect your account age status.
payment.amazonGiftCard.upgrade.headLine=Update Amazon Gift Card account
-payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Haveno requires that you understand the following:\n\n- XMR buyers must write the XMR Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- XMR buyers must send the USPMO to the XMR seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Haveno mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Haveno.
-
payment.payByMail.contact=Informazioni di contatto
payment.payByMail.contact.prompt=Name or nym envelope should be addressed to
payment.f2f.contact=Informazioni di contatto
@@ -1990,11 +2006,13 @@ payment.f2f.city=Città per l'incontro 'Faccia a faccia'
payment.f2f.city.prompt=La città verrà visualizzata con l'offerta
payment.shared.optionalExtra=Ulteriori informazioni opzionali
payment.shared.extraInfo=Informazioni aggiuntive
-payment.shared.extraInfo.prompt=Define any special terms, conditions, or details you would like to be displayed with your offers for this payment account (users will see this info before accepting offers).
-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 be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the XMR 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: [HYPERLINK:https://docs.haveno.exchange/trading-rules.html#f2f-trading]
+payment.shared.extraInfo.offer=Informazioni aggiuntive sull'offerta
+payment.shared.extraInfo.prompt.paymentAccount=Definisci eventuali termini, condizioni o dettagli speciali che desideri vengano visualizzati con le tue offerte per questo account di pagamento (gli utenti vedranno queste informazioni prima di accettare le offerte).
+payment.shared.extraInfo.prompt.offer=Definisci eventuali termini, condizioni o dettagli speciali che desideri mostrare con la tua offerta.
+payment.shared.extraInfo.noDeposit=Dettagli di contatto e termini dell'offerta
payment.f2f.info.openURL=Apri sito web
payment.f2f.offerbook.tooltip.countryAndCity=Paese e città: {0} / {1}
-payment.f2f.offerbook.tooltip.extra=Ulteriori informazioni: {0}
+payment.shared.extraInfo.tooltip=Ulteriori informazioni: {0}
payment.japan.bank=Banca
payment.japan.branch=Filiale
@@ -2003,7 +2021,10 @@ payment.japan.recipient=Nome
payment.australia.payid=PayID
payment.payid=PayID linked to financial institution. Like email address or mobile phone.
payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.paysafe.info=Per la tua protezione, sconsigliamo vivamente di utilizzare i PIN di Paysafecard per i pagamenti.\n\n\
+ Le transazioni effettuate tramite PIN non possono essere verificate in modo indipendente per la risoluzione delle controversie. Se si verifica un problema, il recupero dei fondi potrebbe non essere possibile.\n\n\
+ Per garantire la sicurezza delle transazioni con risoluzione delle controversie, utilizza sempre metodi di pagamento che forniscono registrazioni verificabili.
# We use constants from the code so we do not use our normal naming convention
@@ -2083,7 +2104,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=Amazon eGift Card
# suppress inspection "UnusedProperty"
@@ -2135,7 +2156,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=Amazon eGift Card
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_ja.properties b/core/src/main/resources/i18n/displayStrings_ja.properties
index 478e11353b..83f078a7c3 100644
--- a/core/src/main/resources/i18n/displayStrings_ja.properties
+++ b/core/src/main/resources/i18n/displayStrings_ja.properties
@@ -40,6 +40,8 @@ shared.buyMonero=ビットコインを買う
shared.sellMonero=ビットコインを売る
shared.buyCurrency={0}を買う
shared.sellCurrency={0}を売る
+shared.buyCurrencyLocked={0}を買う 🔒
+shared.sellCurrencyLocked={0}を売る 🔒
shared.buyingXMRWith=XMRを{0}で買う
shared.sellingXMRFor=XMRを{0}で売る
shared.buyingCurrency={0}を購入中 (XMRを売却中)
@@ -186,7 +188,7 @@ shared.total=合計
shared.totalsNeeded=必要な資金
shared.tradeWalletAddress=トレードウォレットアドレス
shared.tradeWalletBalance=トレードウォレット残高
-shared.reserveExactAmount=必要な資金のみを予約してください。提供が有効になる前に、マイニング手数料と10回の確認(約20分)が必要な場合があります。
+shared.reserveExactAmount=必要な資金のみを予約してください。オファーが公開されるまでにマイニング手数料と約20分が必要です。
shared.makerTxFee=メイカー: {0}
shared.takerTxFee=テイカー: {0}
shared.iConfirm=確認します
@@ -330,6 +332,7 @@ offerbook.createOffer=オファーを作る
offerbook.takeOffer=オファーを受ける
offerbook.takeOfferToBuy={0}購入オファーを受ける
offerbook.takeOfferToSell={0}売却オファーを受ける
+offerbook.takeOffer.enterChallenge=オファーのパスフレーズを入力してください
offerbook.trader=取引者
offerbook.offerersBankId=メイカーの銀行ID (BIC/SWIFT): {0}
offerbook.offerersBankName=メーカーの銀行名: {0}
@@ -340,6 +343,8 @@ offerbook.availableOffers=利用可能なオファー
offerbook.filterByCurrency=通貨でフィルター
offerbook.filterByPaymentMethod=支払い方法でフィルター
offerbook.matchingOffers=アカウントと一致するオファー
+offerbook.filterNoDeposit=デポジットなし
+offerbook.noDepositOffers=預金不要のオファー(パスフレーズ必須)
offerbook.timeSinceSigning=アカウント情報
offerbook.timeSinceSigning.info=このアカウントは認証されまして、{0}
offerbook.timeSinceSigning.info.arbitrator=調停人に署名されました。ピアアカウントも署名できます
@@ -485,7 +490,10 @@ createOffer.setDepositAsBuyer=購入時のセキュリティデポジット (%)
createOffer.setDepositForBothTraders=両方の取引者の保証金を設定する(%)
createOffer.securityDepositInfo=あなたの買い手のセキュリティデポジットは{0}です
createOffer.securityDepositInfoAsBuyer=あなたの購入時のセキュリティデポジットは{0}です
-createOffer.minSecurityDepositUsed=最小値の買い手の保証金は使用されます
+createOffer.minSecurityDepositUsed=最低セキュリティデポジットが使用されます
+createOffer.buyerAsTakerWithoutDeposit=購入者に保証金は不要(パスフレーズ保護)
+createOffer.myDeposit=私の保証金(%)
+createOffer.myDepositInfo=あなたのセキュリティデポジットは{0}です
####################################################################
@@ -509,6 +517,8 @@ takeOffer.fundsBox.networkFee=合計マイニング手数料
takeOffer.fundsBox.takeOfferSpinnerInfo=オファーを受け入れる: {0}
takeOffer.fundsBox.paymentLabel=次のIDとのHavenoトレード: {0}
takeOffer.fundsBox.fundsStructure=({0} セキュリティデポジット, {1} 取引手数料, {2}マイニング手数料)
+takeOffer.fundsBox.noFundingRequiredTitle=資金は必要ありません
+takeOffer.fundsBox.noFundingRequiredDescription=このオファーを受けるには、Haveno外で売り手からオファーパスフレーズを取得してください。
takeOffer.success.headline=オファー受け入れに成功しました
takeOffer.success.info=あなたのトレード状態は「ポートフォリオ/オープントレード」で見られます
takeOffer.error.message=オファーの受け入れ時にエラーが発生しました。\n\n{0}
@@ -630,7 +640,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=重要な要件: \n支払いが
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal={0}を「米国の郵便為替」でXMRの売り手に送付してください。\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=\"郵送で現金\"で、{0}をXMR売り手に送って下さい。詳細な指示はトレード契約書に書いてあります、そして分からない点があれば取引者チャットで質問できます。「郵送で現金」について詳しくはHavenoのWikiを参照:[HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail]\n
+portfolio.pending.step2_buyer.payByMail=\"郵送で現金\"で、{0}をXMR売り手に送って下さい。詳細な指示はトレード契約書に書いてあります、そして分からない点があれば取引者チャットで質問できます。「郵送で現金」について詳しくはHavenoのWikiを参照:[HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail]\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=特定された支払い方法で{0}をXMRの売り手に支払ってお願いします。売り手のアカウント詳細は次の画面に表示されます。\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1464,6 +1474,7 @@ offerDetailsWindow.confirm.maker=承認: ビットコインを{0}オファーを
offerDetailsWindow.confirm.taker=承認: ビットコインを{0}オファーを受ける
offerDetailsWindow.creationDate=作成日
offerDetailsWindow.makersOnion=メイカーのonionアドレス
+offerDetailsWindow.challenge=オファーパスフレーズ
qRCodeWindow.headline=QRコード
qRCodeWindow.msg=外部ウォレットからHavenoウォレットへ送金するのに、このQRコードを利用して下さい。
@@ -1504,7 +1515,7 @@ tacWindow.disagree=同意せずにに終了
tacWindow.arbitrationSystem=紛争解決
tradeDetailsWindow.headline=トレード
-tradeDetailsWindow.disputedPayoutTxId=係争中の支払い取引ID:
+tradeDetailsWindow.disputedPayoutTxId=係争中の支払い取引ID
tradeDetailsWindow.tradeDate=取引日
tradeDetailsWindow.txFee=マイニング手数料
tradeDetailsWindow.tradePeersOnion=トレード相手のonionアドレス
@@ -1577,7 +1588,7 @@ popup.headline.error=エラー
popup.doNotShowAgain=次回から表示しない
popup.reportError.log=ログファイルを開く
popup.reportError.gitHub=GitHub issue trackerに報告
-popup.reportError={0}\n\nソフトウェアの改善に役立てるため、https://github.com/bisq-network/bisq/issues で新しい issue を開いてこのバグを報告してください。\n下のボタンのいずれかをクリックすると、上記のエラーメッセージがクリップボードにコピーされます。\n「ログファイルを開く」を押して、コピーを保存し、バグレポートに添付されるhaveno.logファイル含めると、デバッグが容易になります。
+popup.reportError={0}\n\nソフトウェアの改善に役立てるため、https://github.com/haveno-dex/haveno/issues で新しい issue を開いてこのバグを報告してください。\n下のボタンのいずれかをクリックすると、上記のエラーメッセージがクリップボードにコピーされます。\n「ログファイルを開く」を押して、コピーを保存し、バグレポートに添付されるhaveno.logファイル含めると、デバッグが容易になります。
popup.error.tryRestart=アプリケーションを再起動し、ネットワーク接続を確認して問題を解決できるかどうかを確認してください。
popup.error.takeOfferRequestFailed=誰かがあなたのいずれかのオファーを受けようと時にエラーが発生しました:\n{0}
@@ -1620,6 +1631,7 @@ popup.warning.nodeBanned={0}ノードの1つが禁止されました。
popup.warning.priceRelay=価格中継
popup.warning.seed=シード
popup.warning.mandatoryUpdate.trading=最新のHavenoバージョンに更新してください。古いバージョンのトレードを無効にする必須の更新プログラムがリリースされました。詳細については、Havenoフォーラムをご覧ください。
+popup.warning.noFilter=シードノードからフィルターオブジェクトを受け取っていません。ネットワーク管理者にフィルターオブジェクトを登録するように通知してください。
popup.warning.burnXMR={0}のマイニング手数料が{1}の送金額を超えるため、このトランザクションは利用不可です。マイニング手数料が再び低くなるか、送金するXMRがさらに蓄積されるまでお待ちください。
popup.warning.openOffer.makerFeeTxRejected=ID{0}で識別されるオファーのためのメイカー手数料トランザクションがビットコインネットワークに拒否されました。\nトランザクションID= {1} 。\n更なる問題を避けるため、そのオファーは削除されました。\n\"設定/ネットワーク情報\"を開いてSPV再同期を行って下さい。\nさらにサポートを受けるため、Haveno Keybaseチームのサポートチャンネルに連絡して下さい。
@@ -1689,6 +1701,9 @@ popup.accountSigning.unsignedPubKeys.signed=パブリックキーは署名され
popup.accountSigning.unsignedPubKeys.result.signed=署名されたパブリックキー
popup.accountSigning.unsignedPubKeys.result.failed=署名が失敗しました
+popup.info.buyerAsTakerWithoutDeposit.headline=購入者による保証金は不要
+popup.info.buyerAsTakerWithoutDeposit=あなたのオファーには、XMR購入者からのセキュリティデポジットや手数料は必要ありません。\n\nオファーを受け入れるには、Haveno外で取引相手とパスフレーズを共有する必要があります。\n\nパスフレーズは自動的に生成され、作成後にオファーの詳細に表示されます。
+
####################################################################
# Notifications
####################################################################
@@ -1814,6 +1829,7 @@ navigation.support=「サポート」
formatter.formatVolumeLabel={0} 額{1}
formatter.makerTaker=メイカーは{0} {1} / テイカーは{2} {3}
+formatter.makerTakerLocked=メイカーは{0} {1} / テイカーは{2} {3} 🔒
formatter.youAreAsMaker=あなたは:{1} {0}(メイカー) / テイカーは:{3} {2}
formatter.youAreAsTaker=あなたは:{1} {0}(テイカー) / メイカーは{3} {2}
formatter.youAre=あなたは{0} {1} ({2} {3})
@@ -1961,8 +1977,6 @@ payment.accountType=口座種別
payment.checking=当座口座
payment.savings=普通口座
payment.personalId=個人ID
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelleは他の銀行を介して利用するとよりうまくいく送金サービスです。\n\n1. あなたの銀行がZelleと協力するか(そして利用の方法)をここから確認して下さい: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. 送金制限に注意して下さい。制限は銀行によって異なり、1日、1週、1月当たりの制限に分けられていることが多い。\n\n3. 銀行がZelleと協力しない場合でも、Zelleのモバイルアプリ版を使えますが、送金制限ははるかに低くなります。\n\n4. Havenoアカウントで特定される名前は必ずZelleアカウントと銀行口座に特定される名前と合う必要があります。\n\nトレード契約書とおりにZelleトランザクションを完了できなければ、一部(あるいは全て)のセキュリティデポジットを失う可能性はあります。\n\nZelleにおいてやや高い支払取り消しリスクがあるので、売り手はメールやSMSで無署名買い手に連絡して、Havenoに特定されるZelleアカウントの所有者かどうかを確かめるようにおすすめします。
payment.fasterPayments.newRequirements.info=「Faster Payments」で送金する場合、銀行が受信者の姓名を確認するケースが最近多くなりました。現在の「Faster Payments」アカウントは姓名を特定しません。\n\nこれからの{0}買い手に姓名を提供するため、Haveno内に新しい「Faster Payments」アカウントを作成するのを検討して下さい。\n\n新しいアカウントを作成すると、完全に同じ分類コード、アカウントの口座番号、そしてアカウント年齢検証ソルト値を古いアカウントから新しいアカウントにコピーして下さい。こうやって現在のアカウントの年齢そして署名状況は維持されます。
payment.moneyGram.info=MoneyGramを使用する場合、XMRの買い手は認証番号と領収書の写真をEメールでXMRの売り手に送信する必要があります。領収書には、売り手の氏名、市区町村、国、金額を明確に記載する必要があります。トレードプロセスにて、売り手のEメールは買い手に表示されます。
@@ -1979,6 +1993,10 @@ payment.revolut.info=以前の場合と違って、Revolutは電話番号やメ
payment.account.revolut.addUserNameInfo={0}\n現在の「Revolut」アカウント({1})には「ユーザ名」がありません。 \nアカウントデータを更新するのにRevolutの「ユーザ名」を入力して下さい。\nアカウント年齢署名状況に影響を及ぼしません。
payment.revolut.addUserNameInfo.headLine=Revolutアカウントをアップデートする
+payment.cashapp.info=Cash App はほとんどの銀行振込よりもチャージバックリスクが高いことにご注意ください。
+payment.venmo.info=Venmo はほとんどの銀行振込よりもチャージバックリスクが高いことにご注意ください。
+payment.paypal.info=PayPal はほとんどの銀行振込よりもチャージバックリスクが高いことにご注意ください。
+
payment.amazonGiftCard.upgrade=Amazon gift cards payment method requires the country to be specified.
payment.account.amazonGiftCard.addCountryInfo={0}\nYour existing Amazon Gift Card account ({1}) does not have a Country specified.\nPlease enter your Amazon Gift Card Country to update your account data.\nThis will not affect your account age status.
payment.amazonGiftCard.upgrade.headLine=Update Amazon Gift Card account
@@ -2012,11 +2030,14 @@ payment.f2f.city=「対面」で会うための市区町村
payment.f2f.city.prompt=オファーとともに市区町村が表示されます
payment.shared.optionalExtra=オプションの追加情報
payment.shared.extraInfo=追加情報
-payment.shared.extraInfo.prompt=この支払いアカウントのオファーと一緒に表示したい特別な契約条件または詳細を定義して下さい(オファーを受ける前に、ユーザはこの情報を見れます)。
+payment.shared.extraInfo.offer=追加のオファー情報
+payment.shared.extraInfo.prompt.paymentAccount=この支払いアカウントのオファーと一緒に表示したい特別な契約条件または詳細を定義して下さい(オファーを受ける前に、ユーザはこの情報を見れます)。
+payment.shared.extraInfo.prompt.offer=提供内容と共に表示したい特別な用語、条件、または詳細を定義してください。
+payment.shared.extraInfo.noDeposit=連絡先詳細およびオファー条件
payment.f2f.info=「対面」トレードには違うルールがあり、オンライントレードとは異なるリスクを伴います。\n\n主な違いは以下の通りです。\n●取引者は、提供される連絡先の詳細を使用して、出会う場所と時間に関する情報を交換する必要があります。\n●取引者は自分のノートパソコンを持ってきて、集合場所で「送金」と「入金」の確認をする必要があります。\n●メイカーに特別な「取引条件」がある場合は、アカウントの「追加情報」テキストフィールドにその旨を記載する必要があります。\n●オファーを受けると、テイカーはメイカーの「トレード条件」に同意したものとします。\n●係争が発生した場合、集合場所で何が起きたのかについての改ざん防止証明を入手することは通常困難であるため、調停者や調停人はあまりサポートをできません。このような場合、XMRの資金は無期限に、または取引者が合意に達するまでロックされる可能性があります。\n\n「対面」トレードでの違いを完全に理解しているか確認するためには、次のURLにある手順と推奨事項をお読みください:[HYPERLINK:https://docs.haveno.exchange/trading-rules.html#f2f-trading]
payment.f2f.info.openURL=Webページを開く
payment.f2f.offerbook.tooltip.countryAndCity=国と都市: {0} / {1}
-payment.f2f.offerbook.tooltip.extra=追加情報: {0}
+payment.shared.extraInfo.tooltip=追加情報: {0}
payment.japan.bank=銀行
payment.japan.branch=支店
@@ -2025,7 +2046,10 @@ payment.japan.recipient=名義
payment.australia.payid=PayID
payment.payid=金融機関と繋がっているPayID。例えばEメールアドレスそれとも携帯電話番号。
payment.payid.info=銀行、信用金庫、あるいは住宅金融組合アカウントと安全に繋がれるPayIDとして使われる電話番号、Eメールアドレス、それともオーストラリア企業番号(ABN)。すでにオーストラリアの金融機関とPayIDを作った必要があります。送金と受取の金融機関は両方PayIDをサポートする必要があります。詳しくは以下を訪れて下さい [HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=アマゾンeGiftカードで支払うには、アマゾンアカウントを使ってeGiftカードをXMR売り手に送る必要があります。\n\nHavenoはeGiftカードの送り先になるXMR売り手のメールアドレスそれとも電話番号を表示します。そしてeGiftカードのメッセージフィールドに、必ずトレードIDを入力して下さい。最良の慣行について詳しくはWikiを参照して下さい:[HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card]\n\n3つの注意点:\n- 可能であれば、100米ドル価格以下のeGiftカードを送って下さい。それ以上の価格はアマゾンに不正な取引というフラグが立てられることがあります。\n- eGiftカードのメッセージフィールドに、トレードIDと一緒に信ぴょう性のあるメッセージを入力して下さい。(例えば隆さん、「お誕生日おめでとう!」)。(そして確認のため、取引者チャットでトレードピアにメッセージの内容を伝えて下さい)。\n- アマゾンeGiftカードは買われたサイトのみに交換できます(例えば、amazon.jpから買われたカードはamazon.jpのみに交換できます)。
+payment.amazonGiftCard.info=アマゾンeGiftカードで支払うには、アマゾンアカウントを使ってeGiftカードをXMR売り手に送る必要があります。\n\nHavenoはeGiftカードの送り先になるXMR売り手のメールアドレスそれとも電話番号を表示します。そしてeGiftカードのメッセージフィールドに、必ずトレードIDを入力して下さい。最良の慣行について詳しくはWikiを参照して下さい:[HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card]\n\n3つの注意点:\n- 可能であれば、100米ドル価格以下のeGiftカードを送って下さい。それ以上の価格はアマゾンに不正な取引というフラグが立てられることがあります。\n- eGiftカードのメッセージフィールドに、トレードIDと一緒に信ぴょう性のあるメッセージを入力して下さい。(例えば隆さん、「お誕生日おめでとう!」)。(そして確認のため、取引者チャットでトレードピアにメッセージの内容を伝えて下さい)。\n- アマゾンeGiftカードは買われたサイトのみに交換できます(例えば、amazon.jpから買われたカードはamazon.jpのみに交換できます)。
+payment.paysafe.info=あなたの保護のため、支払いにPaysafecard PINの使用は強くお勧めしません。\n\n\
+ PINを使用した取引は、紛争解決のために独立して確認することができません。問題が発生した場合、資金の回収が不可能になることがあります。\n\n\
+ 取引の安全性と紛争解決を確保するため、常に確認可能な記録を提供する支払い方法を使用してください。
# We use constants from the code so we do not use our normal naming convention
@@ -2105,7 +2129,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=アマゾンeGiftカード
# suppress inspection "UnusedProperty"
@@ -2157,7 +2181,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=アマゾンeGiftカード
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_pt-br.properties b/core/src/main/resources/i18n/displayStrings_pt-br.properties
index 8fa3d80a71..767e0b8999 100644
--- a/core/src/main/resources/i18n/displayStrings_pt-br.properties
+++ b/core/src/main/resources/i18n/displayStrings_pt-br.properties
@@ -40,6 +40,8 @@ shared.buyMonero=Comprar monero
shared.sellMonero=Vender monero
shared.buyCurrency=Comprar {0}
shared.sellCurrency=Vender {0}
+shared.buyCurrencyLocked=Comprar {0} 🔒
+shared.sellCurrencyLocked=Vender {0} 🔒
shared.buyingXMRWith=comprando XMR com {0}
shared.sellingXMRFor=vendendo XMR por {0}
shared.buyingCurrency=comprando {0} (vendendo XMR)
@@ -186,7 +188,7 @@ shared.total=Total
shared.totalsNeeded=Fundos necessária
shared.tradeWalletAddress=Endereço da carteira de negociação
shared.tradeWalletBalance=Saldo da carteira de negociação
-shared.reserveExactAmount=Reserve apenas os fundos necessários. Pode ser necessário uma taxa de mineração e 10 confirmações (~20 minutos) antes que sua oferta esteja ativa.
+shared.reserveExactAmount=Reserve apenas os fundos necessários. Requer uma taxa de mineração e cerca de 20 minutos antes que sua oferta seja publicada.
shared.makerTxFee=Ofertante: {0}
shared.takerTxFee=Aceitador: {0}
shared.iConfirm=Eu confirmo
@@ -333,6 +335,7 @@ offerbook.createOffer=Criar oferta
offerbook.takeOffer=Aceitar oferta
offerbook.takeOfferToBuy=Comprar {0}
offerbook.takeOfferToSell=Vender {0}
+offerbook.takeOffer.enterChallenge=Digite a senha da oferta
offerbook.trader=Trader
offerbook.offerersBankId=ID do banco do ofertante (BIC/SWIFT): {0}
offerbook.offerersBankName=Nome do banco do ofertante: {0}
@@ -342,7 +345,9 @@ 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.matchingOffers=Offers matching my accounts
+offerbook.matchingOffers=Ofertas que correspondem às minhas contas
+offerbook.filterNoDeposit=Sem depósito
+offerbook.noDepositOffers=Ofertas sem depósito (senha necessária)
offerbook.timeSinceSigning=Account info
offerbook.timeSinceSigning.info=Esta conta foi verificada e {0}
offerbook.timeSinceSigning.info.arbitrator=assinada por um árbitro e pode assinar contas de pares
@@ -487,7 +492,10 @@ createOffer.setDepositAsBuyer=Definir o meu depósito de segurança como comprad
createOffer.setDepositForBothTraders=Set both traders' security deposit (%)
createOffer.securityDepositInfo=O seu depósito de segurança do comprador será de {0}
createOffer.securityDepositInfoAsBuyer=O seu depósito de segurança como comprador será de {0}
-createOffer.minSecurityDepositUsed=Depósito de segurança mínimo para compradores foi usado
+createOffer.minSecurityDepositUsed=O depósito de segurança mínimo é utilizado
+createOffer.buyerAsTakerWithoutDeposit=Nenhum depósito necessário do comprador (protegido por senha)
+createOffer.myDeposit=Meu depósito de segurança (%)
+createOffer.myDepositInfo=Seu depósito de segurança será {0}
####################################################################
@@ -511,6 +519,8 @@ takeOffer.fundsBox.networkFee=Total em taxas de mineração
takeOffer.fundsBox.takeOfferSpinnerInfo=Aceitando a oferta: {0}
takeOffer.fundsBox.paymentLabel=negociação Haveno com ID {0}
takeOffer.fundsBox.fundsStructure=({0} depósito de segurança, {1} taxa de transação, {2} taxa de mineração)
+takeOffer.fundsBox.noFundingRequiredTitle=Sem financiamento necessário
+takeOffer.fundsBox.noFundingRequiredDescription=Obtenha a frase secreta da oferta com o vendedor fora do Haveno para aceitar esta oferta.
takeOffer.success.headline=Você aceitou uma oferta com sucesso.
takeOffer.success.info=Você pode ver o status de sua negociação em \"Portfolio/Negociações em aberto\".
takeOffer.error.message=Ocorreu um erro ao aceitar a oferta.\n\n{0}
@@ -632,7 +642,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=IMPORTANTE:\nApós ter feito o
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=Envie {0} através de \"US Postal Money Order\" para o vendedor de XMR.\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Please pay {0} via the specified payment method to the XMR seller. You''ll find the seller's account details on the next screen.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1467,6 +1477,7 @@ offerDetailsWindow.confirm.maker=Criar oferta para {0} monero
offerDetailsWindow.confirm.taker=Confirmar: Aceitar oferta de {0} monero
offerDetailsWindow.creationDate=Criada em
offerDetailsWindow.makersOnion=Endereço onion do ofertante
+offerDetailsWindow.challenge=Passphrase da oferta
qRCodeWindow.headline=QR Code
qRCodeWindow.msg=Please use this QR code for funding your Haveno wallet from your external wallet.
@@ -1507,7 +1518,7 @@ tacWindow.disagree=Eu não concordo e desisto
tacWindow.arbitrationSystem=Resolução de disputas
tradeDetailsWindow.headline=Negociação
-tradeDetailsWindow.disputedPayoutTxId=ID de transação do pagamento disputado:
+tradeDetailsWindow.disputedPayoutTxId=ID de transação do pagamento disputado
tradeDetailsWindow.tradeDate=Data da negociação
tradeDetailsWindow.txFee=Taxa de mineração
tradeDetailsWindow.tradePeersOnion=Endereço onion dos parceiros de negociação
@@ -1581,7 +1592,7 @@ popup.headline.error=Erro
popup.doNotShowAgain=Não mostrar novamente
popup.reportError.log=Abrir arquivo de log
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 haveno.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.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/haveno-dex/haveno/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 haveno.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=Houve um quando alguém tentou aceitar uma de suas ofertas:\n{0}
@@ -1626,6 +1637,7 @@ popup.warning.nodeBanned=One of the {0} nodes got banned.
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 Haveno. Um update obrigatório foi lançado e desabilita negociações em versões antigas. Por favor, veja o Fórum do Haveno para mais informações.
+popup.warning.noFilter=Não recebemos um objeto de filtro dos nós seed. Por favor, informe aos administradores da rede para registrar um objeto de filtro.
popup.warning.burnXMR=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 XMR para transferir.
popup.warning.openOffer.makerFeeTxRejected=A transação de taxa de ofertante para a oferta com ID {0} foi rejeitada pela rede Monero.\nID da transação: {1}.\nA oferta foi removida para evitar problemas adicionais.\nPor favor, vá até "Configurações/Informações da rede" e ressincronize o arquivo SPV.\nPara mais informações, por favor acesse o canal #support do time da Haveno na Keybase.
@@ -1693,6 +1705,9 @@ popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed
popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys
popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign
+popup.info.buyerAsTakerWithoutDeposit.headline=Nenhum depósito exigido do comprador
+popup.info.buyerAsTakerWithoutDeposit=Sua oferta não exigirá um depósito de segurança ou taxa do comprador de XMR.\n\nPara aceitar sua oferta, você deve compartilhar uma senha com seu parceiro de negociação fora do Haveno.\n\nA senha é gerada automaticamente e exibida nos detalhes da oferta após a criação.
+
####################################################################
# Notifications
####################################################################
@@ -1818,6 +1833,7 @@ navigation.support=\"Suporte\"
formatter.formatVolumeLabel={0} quantia{1}
formatter.makerTaker=Ofertante: {1} de {0} / Aceitador: {3} de {2}
+formatter.makerTakerLocked=Ofertante: {1} de {0} / Aceitador: {3} de {2} 🔒
formatter.youAreAsMaker=You are: {1} {0} (maker) / Taker is: {3} {2}
formatter.youAreAsTaker=You are: {1} {0} (taker) / Maker is: {3} {2}
formatter.youAre=Você está {0} {1} ({2} {3})
@@ -1965,8 +1981,6 @@ payment.accountType=Tipo de conta
payment.checking=Conta Corrente
payment.savings=Poupança
payment.personalId=Identificação pessoal
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Haveno account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Haveno.
payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Haveno to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved.
payment.moneyGram.info=When using MoneyGram the XMR buyer has to send the Authorisation number and a photo of the receipt by email to the XMR seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process.
@@ -1983,12 +1997,14 @@ payment.revolut.info=Revolut requires the 'Username' as account ID not the phone
payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''Username''.\nPlease enter your Revolut ''Username'' to update your account data.\nThis will not affect your account age signing status.
payment.revolut.addUserNameInfo.headLine=Update Revolut account
+payment.cashapp.info=Por favor, esteja ciente de que o Cash App tem um risco maior de estorno do que a maioria das transferências bancárias.
+payment.venmo.info=Por favor, esteja ciente de que o Venmo tem um risco maior de estorno do que a maioria das transferências bancárias.
+payment.paypal.info=Por favor, esteja ciente de que o PayPal tem um risco maior de estorno do que a maioria das transferências bancárias.
+
payment.amazonGiftCard.upgrade=Amazon gift cards payment method requires the country to be specified.
payment.account.amazonGiftCard.addCountryInfo={0}\nYour existing Amazon Gift Card account ({1}) does not have a Country specified.\nPlease enter your Amazon Gift Card Country to update your account data.\nThis will not affect your account age status.
payment.amazonGiftCard.upgrade.headLine=Update Amazon Gift Card account
-payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Haveno requires that you understand the following:\n\n- XMR buyers must write the XMR Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- XMR buyers must send the USPMO to the XMR seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Haveno mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Haveno.
-
payment.payByMail.contact=Informações para contato
payment.payByMail.contact.prompt=Name or nym envelope should be addressed to
payment.f2f.contact=Informações para contato
@@ -1997,11 +2013,13 @@ payment.f2f.city=Cidade para se encontrar 'Cara-a-cara'
payment.f2f.city.prompt=A cidade será exibida na oferta
payment.shared.optionalExtra=Informações adicionais opcionais
payment.shared.extraInfo=Informações adicionais
-payment.shared.extraInfo.prompt=Define any special terms, conditions, or details you would like to be displayed with your offers for this payment account (users will see this info before accepting offers).
-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 be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the XMR 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: [HYPERLINK:https://docs.haveno.exchange/trading-rules.html#f2f-trading]
+payment.shared.extraInfo.offer=Informações adicionais sobre a oferta
+payment.shared.extraInfo.prompt.paymentAccount=Defina quaisquer termos, condições ou detalhes especiais que você gostaria que fossem exibidos com suas ofertas para esta conta de pagamento (os usuários verão estas informações antes de aceitar as ofertas).
+payment.shared.extraInfo.prompt.offer=Defina quaisquer termos, condições ou detalhes especiais que você gostaria de exibir com sua oferta.
+payment.shared.extraInfo.noDeposit=Detalhes de contato e termos da oferta
payment.f2f.info.openURL=Abrir site
payment.f2f.offerbook.tooltip.countryAndCity=País e cidade: {0} / {1}
-payment.f2f.offerbook.tooltip.extra=Informações adicionais: {0}
+payment.shared.extraInfo.tooltip=Informações adicionais: {0}
payment.japan.bank=Banco
payment.japan.branch=Ramo
@@ -2010,7 +2028,10 @@ payment.japan.recipient=Nome
payment.australia.payid=PayID
payment.payid=PayID linked to financial institution. Like email address or mobile phone.
payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.paysafe.info=Para sua proteção, desaconselhamos fortemente o uso de PINs do Paysafecard para pagamento.\n\n\
+ Transações feitas por PINs não podem ser verificadas de forma independente para resolução de disputas. Se ocorrer um problema, a recuperação de fundos pode não ser possível.\n\n\
+ Para garantir a segurança das transações com resolução de disputas, sempre utilize métodos de pagamento que forneçam registros verificáveis.
# We use constants from the code so we do not use our normal naming convention
@@ -2090,7 +2111,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=Amazon eGift Card
# suppress inspection "UnusedProperty"
@@ -2142,7 +2163,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=Amazon eGift Card
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_pt.properties b/core/src/main/resources/i18n/displayStrings_pt.properties
index 27f94191e5..cba08c5769 100644
--- a/core/src/main/resources/i18n/displayStrings_pt.properties
+++ b/core/src/main/resources/i18n/displayStrings_pt.properties
@@ -40,6 +40,8 @@ shared.buyMonero=Comprar monero
shared.sellMonero=Vender monero
shared.buyCurrency=Comprar {0}
shared.sellCurrency=Vender {0}
+shared.buyCurrencyLocked=Comprar {0} 🔒
+shared.sellCurrencyLocked=Vender {0} 🔒
shared.buyingXMRWith=comprando XMR com {0}
shared.sellingXMRFor=vendendo XMR por {0}
shared.buyingCurrency=comprando {0} (vendendo XMR)
@@ -186,14 +188,14 @@ shared.total=Total
shared.totalsNeeded=Fundos necessários
shared.tradeWalletAddress=Endereço da carteira do negócio
shared.tradeWalletBalance=Saldo da carteira de negócio
-shared.reserveExactAmount=Reserve apenas os fundos necessários. Pode ser necessário uma taxa de mineração e 10 confirmações (~20 minutos) antes que sua oferta seja ativada.
+shared.reserveExactAmount=Reserve apenas os fundos necessários. Requer uma taxa de mineração e ~20 minutos antes que sua oferta seja publicada.
shared.makerTxFee=Ofertante: {0}
shared.takerTxFee=Aceitador: {0}
shared.iConfirm=Eu confirmo
shared.openURL=Abrir {0}
shared.fiat=Moeda fiduciária
shared.crypto=Cripto
-shared.preciousMetals=TODO
+shared.preciousMetals=Metais Preciosos
shared.all=Tudo
shared.edit=Editar
shared.advancedOptions=Opções avançadas
@@ -330,6 +332,7 @@ offerbook.createOffer=Criar oferta
offerbook.takeOffer=Aceitar oferta
offerbook.takeOfferToBuy=Aceitar oferta para comprar {0}
offerbook.takeOfferToSell=Aceitar oferta para vender {0}
+offerbook.takeOffer.enterChallenge=Digite a senha da oferta
offerbook.trader=Negociador
offerbook.offerersBankId=ID do banco do ofertante (BIC/SWIFT): {0}
offerbook.offerersBankName=Nome do banco do ofertante: {0}
@@ -339,7 +342,9 @@ 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.matchingOffers=Offers matching my accounts
+offerbook.matchingOffers=Ofertas que correspondem às minhas contas
+offerbook.filterNoDeposit=Sem depósito
+offerbook.noDepositOffers=Ofertas sem depósito (senha necessária)
offerbook.timeSinceSigning=Account info
offerbook.timeSinceSigning.info=Esta conta foi verificada e {0}
offerbook.timeSinceSigning.info.arbitrator=assinada pelo árbitro e pode assinar contas de pares
@@ -484,7 +489,10 @@ createOffer.setDepositAsBuyer=Definir o meu depósito de segurança enquanto com
createOffer.setDepositForBothTraders=Set both traders' security deposit (%)
createOffer.securityDepositInfo=O depósito de segurança do seu comprador será {0}
createOffer.securityDepositInfoAsBuyer=O seu depósito de segurança enquanto comprador será {0}
-createOffer.minSecurityDepositUsed=O mín. depósito de segurança para o comprador é utilizado
+createOffer.minSecurityDepositUsed=O depósito de segurança mínimo é utilizado
+createOffer.buyerAsTakerWithoutDeposit=Nenhum depósito exigido do comprador (protegido por frase secreta)
+createOffer.myDeposit=Meu depósito de segurança (%)
+createOffer.myDepositInfo=Seu depósito de segurança será {0}
####################################################################
@@ -508,6 +516,8 @@ takeOffer.fundsBox.networkFee=Total de taxas de mineração
takeOffer.fundsBox.takeOfferSpinnerInfo=Aceitando a oferta: {0}
takeOffer.fundsBox.paymentLabel=negócio do Haveno com ID {0}
takeOffer.fundsBox.fundsStructure=({0} depósito de segurança, {1} taxa de negócio, {2} taxa de mineração)
+takeOffer.fundsBox.noFundingRequiredTitle=Nenhum financiamento necessário
+takeOffer.fundsBox.noFundingRequiredDescription=Obtenha a senha da oferta com o vendedor fora do Haveno para aceitar esta oferta.
takeOffer.success.headline=Você aceitou uma oferta com sucesso.
takeOffer.success.info=Você pode ver o estado de seu negócio em \"Portefólio/Negócios abertos\".
takeOffer.error.message=Ocorreu um erro ao aceitar a oferta .\n\n{0}
@@ -629,7 +639,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=REQUISITO IMPORTANTE:\nDepois d
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=Por favor envie {0} por \"US Postal Money Order\" para o vendedor de XMR.\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Please pay {0} via the specified payment method to the XMR seller. You''ll find the seller's account details on the next screen.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1460,6 +1470,7 @@ offerDetailsWindow.confirm.maker=Confirmar: Criar oferta para {0} monero
offerDetailsWindow.confirm.taker=Confirmar: Aceitar oferta de {0} monero
offerDetailsWindow.creationDate=Data de criação
offerDetailsWindow.makersOnion=Endereço onion do ofertante
+offerDetailsWindow.challenge=Passphrase da oferta
qRCodeWindow.headline=QR Code
qRCodeWindow.msg=Please use this QR code for funding your Haveno wallet from your external wallet.
@@ -1500,7 +1511,7 @@ tacWindow.disagree=Eu não concordo e desisto
tacWindow.arbitrationSystem=Resolução da disputa
tradeDetailsWindow.headline=Negócio
-tradeDetailsWindow.disputedPayoutTxId=ID de transação do pagamento disputado:
+tradeDetailsWindow.disputedPayoutTxId=ID de transação do pagamento disputado
tradeDetailsWindow.tradeDate=Data de negócio
tradeDetailsWindow.txFee=Taxa de mineração
tradeDetailsWindow.tradePeersOnion=Endereço onion dos parceiros de negociação
@@ -1573,7 +1584,7 @@ popup.headline.error=Erro
popup.doNotShowAgain=Não mostrar novamente
popup.reportError.log=Abrir ficheiro de log
popup.reportError.gitHub=Relatar ao GitHub issue tracker
-popup.reportError={0}\n\nPara nos ajudar a melhorar o software, por favor reporte este erro abrindo um novo issue em https://github.com/bisq-network/bisq/issues.\nA mensagem de erro acima será copiada para a área de transferência quando você clicar num dos botões abaixo.\nSerá mais fácil fazer a depuração se você incluir o ficheiro haveno.log clicando "Abrir arquivo de log", salvando uma cópia e anexando-a ao seu relatório de erros.
+popup.reportError={0}\n\nPara nos ajudar a melhorar o software, por favor reporte este erro abrindo um novo issue em https://github.com/haveno-dex/haveno/issues.\nA mensagem de erro acima será copiada para a área de transferência quando você clicar num dos botões abaixo.\nSerá mais fácil fazer a depuração se você incluir o ficheiro haveno.log clicando "Abrir arquivo de log", salvando uma cópia e anexando-a ao seu relatório de erros.
popup.error.tryRestart=Por favor tente reiniciar o programa e verifique a sua conexão de Internet para ver se pode resolver o problema.
popup.error.takeOfferRequestFailed=Ocorreu um erro quando alguém tentou aceitar uma das suas ofertas:\n{0}
@@ -1616,6 +1627,7 @@ popup.warning.nodeBanned=One of the {0} nodes got banned.
popup.warning.priceRelay=transmissão de preço
popup.warning.seed=semente
popup.warning.mandatoryUpdate.trading=Por favor, atualize para a versão mais recente do Haveno. Uma atualização obrigatória que desativa negociação para versões antigas foi lançada. Por favor, confira o Fórum Haveno para mais informações.
+popup.warning.noFilter=Não recebemos um objeto de filtro dos nós sementes. Por favor, informe os administradores da rede para registrar um objeto de filtro.
popup.warning.burnXMR=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 XMR para transferir.
popup.warning.openOffer.makerFeeTxRejected=A transação da taxa de ofertante para a oferta com o ID {0} foi rejeitada pela rede do Monero.\nID da transação={1}.\nA oferta foi removida para evitar futuros problemas.\nPor favor vá à \"Definições/Informação da Rede\" e re-sincronize o ficheiro SPV.\nPara mais ajuda por favor contacte o canal de apoio do Haveno na equipa Keybase do Haveno.
@@ -1683,6 +1695,9 @@ popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed
popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys
popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign
+popup.info.buyerAsTakerWithoutDeposit.headline=Nenhum depósito exigido do comprador
+popup.info.buyerAsTakerWithoutDeposit=Sua oferta não exigirá um depósito de segurança ou taxa do comprador de XMR.\n\nPara aceitar sua oferta, você deve compartilhar uma senha com seu parceiro comercial fora do Haveno.\n\nA senha é gerada automaticamente e exibida nos detalhes da oferta após a criação.
+
####################################################################
# Notifications
####################################################################
@@ -1808,6 +1823,7 @@ navigation.support=\"Apoio\"
formatter.formatVolumeLabel={0} quantia{1}
formatter.makerTaker=Ofertante como {0} {1} / Aceitador como {2} {3}
+formatter.makerTakerLocked=Ofertante como {0} {1} / Aceitador como {2} {3} 🔒
formatter.youAreAsMaker=You are: {1} {0} (maker) / Taker is: {3} {2}
formatter.youAreAsTaker=You are: {1} {0} (taker) / Maker is: {3} {2}
formatter.youAre=Você é {0} {1} ({2} {3})
@@ -1955,8 +1971,6 @@ payment.accountType=Tipo de conta
payment.checking=Conta Corrente
payment.savings=Poupança
payment.personalId=ID pessoal
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Haveno account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Haveno.
payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Haveno to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved.
payment.moneyGram.info=When using MoneyGram the XMR buyer has to send the Authorisation number and a photo of the receipt by email to the XMR seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process.
@@ -1973,12 +1987,14 @@ payment.revolut.info=Revolut requires the 'Username' as account ID not the phone
payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''Username''.\nPlease enter your Revolut ''Username'' to update your account data.\nThis will not affect your account age signing status.
payment.revolut.addUserNameInfo.headLine=Update Revolut account
+payment.cashapp.info=Esteja ciente de que o Cash App tem um risco de estorno maior do que a maioria das transferências bancárias.
+payment.venmo.info=Esteja ciente de que o Venmo tem um risco de estorno maior do que a maioria das transferências bancárias.
+payment.paypal.info=Esteja ciente de que o PayPal tem um risco de estorno maior do que a maioria das transferências bancárias.
+
payment.amazonGiftCard.upgrade=Amazon gift cards payment method requires the country to be specified.
payment.account.amazonGiftCard.addCountryInfo={0}\nYour existing Amazon Gift Card account ({1}) does not have a Country specified.\nPlease enter your Amazon Gift Card Country to update your account data.\nThis will not affect your account age status.
payment.amazonGiftCard.upgrade.headLine=Update Amazon Gift Card account
-payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Haveno requires that you understand the following:\n\n- XMR buyers must write the XMR Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- XMR buyers must send the USPMO to the XMR seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Haveno mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Haveno.
-
payment.payByMail.contact=Informação de contacto
payment.payByMail.contact.prompt=Name or nym envelope should be addressed to
payment.f2f.contact=Informação de contacto
@@ -1987,11 +2003,13 @@ payment.f2f.city=Cidade para o encontro 'Face à face'
payment.f2f.city.prompt=A cidade será exibida com a oferta
payment.shared.optionalExtra=Informação adicional opcional
payment.shared.extraInfo=Informação adicional
-payment.shared.extraInfo.prompt=Define any special terms, conditions, or details you would like to be displayed with your offers for this payment account (users will see this info before accepting offers).
-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 be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the XMR 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: [HYPERLINK:https://docs.haveno.exchange/trading-rules.html#f2f-trading]
+payment.shared.extraInfo.offer=Informações adicionais sobre a oferta
+payment.shared.extraInfo.prompt.paymentAccount=Defina quaisquer termos especiais, condições ou detalhes que você gostaria de exibir com suas ofertas para esta conta de pagamento (os usuários verão essas informações antes de aceitar as ofertas).
+payment.shared.extraInfo.prompt.offer=Defina quaisquer termos, condições ou detalhes especiais que você gostaria de exibir com sua oferta.
+payment.shared.extraInfo.noDeposit=Detalhes de contato e termos da oferta
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.shared.extraInfo.tooltip=Informação adicional: {0}
payment.japan.bank=Banco
payment.japan.branch=Agência
@@ -2000,7 +2018,10 @@ payment.japan.recipient=Nome
payment.australia.payid=PayID
payment.payid=PayID linked to financial institution. Like email address or mobile phone.
payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.paysafe.info=Para sua proteção, desaconselhamos fortemente o uso de PINs do Paysafecard para pagamento.\n\n\
+ Transações feitas por PINs não podem ser verificadas de forma independente para resolução de disputas. Se ocorrer um problema, a recuperação dos fundos pode não ser possível.\n\n\
+ Para garantir a segurança das transações com resolução de disputas, sempre use métodos de pagamento que forneçam registros verificáveis.
# We use constants from the code so we do not use our normal naming convention
@@ -2080,7 +2101,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=Amazon eGift Card
# suppress inspection "UnusedProperty"
@@ -2132,7 +2153,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=Amazon eGift Card
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_ru.properties b/core/src/main/resources/i18n/displayStrings_ru.properties
index 6f1ba86d90..956e124eae 100644
--- a/core/src/main/resources/i18n/displayStrings_ru.properties
+++ b/core/src/main/resources/i18n/displayStrings_ru.properties
@@ -40,6 +40,8 @@ shared.buyMonero=Купить биткойн
shared.sellMonero=Продать биткойн
shared.buyCurrency=Купить {0}
shared.sellCurrency=Продать {0}
+shared.buyCurrencyLocked=Купить {0} 🔒
+shared.sellCurrencyLocked=Продать {0} 🔒
shared.buyingXMRWith=покупка ВТС за {0}
shared.sellingXMRFor=продажа ВТС за {0}
shared.buyingCurrency=покупка {0} (продажа ВТС)
@@ -186,7 +188,7 @@ shared.total=Всего
shared.totalsNeeded=Требуемая сумма
shared.tradeWalletAddress=Адрес кошелька сделки
shared.tradeWalletBalance=Баланс кошелька сделки
-shared.reserveExactAmount=Зарезервируйте только необходимые средства. Может потребоваться комиссия за майнинг и 10 подтверждений (~20 минут), прежде чем ваше предложение станет активным.
+shared.reserveExactAmount=Резервируйте только необходимые средства. Требуется комиссия за майнинг и ~20 минут, прежде чем ваше предложение станет активным.
shared.makerTxFee=Мейкер: {0}
shared.takerTxFee=Тейкер: {0}
shared.iConfirm=Подтверждаю
@@ -330,6 +332,7 @@ offerbook.createOffer=Создать предложение
offerbook.takeOffer=Принять предложение
offerbook.takeOfferToBuy=Принять предложение купить {0}
offerbook.takeOfferToSell=Принять предложение продать {0}
+offerbook.takeOffer.enterChallenge=Введите фразу-пароль предложения
offerbook.trader=Трейдер
offerbook.offerersBankId=Идент. банка (BIC/SWIFT) мейкера: {0}
offerbook.offerersBankName=Название банка мейкера: {0}
@@ -339,7 +342,9 @@ offerbook.offerersAcceptedBankSeats=Допустимые страны банка
offerbook.availableOffers=Доступные предложения
offerbook.filterByCurrency=Фильтровать по валюте
offerbook.filterByPaymentMethod=Фильтровать по способу оплаты
-offerbook.matchingOffers=Offers matching my accounts
+offerbook.matchingOffers=Предложения, соответствующие моим аккаунтам
+offerbook.filterNoDeposit=Нет депозита
+offerbook.noDepositOffers=Предложения без депозита (требуется пароль)
offerbook.timeSinceSigning=Account info
offerbook.timeSinceSigning.info=This account was verified and {0}
offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
@@ -484,7 +489,10 @@ createOffer.setDepositAsBuyer=Установить мой залог как по
createOffer.setDepositForBothTraders=Set both traders' security deposit (%)
createOffer.securityDepositInfo=Сумма залога покупателя: {0}
createOffer.securityDepositInfoAsBuyer=Сумма вашего залога: {0}
-createOffer.minSecurityDepositUsed=Min. buyer security deposit is used
+createOffer.minSecurityDepositUsed=Минимальный залог используется
+createOffer.buyerAsTakerWithoutDeposit=Залог от покупателя не требуется (защищено паролем)
+createOffer.myDeposit=Мой залог (%)
+createOffer.myDepositInfo=Ваш залог составит {0}
####################################################################
@@ -508,6 +516,8 @@ takeOffer.fundsBox.networkFee=Oбщая комиссия майнера
takeOffer.fundsBox.takeOfferSpinnerInfo=Принятие предложения: {0}
takeOffer.fundsBox.paymentLabel=Сделка в Haveno с идентификатором {0}
takeOffer.fundsBox.fundsStructure=({0} — залог, {1} — комиссия за сделку, {2} — комиссия майнера)
+takeOffer.fundsBox.noFundingRequiredTitle=Не требуется финансирование
+takeOffer.fundsBox.noFundingRequiredDescription=Получите пароль предложения от продавца вне Haveno, чтобы принять это предложение.
takeOffer.success.headline=Вы успешно приняли предложение.
takeOffer.success.info=Статус вашей сделки отображается в разделе \«Папка/Текущие сделки\».
takeOffer.error.message=Ошибка при принятии предложения:\n\n{0}
@@ -629,7 +639,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=ВАЖНОЕ ТРЕБОВАНИ
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=Отправьте {0} \«Почтовым денежным переводом США\» продавцу XMR.\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Please pay {0} via the specified payment method to the XMR seller. You''ll find the seller's account details on the next screen.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1461,6 +1471,7 @@ offerDetailsWindow.confirm.maker=Подтвердите: разместить п
offerDetailsWindow.confirm.taker=Подтвердите: принять предложение {0} биткойн
offerDetailsWindow.creationDate=Дата создания
offerDetailsWindow.makersOnion=Onion-адрес мейкера
+offerDetailsWindow.challenge=Пароль предложения
qRCodeWindow.headline=QR Code
qRCodeWindow.msg=Please use this QR code for funding your Haveno wallet from your external wallet.
@@ -1574,7 +1585,7 @@ popup.headline.error=Ошибка
popup.doNotShowAgain=Не показывать снова
popup.reportError.log=Открыть файл журнала
popup.reportError.gitHub=Сообщить о проблеме в Github
-popup.reportError={0}\n\nЧтобы помочь нам улучшить приложение, просьба сообщить об ошибке, открыв новую тему на https://github.com/bisq-network/bisq/issues. \nСообщение об ошибке будет скопировано в буфер обмена при нажатии любой из кнопок ниже.\nЕсли вы прикрепите к отчету о неисправности файл журнала haveno.log, нажав «Открыть файл журнала» и сохранив его копию, это поможет нам разобраться с проблемой быстрее.
+popup.reportError={0}\n\nЧтобы помочь нам улучшить приложение, просьба сообщить об ошибке, открыв новую тему на https://github.com/haveno-dex/haveno/issues. \nСообщение об ошибке будет скопировано в буфер обмена при нажатии любой из кнопок ниже.\nЕсли вы прикрепите к отчету о неисправности файл журнала haveno.log, нажав «Открыть файл журнала» и сохранив его копию, это поможет нам разобраться с проблемой быстрее.
popup.error.tryRestart=Попробуйте перезагрузить приложение и проверьте подключение к сети, чтобы попробовать решить проблему.
popup.error.takeOfferRequestFailed=Произошла ошибка, когда контрагент попытался принять одно из ваших предложений:\n{0}
@@ -1617,6 +1628,7 @@ popup.warning.nodeBanned=One of the {0} nodes got banned.
popup.warning.priceRelay=ретранслятор курса
popup.warning.seed=мнемоническая фраза
popup.warning.mandatoryUpdate.trading=Обновите Haveno до последней версии. Вышло обязательное обновление, которое делает невозможной торговлю в старых версиях приложения. Посетите форум Haveno, чтобы узнать подробности.
+popup.warning.noFilter=Мы не получили объект фильтра от узлов-источников. Пожалуйста, сообщите администраторам сети, чтобы они зарегистрировали объект фильтра.
popup.warning.burnXMR=Данную транзакцию невозможно завершить, так как плата за нее ({0}) превышает сумму перевода ({1}). Подождите, пока плата за транзакцию не снизится или пока у вас не появится больше XMR для завершения перевода.
popup.warning.openOffer.makerFeeTxRejected=The maker fee transaction for offer with ID {0} was rejected by the Monero network.\nTransaction ID={1}.\nThe offer has been removed to avoid further problems.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Haveno support channel at the Haveno Keybase team.
@@ -1684,6 +1696,9 @@ popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed
popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys
popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign
+popup.info.buyerAsTakerWithoutDeposit.headline=Депозит от покупателя не требуется
+popup.info.buyerAsTakerWithoutDeposit=Ваше предложение не потребует залога или комиссии от покупателя XMR.\n\nЧтобы принять ваше предложение, вы должны поделиться парольной фразой с вашим торговым партнером вне Haveno.\n\nПарольная фраза генерируется автоматически и отображается в деталях предложения после его создания.
+
####################################################################
# Notifications
####################################################################
@@ -1809,6 +1824,7 @@ navigation.support=\«Поддержка\»
formatter.formatVolumeLabel={0} сумма {1}
formatter.makerTaker=Мейкер как {0} {1} / Тейкер как {2} {3}
+formatter.makerTakerLocked=Мейкер как {0} {1} / Тейкер как {2} {3} 🔒
formatter.youAreAsMaker=You are: {1} {0} (maker) / Taker is: {3} {2}
formatter.youAreAsTaker=You are: {1} {0} (taker) / Maker is: {3} {2}
formatter.youAre=Вы {0} {1} ({2} {3})
@@ -1956,8 +1972,6 @@ payment.accountType=Тип счёта
payment.checking=Текущий
payment.savings=Сберегательный
payment.personalId=Личный идентификатор
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Haveno account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Haveno.
payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Haveno to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved.
payment.moneyGram.info=When using MoneyGram the XMR buyer has to send the Authorisation number and a photo of the receipt by email to the XMR seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process.
@@ -1974,12 +1988,14 @@ payment.revolut.info=Revolut requires the 'Username' as account ID not the phone
payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''Username''.\nPlease enter your Revolut ''Username'' to update your account data.\nThis will not affect your account age signing status.
payment.revolut.addUserNameInfo.headLine=Update Revolut account
+payment.cashapp.info=Обратите внимание, что Cash App имеет более высокий риск возврата платежей, чем большинство банковских переводов.
+payment.venmo.info=Обратите внимание, что Venmo имеет более высокий риск возврата платежей, чем большинство банковских переводов.
+payment.paypal.info=Обратите внимание, что PayPal имеет более высокий риск возврата платежей, чем большинство банковских переводов.
+
payment.amazonGiftCard.upgrade=Amazon gift cards payment method requires the country to be specified.
payment.account.amazonGiftCard.addCountryInfo={0}\nYour existing Amazon Gift Card account ({1}) does not have a Country specified.\nPlease enter your Amazon Gift Card Country to update your account data.\nThis will not affect your account age status.
payment.amazonGiftCard.upgrade.headLine=Update Amazon Gift Card account
-payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Haveno requires that you understand the following:\n\n- XMR buyers must write the XMR Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- XMR buyers must send the USPMO to the XMR seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Haveno mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Haveno.
-
payment.payByMail.contact=Контактная информация
payment.payByMail.contact.prompt=Name or nym envelope should be addressed to
payment.f2f.contact=Контактная информация
@@ -1988,11 +2004,14 @@ payment.f2f.city=Город для личной встречи
payment.f2f.city.prompt=Город будет указан в предложении
payment.shared.optionalExtra=Дополнительная необязательная информация
payment.shared.extraInfo=Дополнительная информация
-payment.shared.extraInfo.prompt=Define any special terms, conditions, or details you would like to be displayed with your offers for this payment account (users will see this info before accepting offers).
+payment.shared.extraInfo.offer=Дополнительная информация о предложении
+payment.shared.extraInfo.prompt.paymentAccount=Определите любые специальные термины, условия или детали, которые вы хотите, чтобы отображались с вашими предложениями для этого платежного аккаунта (пользователи увидят эту информацию перед принятием предложений).
+payment.shared.extraInfo.prompt.offer=Определите любые специальные условия, требования или детали, которые вы хотели бы указать в своем предложении.
+payment.shared.extraInfo.noDeposit=Контактные данные и условия предложения
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 be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the XMR 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: [HYPERLINK:https://docs.haveno.exchange/trading-rules.html#f2f-trading]
payment.f2f.info.openURL=Открыть веб-страницу
payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
-payment.f2f.offerbook.tooltip.extra=Дополнительная информация: {0}
+payment.shared.extraInfo.tooltip=Дополнительная информация: {0}
payment.japan.bank=Банк
payment.japan.branch=Branch
@@ -2001,7 +2020,10 @@ payment.japan.recipient=Имя
payment.australia.payid=PayID
payment.payid=PayID linked to financial institution. Like email address or mobile phone.
payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.paysafe.info=Для вашей защиты мы настоятельно не рекомендуем использовать PIN-коды Paysafecard для платежей.\n\n\
+ Транзакции, выполненные с помощью PIN-кодов, не могут быть независимо подтверждены для разрешения споров. В случае возникновения проблемы возврат средств может быть невозможен.\n\n\
+ Чтобы обеспечить безопасность транзакций с возможностью разрешения споров, всегда используйте методы оплаты, предоставляющие проверяемые записи.
# We use constants from the code so we do not use our normal naming convention
@@ -2081,7 +2103,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=Amazon eGift Card
# suppress inspection "UnusedProperty"
@@ -2133,7 +2155,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=Amazon eGift Card
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_th.properties b/core/src/main/resources/i18n/displayStrings_th.properties
index b603454ce5..5205776fe2 100644
--- a/core/src/main/resources/i18n/displayStrings_th.properties
+++ b/core/src/main/resources/i18n/displayStrings_th.properties
@@ -40,6 +40,8 @@ shared.buyMonero=ซื้อ monero (บิตคอยน์)
shared.sellMonero=ขาย monero (บิตคอยน์)
shared.buyCurrency=ซื้อ {0}
shared.sellCurrency=ขาย {0}
+shared.buyCurrencyLocked=ซื้อ {0} 🔒
+shared.sellCurrencyLocked=ขาย {0} 🔒
shared.buyingXMRWith=การซื้อ XMR กับ {0}
shared.sellingXMRFor=การขาย XMR แก่ {0}
shared.buyingCurrency=การซื้อ {0} (การขาย XMR)
@@ -186,7 +188,7 @@ shared.total=ยอดทั้งหมด
shared.totalsNeeded=เงินที่จำเป็น
shared.tradeWalletAddress=ที่อยู่ Trade wallet
shared.tradeWalletBalance=ยอดคงเหลือของ Trade wallet
-shared.reserveExactAmount=สงวนเฉพาะเงินทุนที่จำเป็นเท่านั้น อาจจะต้องเสียค่าขุดแร่และรับรอง 10 ครั้ง (~20 นาที) ก่อนที่ข้อเสนอของคุณจะเป็นสถานะออนไลน์
+shared.reserveExactAmount=สำรองเฉพาะเงินที่จำเป็น ต้องใช้ค่าธรรมเนียมการขุดและเวลาประมาณ 20 นาทีก่อนที่ข้อเสนอของคุณจะเผยแพร่
shared.makerTxFee=ผู้ทำ: {0}
shared.takerTxFee=ผู้รับ: {0}
shared.iConfirm=ฉันยืนยัน
@@ -330,6 +332,7 @@ offerbook.createOffer=สร้างข้อเสนอ
offerbook.takeOffer=รับข้อเสนอ
offerbook.takeOfferToBuy=Take offer to buy {0}
offerbook.takeOfferToSell=Take offer to sell {0}
+offerbook.takeOffer.enterChallenge=กรอกพาสเฟรสข้อเสนอ
offerbook.trader=Trader (เทรดเดอร์)
offerbook.offerersBankId=รหัสธนาคารของผู้สร้าง (BIC / SWIFT): {0}
offerbook.offerersBankName=ชื่อธนาคารของผู้สร้าง: {0}
@@ -339,7 +342,9 @@ offerbook.offerersAcceptedBankSeats=ยอมรับตำแหน่งป
offerbook.availableOffers=ข้อเสนอที่พร้อมใช้งาน
offerbook.filterByCurrency=กรองตามสกุลเงิน
offerbook.filterByPaymentMethod=ตัวกรองตามวิธีการชำระเงิน
-offerbook.matchingOffers=Offers matching my accounts
+offerbook.matchingOffers=ข้อเสนอที่ตรงกับบัญชีของฉัน
+offerbook.filterNoDeposit=ไม่มีเงินมัดจำ
+offerbook.noDepositOffers=ข้อเสนอที่ไม่มีเงินมัดจำ (ต้องการรหัสผ่าน)
offerbook.timeSinceSigning=Account info
offerbook.timeSinceSigning.info=This account was verified and {0}
offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
@@ -484,7 +489,10 @@ createOffer.setDepositAsBuyer=Set my security deposit as buyer (%)
createOffer.setDepositForBothTraders=Set both traders' security deposit (%)
createOffer.securityDepositInfo=Your buyer''s security deposit will be {0}
createOffer.securityDepositInfoAsBuyer=Your security deposit as buyer will be {0}
-createOffer.minSecurityDepositUsed=Min. buyer security deposit is used
+createOffer.minSecurityDepositUsed=เงินประกันความปลอดภัยขั้นต่ำถูกใช้
+createOffer.buyerAsTakerWithoutDeposit=ไม่ต้องวางมัดจำจากผู้ซื้อ (ป้องกันด้วยรหัสผ่าน)
+createOffer.myDeposit=เงินประกันความปลอดภัยของฉัน (%)
+createOffer.myDepositInfo=เงินประกันความปลอดภัยของคุณจะเป็น {0}
####################################################################
@@ -508,6 +516,8 @@ takeOffer.fundsBox.networkFee=ยอดรวมค่าธรรมเนี
takeOffer.fundsBox.takeOfferSpinnerInfo=ยอมรับข้อเสนอ: {0}
takeOffer.fundsBox.paymentLabel=การซื้อขาย Haveno ด้วย ID {0}
takeOffer.fundsBox.fundsStructure=({0} เงินประกัน {1} ค่าธรรมเนียมการซื้อขาย {2} ค่าธรรมเนียมการขุด)
+takeOffer.fundsBox.noFundingRequiredTitle=ไม่ต้องใช้เงินทุน
+takeOffer.fundsBox.noFundingRequiredDescription=รับรหัสผ่านข้อเสนอจากผู้ขายภายนอก Haveno เพื่อรับข้อเสนอนี้
takeOffer.success.headline=คุณได้รับข้อเสนอเป็นที่เรีบยร้อยแล้ว
takeOffer.success.info=คุณสามารถดูสถานะการค้าของคุณได้ที่ \ "Portfolio (แฟ้มผลงาน) / เปิดการซื้อขาย \"
takeOffer.error.message=เกิดข้อผิดพลาดขณะรับข้อเสนอ\n\n{0}
@@ -629,7 +639,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=ข้อกำหนดที
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=โปรดส่ง {0} โดยธนาณัติ \"US Postal Money Order \" ไปยังผู้ขาย XMR\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Please pay {0} via the specified payment method to the XMR seller. You''ll find the seller's account details on the next screen.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1461,6 +1471,7 @@ offerDetailsWindow.confirm.maker=ยืนยัน: ยื่นข้อเส
offerDetailsWindow.confirm.taker=ยืนยัน: รับข้อเสนอไปยัง {0} บิทคอยน์
offerDetailsWindow.creationDate=วันที่สร้าง
offerDetailsWindow.makersOnion=ที่อยู่ onion ของผู้สร้าง
+offerDetailsWindow.challenge=รหัสผ่านสำหรับข้อเสนอ
qRCodeWindow.headline=QR Code
qRCodeWindow.msg=Please use this QR code for funding your Haveno wallet from your external wallet.
@@ -1501,7 +1512,7 @@ tacWindow.disagree=ฉันไม่เห็นด้วยและออก
tacWindow.arbitrationSystem=Dispute resolution
tradeDetailsWindow.headline=ซื้อขาย
-tradeDetailsWindow.disputedPayoutTxId=รหัส ID ธุรกรรมการจ่ายเงินที่พิพาท:
+tradeDetailsWindow.disputedPayoutTxId=รหัส ID ธุรกรรมการจ่ายเงินที่พิพาท
tradeDetailsWindow.tradeDate=วันที่ซื้อขาย
tradeDetailsWindow.txFee=ค่าธรรมเนียมการขุด
tradeDetailsWindow.tradePeersOnion=ที่อยู่ของ onion คู่ค้า
@@ -1574,7 +1585,7 @@ popup.headline.error=ผิดพลาด
popup.doNotShowAgain=ไม่ต้องแสดงอีกครั้ง
popup.reportError.log=เปิดไฟล์ที่บันทึก
popup.reportError.gitHub=รายงานไปที่ตัวติดตามปัญหา GitHub
-popup.reportError={0}\n\nTo help us to improve the software please report this bug by opening a new issue at https://github.com/bisq-network/bisq/issues.\nThe above error message will be copied to the clipboard when you click either of the buttons below.\nIt will make debugging easier if you include the haveno.log file by pressing "Open log file", saving a copy, and attaching it to your bug report.
+popup.reportError={0}\n\nTo help us to improve the software please report this bug by opening a new issue at https://github.com/haveno-dex/haveno/issues.\nThe above error message will be copied to the clipboard when you click either of the buttons below.\nIt will make debugging easier if you include the haveno.log file by pressing "Open log file", saving a copy, and attaching it to your bug report.
popup.error.tryRestart=โปรดลองเริ่มแอปพลิเคชั่นของคุณใหม่และตรวจสอบการเชื่อมต่อเครือข่ายของคุณเพื่อดูว่าคุณสามารถแก้ไขปัญหาได้หรือไม่
popup.error.takeOfferRequestFailed=เกิดข้อผิดพลาดขึ้นเมื่อมีคนพยายามรับข้อเสนอของคุณ: \n{0}
@@ -1617,6 +1628,7 @@ popup.warning.nodeBanned=One of the {0} nodes got banned.
popup.warning.priceRelay=ราคาผลัดเปลี่ยน
popup.warning.seed=รหัสลับเพื่อกู้ข้อมูล
popup.warning.mandatoryUpdate.trading=Please update to the latest Haveno version. A mandatory update was released which disables trading for old versions. Please check out the Haveno Forum for more information.
+popup.warning.noFilter=เราไม่ได้รับวัตถุกรองจากโหนดต้นทาง กรุณาแจ้งผู้ดูแลระบบเครือข่ายให้ลงทะเบียนวัตถุกรอง
popup.warning.burnXMR=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more XMR to transfer.
popup.warning.openOffer.makerFeeTxRejected=The maker fee transaction for offer with ID {0} was rejected by the Monero network.\nTransaction ID={1}.\nThe offer has been removed to avoid further problems.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Haveno support channel at the Haveno Keybase team.
@@ -1684,6 +1696,9 @@ popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed
popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys
popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign
+popup.info.buyerAsTakerWithoutDeposit.headline=ไม่ต้องมีเงินมัดจำจากผู้ซื้อ
+popup.info.buyerAsTakerWithoutDeposit=ข้อเสนอของคุณจะไม่ต้องการเงินมัดจำหรือค่าธรรมเนียมจากผู้ซื้อ XMR\n\nในการยอมรับข้อเสนอของคุณ คุณต้องแบ่งปันรหัสผ่านกับคู่ค้าการค้าของคุณภายนอก Haveno\n\nรหัสผ่านจะถูกสร้างโดยอัตโนมัติและแสดงในรายละเอียดข้อเสนอหลังจากการสร้าง
+
####################################################################
# Notifications
####################################################################
@@ -1809,6 +1824,7 @@ navigation.support=\"ช่วยเหลือและสนับสนุ
formatter.formatVolumeLabel={0} จำนวนยอด{1}
formatter.makerTaker=ผู้สร้าง เป็น {0} {1} / ผู้รับเป็น {2} {3}
+formatter.makerTakerLocked=ผู้สร้าง เป็น {0} {1} / ผู้รับเป็น {2} {3} 🔒
formatter.youAreAsMaker=You are: {1} {0} (maker) / Taker is: {3} {2}
formatter.youAreAsTaker=You are: {1} {0} (taker) / Maker is: {3} {2}
formatter.youAre=คุณคือ {0} {1} ({2} {3})
@@ -1956,8 +1972,6 @@ payment.accountType=ประเภทบัญชี
payment.checking=การตรวจสอบ
payment.savings=ออมทรัพย์
payment.personalId=รหัส ID ประจำตัวบุคคล
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Haveno account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Haveno.
payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Haveno to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved.
payment.moneyGram.info=When using MoneyGram the XMR buyer has to send the Authorisation number and a photo of the receipt by email to the XMR seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process.
@@ -1974,12 +1988,14 @@ payment.revolut.info=Revolut requires the 'Username' as account ID not the phone
payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''Username''.\nPlease enter your Revolut ''Username'' to update your account data.\nThis will not affect your account age signing status.
payment.revolut.addUserNameInfo.headLine=Update Revolut account
+payment.cashapp.info=โปรดทราบว่า Cash App มีความเสี่ยงในการเรียกเงินคืนสูงกว่าการโอนเงินผ่านธนาคารส่วนใหญ่
+payment.venmo.info=โปรดทราบว่า Venmo มีความเสี่ยงในการเรียกเงินคืนสูงกว่าการโอนเงินผ่านธนาคารส่วนใหญ่
+payment.paypal.info=โปรดทราบว่า PayPal มีความเสี่ยงในการเรียกเงินคืนสูงกว่าการโอนเงินผ่านธนาคารส่วนใหญ่
+
payment.amazonGiftCard.upgrade=Amazon gift cards payment method requires the country to be specified.
payment.account.amazonGiftCard.addCountryInfo={0}\nYour existing Amazon Gift Card account ({1}) does not have a Country specified.\nPlease enter your Amazon Gift Card Country to update your account data.\nThis will not affect your account age status.
payment.amazonGiftCard.upgrade.headLine=Update Amazon Gift Card account
-payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Haveno requires that you understand the following:\n\n- XMR buyers must write the XMR Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- XMR buyers must send the USPMO to the XMR seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Haveno mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Haveno.
-
payment.payByMail.contact=ข้อมูลติดต่อ
payment.payByMail.contact.prompt=Name or nym envelope should be addressed to
payment.f2f.contact=ข้อมูลติดต่อ
@@ -1988,11 +2004,13 @@ payment.f2f.city=เมืองสำหรับการประชุมแ
payment.f2f.city.prompt=ชื่อเมืองจะแสดงพร้อมกับข้อเสนอ
payment.shared.optionalExtra=ข้อมูลตัวเลือกเพิ่มเติม
payment.shared.extraInfo=ข้อมูลเพิ่มเติม
-payment.shared.extraInfo.prompt=Define any special terms, conditions, or details you would like to be displayed with your offers for this payment account (users will see this info before accepting offers).
-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 be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the XMR 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: [HYPERLINK:https://docs.haveno.exchange/trading-rules.html#f2f-trading]
+payment.shared.extraInfo.offer=ข้อมูลเพิ่มเติมเกี่ยวกับข้อเสนอ
+payment.shared.extraInfo.prompt.paymentAccount=กำหนดคำศัพท์ เงื่อนไข หรือรายละเอียดพิเศษใดๆ ที่คุณต้องการให้แสดงพร้อมข้อเสนอของคุณสำหรับบัญชีการชำระเงินนี้ (ผู้ใช้จะเห็นข้อมูลนี้ก่อนที่จะยอมรับข้อเสนอ)
+payment.shared.extraInfo.prompt.offer=กำหนดเงื่อนไขพิเศษ ข้อกำหนด หรือรายละเอียดใด ๆ ที่คุณต้องการแสดงพร้อมกับข้อเสนอของคุณ
+payment.shared.extraInfo.noDeposit=รายละเอียดการติดต่อและเงื่อนไขข้อเสนอ
payment.f2f.info.openURL=เปิดหน้าเว็บ
payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
-payment.f2f.offerbook.tooltip.extra=ข้อมูลเพิ่มเติม: {0}
+payment.shared.extraInfo.tooltip=ข้อมูลเพิ่มเติม: {0}
payment.japan.bank=ธนาคาร
payment.japan.branch=Branch
@@ -2001,7 +2019,10 @@ payment.japan.recipient=ชื่อ
payment.australia.payid=PayID
payment.payid=PayID linked to financial institution. Like email address or mobile phone.
payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.paysafe.info=เพื่อความปลอดภัยของคุณ เราขอแนะนำอย่างยิ่งให้หลีกเลี่ยงการใช้ Paysafecard PINs ในการชำระเงิน\n\n\
+ ธุรกรรมที่ดำเนินการผ่าน PIN ไม่สามารถตรวจสอบได้อย่างอิสระสำหรับการระงับข้อพิพาท หากเกิดปัญหา อาจไม่สามารถกู้คืนเงินได้\n\n\
+ เพื่อความปลอดภัยของธุรกรรมและรองรับการระงับข้อพิพาท โปรดใช้วิธีการชำระเงินที่มีบันทึกการทำธุรกรรมที่ตรวจสอบได้
# We use constants from the code so we do not use our normal naming convention
@@ -2081,7 +2102,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=Amazon eGift Card
# suppress inspection "UnusedProperty"
@@ -2133,7 +2154,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=Amazon eGift Card
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_tr.properties b/core/src/main/resources/i18n/displayStrings_tr.properties
index 7656d581da..5d0720412b 100644
--- a/core/src/main/resources/i18n/displayStrings_tr.properties
+++ b/core/src/main/resources/i18n/displayStrings_tr.properties
@@ -43,6 +43,8 @@ shared.buyMonero=Monero Satın Al
shared.sellMonero=Monero Sat
shared.buyCurrency={0} satın al
shared.sellCurrency={0} sat
+shared.buyCurrencyLocked={0} satın al 🔒
+shared.sellCurrencyLocked={0} sat 🔒
shared.buyingXMRWith={0} ile XMR satın alınıyor
shared.sellingXMRFor={0} karşılığında XMR satılıyor
shared.buyingCurrency={0} satın alınıyor (XMR satılıyor)
@@ -198,7 +200,7 @@ shared.total=Toplam
shared.totalsNeeded=Gereken fonlar
shared.tradeWalletAddress=İşlem cüzdan adresi
shared.tradeWalletBalance=İşlem cüzdan bakiyesi
-shared.reserveExactAmount=Sadece gerekli fonları ayırın. Teklifinizin aktif olması için madencilik ücreti ve 10 onay (yaklaşık 20 dakika) gerekebilir.
+shared.reserveExactAmount=Yalnızca gerekli fonları ayırın. Teklifinizin aktif hale gelmesi için bir madencilik ücreti ve yaklaşık 20 dakika gereklidir.
shared.makerTxFee=Yapıcı: {0}
shared.takerTxFee=Alıcı: {0}
shared.iConfirm=Onaylıyorum
@@ -346,6 +348,7 @@ market.trades.showVolumeInUSD=Hacmi USD olarak göster
offerbook.createOffer=Teklif oluştur
offerbook.takeOffer=Teklif al
offerbook.takeOffer.createAccount=Hesap oluştur ve teklifi al
+offerbook.takeOffer.enterChallenge=Teklif şifresini girin
offerbook.trader=Yatırımcı
offerbook.offerersBankId=Yapıcının banka kimliği (BIC/SWIFT): {0}
offerbook.offerersBankName=Yapıcının banka adı: {0}
@@ -357,6 +360,8 @@ offerbook.availableOffersToSell={0} için {1} sat
offerbook.filterByCurrency=Para birimini seç
offerbook.filterByPaymentMethod=Ödeme yöntemini seç
offerbook.matchingOffers=Uygun Teklif
+offerbook.filterNoDeposit=Depozito yok
+offerbook.noDepositOffers=Depozitosuz teklifler (şifre gereklidir)
offerbook.timeSinceSigning=Hesap bilgisi
offerbook.timeSinceSigning.info.arbitrator=bir hakem tarafından imzalandı ve eş hesaplarını imzalayabilir
offerbook.timeSinceSigning.info.peer=bir eş tarafından imzalandı, limitlerin kaldırılması için %d gün bekleniyor
@@ -524,7 +529,10 @@ createOffer.setDepositAsBuyer=Alıcı olarak benim güvenlik teminatımı ayarla
createOffer.setDepositForBothTraders=Tüccarların güvenlik teminatı (%)
createOffer.securityDepositInfo=Alıcının güvenlik teminatı {0} olacak
createOffer.securityDepositInfoAsBuyer=Alıcı olarak güvenlik teminatınız {0} olacak
-createOffer.minSecurityDepositUsed=Minimum alıcı güvenlik teminatı kullanıldı
+createOffer.minSecurityDepositUsed=Minimum güvenlik depozitosu kullanılır
+createOffer.buyerAsTakerWithoutDeposit=Alıcıdan depozito gerekmez (şifre korumalı)
+createOffer.myDeposit=Güvenlik depozitam (%)
+createOffer.myDepositInfo=Güvenlik depozitonuz {0} olacaktır.
####################################################################
@@ -550,6 +558,8 @@ takeOffer.fundsBox.networkFee=Toplam madencilik ücretleri
takeOffer.fundsBox.takeOfferSpinnerInfo=Teklif alınıyor: {0}
takeOffer.fundsBox.paymentLabel=ID {0} ile Haveno işlemi
takeOffer.fundsBox.fundsStructure=({0} güvenlik teminatı, {1} işlem ücreti)
+takeOffer.fundsBox.noFundingRequiredTitle=Fonlama gerekmez
+takeOffer.fundsBox.noFundingRequiredDescription=Bu teklifi almak için satıcıdan passphrase'i Haveno dışında alınız.
takeOffer.success.headline=Teklifi başarıyla aldınız.
takeOffer.success.info=İşleminizin durumunu \"Portföy/Açık işlemler\" kısmında görebilirsiniz.
takeOffer.error.message=Teklif alımı sırasında bir hata oluştu.\n\n{0}
@@ -674,7 +684,7 @@ portfolio.pending.step2_buyer.refTextWarn=Önemli: ödeme yaparken, \"ödeme ned
portfolio.pending.step2_buyer.fees=Bankanız transfer yapmak için sizden herhangi bir ücret alıyorsa, bu ücretleri ödemekten siz sorumlusunuz.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.fees.swift=SWIFT ödemesini göndermek için SHA (paylaşılan ücret modeli) kullanmanız gerekmektedir. \
- Daha fazla ayrıntı için [HYPERLINK:https://haveno.exchange/wiki/SWIFT#Use_the_correct_fee_option] adresine bakınız.
+ Daha fazla ayrıntı için [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT#Use_the_correct_fee_option] adresine bakınız.
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.crypto=Lütfen dış {0} cüzdanınızdan\n{1} XMR satıcısına transfer yapın.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -694,7 +704,7 @@ portfolio.pending.step2_buyer.postal=Lütfen "US Postal Money Order" kullanarak
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.payByMail=Lütfen "Pay by Mail" kullanarak {0} tutarını XMR satıcısına gönderin. \
Belirli talimatlar işlem sözleşmesinde bulunmaktadır, veya belirsizse trader sohbeti aracılığıyla sorular sorabilirsiniz. \
- Pay by Mail hakkında daha fazla ayrıntı için Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail] adresine bakın.\n\n
+ Pay by Mail hakkında daha fazla ayrıntı için Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail] adresine bakın.\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Lütfen belirtilen ödeme yöntemini kullanarak {0} tutarını XMR satıcısına ödeyin. Satıcının hesap bilgilerini bir sonraki ekranda bulacaksınız.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1963,6 +1973,7 @@ offerDetailsWindow.confirm.taker=Onayla: {0} monero teklifi al
offerDetailsWindow.confirm.takerCrypto=Onayla: {0} {1} teklifi al
offerDetailsWindow.creationDate=Oluşturma tarihi
offerDetailsWindow.makersOnion=Yapıcı'nın onion adresi
+offerDetailsWindow.challenge=Teklif şifresi
qRCodeWindow.headline=QR Kodu
qRCodeWindow.msg=Harici cüzdanınızdan Haveno cüzdanınızı finanse etmek için bu QR kodunu kullanın.
@@ -2011,7 +2022,7 @@ tacWindow.disagree=Kabul etmiyorum ve çıkıyorum
tacWindow.arbitrationSystem=Uyuşmazlık çözümü
tradeDetailsWindow.headline=Ticaret
-tradeDetailsWindow.disputedPayoutTxId=Uyuşmazlık konusu olan ödeme işlem kimliği:
+tradeDetailsWindow.disputedPayoutTxId=Uyuşmazlık konusu olan ödeme işlem kimliği
tradeDetailsWindow.tradeDate=Ticaret tarihi
tradeDetailsWindow.txFee=Madencilik ücreti
tradeDetailsWindow.tradePeersOnion=Ticaret ortaklarının onion adresi
@@ -2149,7 +2160,7 @@ popup.warning.seed=anahtar kelime
popup.warning.mandatoryUpdate.trading=Lütfen en son Haveno sürümüne güncelleyin. \
Eski sürümler için ticareti devre dışı bırakan zorunlu bir güncelleme yayınlandı. \
Daha fazla bilgi için lütfen Haveno Forumunu kontrol edin.
-popup.warning.noFilter=Tohum düğümlerinden bir filtre nesnesi almadık. Lütfen Haveno ağ yöneticilerini bir filtre nesnesi kaydetmek için ctrl + f ile bilgilendirin.
+popup.warning.noFilter=Tohum düğümlerinden bir filtre nesnesi almadık. Lütfen ağ yöneticilerine bir filtre nesnesi kaydetmeleri için bilgi verin.
popup.warning.burnXMR=Bu işlem mümkün değil, çünkü {0} tutarındaki madencilik ücretleri, transfer edilecek {1} tutarını aşacaktır. \
Lütfen madencilik ücretleri tekrar düşük olana kadar bekleyin veya transfer etmek için daha fazla XMR biriktirin.
@@ -2260,6 +2271,9 @@ popup.accountSigning.unsignedPubKeys.signed=Pubkey'ler imzalandı
popup.accountSigning.unsignedPubKeys.result.signed=İmzalanmış pubkey'ler
popup.accountSigning.unsignedPubKeys.result.failed=İmzalama başarısız oldu
+popup.info.buyerAsTakerWithoutDeposit.headline=Alıcıdan depozito gerekmez
+popup.info.buyerAsTakerWithoutDeposit=Teklifiniz, XMR alıcısından güvenlik depozitosu veya ücret talep etmeyecektir.\n\nTeklifinizi kabul etmek için, ticaret ortağınızla Haveno dışında bir şifre paylaşmalısınız.\n\nŞifre otomatik olarak oluşturulur ve oluşturulduktan sonra teklif detaylarında görüntülenir.
+
popup.info.torMigration.msg=Haveno düğümünüz muhtemelen eski bir Tor v2 adresi kullanıyor. \
Lütfen Haveno düğümünüzü bir Tor v3 adresine geçirin. \
Önceden veri dizininizi yedeklediğinizden emin olun.
@@ -2399,6 +2413,7 @@ navigation.support="Destek"
formatter.formatVolumeLabel={0} miktar{1}
formatter.makerTaker=Yapan olarak {0} {1} / Alan olarak {2} {3}
+formatter.makerTakerLocked=Yapıcı olarak {0} {1} / Alan olarak {2} {3} 🔒
formatter.youAreAsMaker=Yapan sizsiniz: {1} {0} (maker) / Alan: {3} {2}
formatter.youAreAsTaker=Alan sizsiniz: {1} {0} (taker) / Yapan: {3} {2}
formatter.youAre=Şu anda sizsiniz {0} {1} ({2} {3})
@@ -2674,9 +2689,9 @@ payment.account.revolut.addUserNameInfo={0}\n\
Bu, hesap yaş imza durumunuzu etkilemeyecektir.
payment.revolut.addUserNameInfo.headLine=Revolut hesabını güncelle
-payment.cashapp.info=Cash App, çoğu banka transferine göre daha yüksek geri ödeme riskine sahiptir. Cash App ile ticaret yaparken bunun farkında olun.
-payment.venmo.info=Venmo, çoğu banka transferine göre daha yüksek geri ödeme riskine sahiptir. Venmo ile ticaret yaparken bunun farkında olun.
-payment.paypal.info=PayPal, çoğu banka transferine göre daha yüksek geri ödeme riskine sahiptir. PayPal ile ticaret yaparken bunun farkında olun.
+payment.cashapp.info=Lütfen Cash App'in çoğu banka transferinden daha yüksek geri ödeme riski taşıdığını unutmayın.
+payment.venmo.info=Lütfen Venmo'nun çoğu banka transferinden daha yüksek geri ödeme riski taşıdığını unutmayın.
+payment.paypal.info=Lütfen PayPal'in çoğu banka transferinden daha yüksek geri ödeme riski taşıdığını unutmayın.
payment.amazonGiftCard.upgrade=Amazon hediye kartları ödeme yöntemi için ülkenin belirtilmesi gerekmektedir.
payment.account.amazonGiftCard.addCountryInfo={0}\n\
@@ -2692,20 +2707,20 @@ payment.swift.info.account=Haveno'da SWIFT kullanımı için temel yönergeleri
- alıcı, paylaşılan ücret modeli (SHA) kullanarak ödeme yapmalıdır \n\
- alıcı ve satıcı ücretlerle karşılaşabilir, bu yüzden bankalarının ücret tarifelerini önceden kontrol etmelidirler \n\
\n\
-SWIFT, diğer ödeme yöntemlerinden daha karmaşıktır, bu yüzden lütfen wiki'deki tam rehberi inceleyin [HYPERLINK:https://haveno.exchange/wiki/SWIFT].
+SWIFT, diğer ödeme yöntemlerinden daha karmaşıktır, bu yüzden lütfen wiki'deki tam rehberi inceleyin [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT].
payment.swift.info.buyer=SWIFT ile monero satın almak için şunları yapmalısınız:\n\
\n\
- ödeme yapanın belirttiği para biriminde ödeme yapın \n\
- ödeme göndermek için paylaşılan ücret modeli (SHA) kullanın\n\
\n\
-Ceza almamak ve sorunsuz ticaretler yapmak için lütfen wiki'deki daha fazla rehberi inceleyin [HYPERLINK:https://haveno.exchange/wiki/SWIFT].
+Ceza almamak ve sorunsuz ticaretler yapmak için lütfen wiki'deki daha fazla rehberi inceleyin [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT].
payment.swift.info.seller=SWIFT gönderenler, ödemeleri göndermek için paylaşılan ücret modeli (SHA) kullanmak zorundadır.\n\
\n\
SHA kullanmayan bir SWIFT ödemesi alırsanız, bir arabuluculuk bileti açın.\n\
\n\
-Ceza almamak ve sorunsuz ticaretler yapmak için lütfen wiki'deki daha fazla rehberi inceleyin [HYPERLINK:https://haveno.exchange/wiki/SWIFT].
+Ceza almamak ve sorunsuz ticaretler yapmak için lütfen wiki'deki daha fazla rehberi inceleyin [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/SWIFT].
payment.imps.info.account=Lütfen şunları dahil ettiğinizden emin olun:\n\n\
● Hesap sahibi tam adı\n\
@@ -2937,14 +2952,14 @@ payment.strike.info.seller=Ödemenin XMR Alıcısının Haveno'da sağlanan Stri
Bu limitleri aşarsanız, işleminiz iptal edilebilir ve ceza uygulanabilir.
payment.transferwiseUsd.info.account=ABD bankacılık düzenlemeleri nedeniyle, USD ödemeleri göndermek ve almak, çoğu diğer \
-para biriminden daha fazla sınırlamaya tabidir. Bu nedenle USD, Haveno TransferWise ödeme yöntemine eklenmemiştir.\n\n\
- TransferWise-USD ödeme yöntemi, Haveno kullanıcılarının USD cinsinden ticaret yapmasına olanak tanır.\n\n\
-Wise, eski adıyla TransferWise hesabı olan herkes, Haveno'da TransferWise-USD'yi bir ödeme yöntemi olarak ekleyebilir. \
+para biriminden daha fazla sınırlamaya tabidir. Bu nedenle USD, Haveno Wise ödeme yöntemine eklenmemiştir.\n\n\
+ Wise-USD ödeme yöntemi, Haveno kullanıcılarının USD cinsinden ticaret yapmasına olanak tanır.\n\n\
+Wise, eski adıyla Wise hesabı olan herkes, Haveno'da Wise-USD'yi bir ödeme yöntemi olarak ekleyebilir. \
Bu, USD ile XMR alıp satmalarını sağlar.\n\n\
Haveno'da ticaret yaparken XMR Alıcıları, ödeme nedeni için herhangi bir referans kullanmamalıdır. Ödeme nedeni \
- gerekliyse, yalnızca TransferWise-USD hesap sahibinin tam adını kullanmalıdırlar.
-payment.transferwiseUsd.info.buyer=Ödemeyi yalnızca XMR Satıcısının Haveno TransferWise-USD hesabındaki e-posta adresine gönderin.
-payment.transferwiseUsd.info.seller=Alınan ödemenin, Haveno'daki TransferWise-USD hesabındaki XMR Alıcısının adıyla eşleştiğini kontrol edin.
+ gerekliyse, yalnızca Wise-USD hesap sahibinin tam adını kullanmalıdırlar.
+payment.transferwiseUsd.info.buyer=Ödemeyi yalnızca XMR Satıcısının Haveno Wise-USD hesabındaki e-posta adresine gönderin.
+payment.transferwiseUsd.info.seller=Alınan ödemenin, Haveno'daki Wise-USD hesabındaki XMR Alıcısının adıyla eşleştiğini kontrol edin.
payment.usPostalMoneyOrder.info=Haveno'da ABD Posta Havale Emirleri (USPMO) kullanarak ticaret yapmak için aşağıdakileri anladığınızdan emin olmanız gerekmektedir:\n\
\n\
@@ -2984,9 +2999,9 @@ payment.payByMail.extraInfo.prompt=Tekliflerinize lütfen şunları belirtin: \n
Diğer detaylar.
payment.tradingRestrictions=Lütfen yapıcı tarafın şartlarını ve koşullarını gözden geçirin.\n\
Gereksinimleri karşılamıyorsanız bu ticareti yapmayın.
-payment.cashAtAtm.info=ATM'de Nakit: Kod kullanarak ATM'den kartsız para çekme\n\n\
+payment.cashAtAtm.info=Kartsız Nakit: Kod kullanarak ATM'den kartsız para çekme\n\n\
Bu ödeme yöntemini kullanmak için:\n\n\
- 1. Kabul ettiğiniz bankaları, bölgeleri veya teklifle birlikte gösterilecek diğer şartları listeleyerek bir ATM'de Nakit ödeme hesabı oluşturun.\n\n\
+ 1. Kabul ettiğiniz bankaları, bölgeleri veya teklifle birlikte gösterilecek diğer şartları listeleyerek bir Kartsız Nakit ödeme hesabı oluşturun.\n\n\
2. Ödeme hesabı ile bir teklif oluşturun veya bir teklifi kabul edin.\n\n\
3. Teklif kabul edildiğinde, ödeme detaylarını paylaşmak ve ödemeyi tamamlamak için eşinizle sohbet edin.\n\n\
Ticaret sözleşmenizde belirtilen şekilde işlemi tamamlayamazsanız, güvenlik teminatınızın bir kısmını (veya tamamını) kaybedebilirsiniz.
@@ -3000,7 +3015,10 @@ payment.f2f.city='Yüz yüze' buluşma için şehir
payment.f2f.city.prompt=Şehir teklifle birlikte gösterilecektir
payment.shared.optionalExtra=İsteğe bağlı ek bilgi
payment.shared.extraInfo=Ek bilgi
-payment.shared.extraInfo.prompt=Bu ödeme hesabınız için tekliflerinize eklemek istediğiniz özel şart, koşul veya detayları tanımlayın (kullanıcılar bu bilgileri teklifleri kabul etmeden önce görecektir).
+payment.shared.extraInfo.offer=Ek teklif bilgileri
+payment.shared.extraInfo.prompt.paymentAccount=Bu ödeme hesabınız için tekliflerinize eklemek istediğiniz özel şart, koşul veya detayları tanımlayın (kullanıcılar bu bilgileri teklifleri kabul etmeden önce görecektir).
+payment.shared.extraInfo.prompt.offer=Teklifinizle birlikte göstermek istediğiniz özel terimleri, koşulları veya detayları tanımlayın.
+payment.shared.extraInfo.noDeposit=İletişim detayları ve teklif şartları
payment.f2f.info='Yüz Yüze' ticaretler farklı kurallara sahiptir ve çevrimiçi işlemlerden farklı riskler içerir.\n\n\
Başlıca farklar şunlardır:\n\
● Ticaret eşleri, sağlanan iletişim bilgilerini kullanarak buluşma yeri ve zamanını paylaşmalıdır.\n\
@@ -3014,7 +3032,7 @@ payment.f2f.info='Yüz Yüze' ticaretler farklı kurallara sahiptir ve çevrimi
ve tavsiyeleri okuyun: [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/F2F]
payment.f2f.info.openURL=Web sayfasını aç
payment.f2f.offerbook.tooltip.countryAndCity=Ülke ve şehir: {0} / {1}
-payment.f2f.offerbook.tooltip.extra=Ek bilgi: {0}
+payment.shared.extraInfo.tooltip=Ek bilgi: {0}
payment.ifsc=IFS Kodu
payment.ifsc.validation=IFSC formatı: XXXX0999999
@@ -3028,12 +3046,15 @@ payment.payid.info=PayID, telefon numarası, e-posta adresi veya Avustralya İş
toplum hesabınıza güvenli bir şekilde bağlayabileceğiniz bir kimliktir. Avustralya finans kurumunuzla zaten bir PayID oluşturmuş \
olmanız gerekmektedir. Hem gönderici hem de alıcı finans kurumlarının PayID'yi desteklemesi gerekmektedir.
payment.amazonGiftCard.info=Amazon eGift Kart ile ödeme yapmak için, Amazon hesabınız aracılığıyla bir Amazon eGift Kartı'nı XMR satıcısına göndermeniz gerekecek. \n\n\
- Daha fazla ayrıntı ve en iyi uygulamalar için lütfen wiki'ye bakın: [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] \n\n\
+ Daha fazla ayrıntı ve en iyi uygulamalar için lütfen wiki'ye bakın: [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] \n\n\
Üç önemli not:\n\
- Amazon'un daha büyük hediye kartlarını sahtekarlık olarak işaretlediği bilindiğinden, 100 USD veya daha küçük tutarlarda hediye kartları göndermeye çalışın\n\
- hediye kartının mesajı için yaratıcı, inanılabilir bir metin kullanmaya çalışın (örneğin, "Doğum günün kutlu olsun Metin Torun!") ve ticaret \
kimliğini ekleyin (ve ticaret sohbetinde ticaret eşinize seçtiğiniz referans metnini söyleyin, böylece ödemenizi doğrulayabilirler)\n\
- Amazon eGift Kartları, yalnızca satın alındıkları Amazon web sitesinde kullanılabilir (örneğin, amazon.it üzerinden satın alınan bir hediye kartı yalnızca amazon.it üzerinde kullanılabilir)
+payment.paysafe.info=Sizin korumanız için, Paysafecard PIN'lerini ödeme için kullanmanızı kesinlikle önermiyoruz.\n\n\
+ PIN'ler ile yapılan işlemler, ihtilaf çözümü için bağımsız olarak doğrulanamaz. Bir sorun oluşursa, fonların geri alınması mümkün olmayabilir.\n\n\
+ İhtilaf çözümü ile işlem güvenliğini sağlamak için, her zaman doğrulanabilir kayıtlar sağlayan ödeme yöntemlerini kullanın.
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ
@@ -3115,9 +3136,9 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
-TRANSFERWISE_USD=TransferWise-USD
+TRANSFERWISE_USD=Wise-USD
# suppress inspection "UnusedProperty"
PAYSERA=Paysera
# suppress inspection "UnusedProperty"
@@ -3211,9 +3232,9 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
-TRANSFERWISE_USD_SHORT=TransferWise-USD
+TRANSFERWISE_USD_SHORT=Wise-USD
# suppress inspection "UnusedProperty"
PAYSERA_SHORT=Paysera
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_vi.properties b/core/src/main/resources/i18n/displayStrings_vi.properties
index 8530cf4691..4b6ba937e4 100644
--- a/core/src/main/resources/i18n/displayStrings_vi.properties
+++ b/core/src/main/resources/i18n/displayStrings_vi.properties
@@ -40,6 +40,8 @@ shared.buyMonero=Mua monero
shared.sellMonero=Bán monero
shared.buyCurrency=Mua {0}
shared.sellCurrency=Bán {0}
+shared.buyCurrencyLocked=Mua {0} 🔒
+shared.sellCurrencyLocked=Bán {0} 🔒
shared.buyingXMRWith=đang mua XMR với {0}
shared.sellingXMRFor=đang bán XMR với {0}
shared.buyingCurrency=đang mua {0} (đang bán XMR)
@@ -186,7 +188,7 @@ shared.total=Tổng
shared.totalsNeeded=Số tiền cần
shared.tradeWalletAddress=Địa chỉ ví giao dịch
shared.tradeWalletBalance=Số dư ví giao dịch
-shared.reserveExactAmount=Dự trữ chỉ số tiền cần thiết. Có thể yêu cầu một phí đào và 10 xác nhận (~20 phút) trước khi giao dịch của bạn trở nên hiệu lực.
+shared.reserveExactAmount=Chỉ giữ lại số tiền cần thiết. Yêu cầu phí khai thác và khoảng 20 phút trước khi đề nghị của bạn được công khai.
shared.makerTxFee=Người tạo: {0}
shared.takerTxFee=Người nhận: {0}
shared.iConfirm=Tôi xác nhận
@@ -330,6 +332,7 @@ offerbook.createOffer=Tạo chào giá
offerbook.takeOffer=Nhận chào giá
offerbook.takeOfferToBuy=Nhận chào giá mua {0}
offerbook.takeOfferToSell=Nhận chào giá bán {0}
+offerbook.takeOffer.enterChallenge=Nhập mật khẩu đề nghị
offerbook.trader=Trader
offerbook.offerersBankId=ID ngân hàng của người tạo (BIC/SWIFT): {0}
offerbook.offerersBankName=Tên ngân hàng của người tạo: {0}
@@ -339,7 +342,9 @@ 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.matchingOffers=Offers matching my accounts
+offerbook.matchingOffers=Các ưu đãi phù hợp với tài khoản của tôi
+offerbook.filterNoDeposit=Không đặt cọc
+offerbook.noDepositOffers=Các ưu đãi không yêu cầu đặt cọc (cần mật khẩu)
offerbook.timeSinceSigning=Account info
offerbook.timeSinceSigning.info=This account was verified and {0}
offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts
@@ -484,7 +489,10 @@ createOffer.setDepositAsBuyer=Cài đặt tiền đặt cọc của tôi với v
createOffer.setDepositForBothTraders=Set both traders' security deposit (%)
createOffer.securityDepositInfo=Số tiền đặt cọc cho người mua của bạn sẽ là {0}
createOffer.securityDepositInfoAsBuyer=Số tiền đặt cọc của bạn với vai trò người mua sẽ là {0}
-createOffer.minSecurityDepositUsed=Min. buyer security deposit is used
+createOffer.minSecurityDepositUsed=Khoản tiền đặt cọc bảo mật tối thiểu được sử dụng
+createOffer.buyerAsTakerWithoutDeposit=Không cần đặt cọc từ người mua (được bảo vệ bằng mật khẩu)
+createOffer.myDeposit=Tiền đặt cọc bảo mật của tôi (%)
+createOffer.myDepositInfo=Khoản tiền đặt cọc của bạn sẽ là {0}
####################################################################
@@ -508,6 +516,8 @@ takeOffer.fundsBox.networkFee=Tổng phí đào
takeOffer.fundsBox.takeOfferSpinnerInfo=Chấp nhận đề xuất: {0}
takeOffer.fundsBox.paymentLabel=giao dịch Haveno có ID {0}
takeOffer.fundsBox.fundsStructure=({0} tiền gửi đại lý, {1} phí giao dịch, {2} phí đào)
+takeOffer.fundsBox.noFundingRequiredTitle=Không cần tài trợ
+takeOffer.fundsBox.noFundingRequiredDescription=Lấy mật khẩu giao dịch từ người bán ngoài Haveno để nhận đề nghị này.
takeOffer.success.headline=Bạn đã nhận báo giá thành công.
takeOffer.success.info=Bạn có thể xem trạng thái giao dịch của bạn tại \"Portfolio/Các giao dịch mở\".
takeOffer.error.message=Có lỗi xảy ra khi nhận báo giá.\n\n{0}
@@ -629,7 +639,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=YÊU CẦU QUAN TRỌNG:\nSau k
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=Hãy gửi {0} bằng \"Phiếu chuyển tiền US\" cho người bán XMR.\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Please pay {0} via the specified payment method to the XMR seller. You''ll find the seller's account details on the next screen.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1463,6 +1473,7 @@ offerDetailsWindow.confirm.maker=Xác nhận: Đặt chào giá cho {0} monero
offerDetailsWindow.confirm.taker=Xác nhận: Nhận chào giáo cho {0} monero
offerDetailsWindow.creationDate=Ngày tạo
offerDetailsWindow.makersOnion=Địa chỉ onion của người tạo
+offerDetailsWindow.challenge=Mã bảo vệ giao dịch
qRCodeWindow.headline=QR Code
qRCodeWindow.msg=Please use this QR code for funding your Haveno wallet from your external wallet.
@@ -1503,7 +1514,7 @@ tacWindow.disagree=Tôi không đồng ý và thoát
tacWindow.arbitrationSystem=Dispute resolution
tradeDetailsWindow.headline=giao dịch
-tradeDetailsWindow.disputedPayoutTxId=ID giao dịch hoàn tiền khiếu nại:
+tradeDetailsWindow.disputedPayoutTxId=ID giao dịch hoàn tiền khiếu nại
tradeDetailsWindow.tradeDate=Ngày giao dịch
tradeDetailsWindow.txFee=Phí đào
tradeDetailsWindow.tradePeersOnion=Địa chỉ onion Đối tác giao dịch
@@ -1576,7 +1587,7 @@ popup.headline.error=Lỗi
popup.doNotShowAgain=Không hiển thị lại
popup.reportError.log=Mở log file
popup.reportError.gitHub=Báo cáo cho người theo dõi vấn đề GitHub
-popup.reportError={0}\n\nĐể giúp chúng tôi cải tiến phần mềm, vui lòng báo cáo lỗi này bằng cách mở một thông báo vấn đề mới tại https://github.com/bisq-network/bisq/issues.\nTin nhắn lỗi phía trên sẽ được sao chép tới clipboard khi bạn ấn vào một nút bên dưới.\nSự cố sẽ được xử lý dễ dàng hơn nếu bạn đính kèm haveno.log file bằng cách nhấn "Mở log file", lưu bản sao, và đính kèm vào báo cáo lỗi.
+popup.reportError={0}\n\nĐể giúp chúng tôi cải tiến phần mềm, vui lòng báo cáo lỗi này bằng cách mở một thông báo vấn đề mới tại https://github.com/haveno-dex/haveno/issues.\nTin nhắn lỗi phía trên sẽ được sao chép tới clipboard khi bạn ấn vào một nút bên dưới.\nSự cố sẽ được xử lý dễ dàng hơn nếu bạn đính kèm haveno.log file bằng cách nhấn "Mở log file", lưu bản sao, và đính kèm vào báo cáo lỗi.
popup.error.tryRestart=Hã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.
popup.error.takeOfferRequestFailed=Có lỗi xảy ra khi ai đó cố gắng để nhận một trong các chào giá của bạn:\n{0}
@@ -1619,6 +1630,7 @@ popup.warning.nodeBanned=One of the {0} nodes got banned.
popup.warning.priceRelay=rơle giá
popup.warning.seed=seed
popup.warning.mandatoryUpdate.trading=Please update to the latest Haveno version. A mandatory update was released which disables trading for old versions. Please check out the Haveno Forum for more information.
+popup.warning.noFilter=Chúng tôi không nhận được đối tượng bộ lọc từ các nút hạt giống. Vui lòng thông báo cho quản trị viên mạng để đăng ký một đối tượng bộ lọc.
popup.warning.burnXMR=Không thể thực hiện giao dịch, vì phí đào {0} vượt quá số lượng {1} cần chuyển. Vui lòng chờ tới khi phí đào thấp xuống hoặc khi bạn tích lũy đủ XMR để chuyển.
popup.warning.openOffer.makerFeeTxRejected=The maker fee transaction for offer with ID {0} was rejected by the Monero network.\nTransaction ID={1}.\nThe offer has been removed to avoid further problems.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Haveno support channel at the Haveno Keybase team.
@@ -1686,6 +1698,9 @@ popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed
popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys
popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign
+popup.info.buyerAsTakerWithoutDeposit.headline=Không cần đặt cọc từ người mua
+popup.info.buyerAsTakerWithoutDeposit=Lời đề nghị của bạn sẽ không yêu cầu khoản đặt cọc bảo mật hoặc phí từ người mua XMR.\n\nĐể chấp nhận lời đề nghị của bạn, bạn phải chia sẻ một mật khẩu với đối tác giao dịch ngoài Haveno.\n\nMật khẩu được tạo tự động và hiển thị trong chi tiết lời đề nghị sau khi tạo.
+
####################################################################
# Notifications
####################################################################
@@ -1811,6 +1826,7 @@ navigation.support=\"Hỗ trợ\"
formatter.formatVolumeLabel={0} giá trị {1}
formatter.makerTaker=Người tạo là {0} {1} / Người nhận là {2} {3}
+formatter.makerTakerLocked=Người tạo là {0} {1} / Người nhận là {2} {3} 🔒
formatter.youAreAsMaker=You are: {1} {0} (maker) / Taker is: {3} {2}
formatter.youAreAsTaker=You are: {1} {0} (taker) / Maker is: {3} {2}
formatter.youAre=Bạn là {0} {1} ({2} {3})
@@ -1958,8 +1974,6 @@ payment.accountType=Loại tài khoản
payment.checking=Đang kiểm tra
payment.savings=Tiết kiệm
payment.personalId=ID cá nhân
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Haveno account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Haveno.
payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Haveno to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved.
payment.moneyGram.info=When using MoneyGram the XMR buyer has to send the Authorisation number and a photo of the receipt by email to the XMR seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process.
@@ -1976,12 +1990,14 @@ payment.revolut.info=Revolut requires the 'Username' as account ID not the phone
payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''Username''.\nPlease enter your Revolut ''Username'' to update your account data.\nThis will not affect your account age signing status.
payment.revolut.addUserNameInfo.headLine=Update Revolut account
+payment.cashapp.info=Vui lòng lưu ý rằng Cash App có rủi ro bồi hoàn cao hơn so với hầu hết các chuyển khoản ngân hàng.
+payment.venmo.info=Vui lòng lưu ý rằng Venmo có rủi ro bồi hoàn cao hơn so với hầu hết các chuyển khoản ngân hàng.
+payment.paypal.info=Vui lòng lưu ý rằng PayPal có rủi ro bồi hoàn cao hơn so với hầu hết các chuyển khoản ngân hàng.
+
payment.amazonGiftCard.upgrade=Amazon gift cards payment method requires the country to be specified.
payment.account.amazonGiftCard.addCountryInfo={0}\nYour existing Amazon Gift Card account ({1}) does not have a Country specified.\nPlease enter your Amazon Gift Card Country to update your account data.\nThis will not affect your account age status.
payment.amazonGiftCard.upgrade.headLine=Update Amazon Gift Card account
-payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Haveno requires that you understand the following:\n\n- XMR buyers must write the XMR Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- XMR buyers must send the USPMO to the XMR seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Haveno mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Haveno.
-
payment.payByMail.contact=thông tin liên hệ
payment.payByMail.contact.prompt=Name or nym envelope should be addressed to
payment.f2f.contact=thông tin liên hệ
@@ -1990,11 +2006,13 @@ payment.f2f.city=Thành phố để gặp mặt trực tiếp
payment.f2f.city.prompt=Thành phố sẽ được hiển thị cùng báo giá
payment.shared.optionalExtra=Thông tin thêm tuỳ chọn.
payment.shared.extraInfo=thông tin thêm
-payment.shared.extraInfo.prompt=Define any special terms, conditions, or details you would like to be displayed with your offers for this payment account (users will see this info before accepting offers).
-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 be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the XMR 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: [HYPERLINK:https://docs.haveno.exchange/trading-rules.html#f2f-trading]
+payment.shared.extraInfo.offer=Thông tin bổ sung về ưu đãi
+payment.shared.extraInfo.prompt.paymentAccount=Xác định bất kỳ điều khoản, điều kiện hoặc chi tiết đặc biệt nào bạn muốn hiển thị cùng với các ưu đãi của mình cho tài khoản thanh toán này (người dùng sẽ thấy thông tin này trước khi chấp nhận các ưu đãi).
+payment.shared.extraInfo.prompt.offer=Xác định bất kỳ thuật ngữ, điều kiện hoặc chi tiết đặc biệt nào bạn muốn hiển thị cùng với đề nghị của mình.
+payment.shared.extraInfo.noDeposit=Chi tiết liên hệ và điều khoản ưu đãi
payment.f2f.info.openURL=Mở trang web
payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1}
-payment.f2f.offerbook.tooltip.extra=Thông tin thêm: {0}
+payment.shared.extraInfo.tooltip=Thông tin thêm: {0}
payment.japan.bank=Ngân hàng
payment.japan.branch=Branch
@@ -2003,7 +2021,10 @@ payment.japan.recipient=Tên
payment.australia.payid=PayID
payment.payid=PayID linked to financial institution. Like email address or mobile phone.
payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.paysafe.info=Vì sự bảo vệ của bạn, chúng tôi khuyến cáo không nên sử dụng mã PIN Paysafecard để thanh toán.\n\n\
+ Các giao dịch được thực hiện bằng mã PIN không thể được xác minh độc lập để giải quyết tranh chấp. Nếu có vấn đề xảy ra, có thể không thể khôi phục số tiền đã mất.\n\n\
+ Để đảm bảo an toàn giao dịch và có thể giải quyết tranh chấp, hãy luôn sử dụng các phương thức thanh toán có hồ sơ xác minh được.
# We use constants from the code so we do not use our normal naming convention
@@ -2083,7 +2104,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=Amazon eGift Card
# suppress inspection "UnusedProperty"
@@ -2135,7 +2156,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=Amazon eGift Card
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_zh-hans.properties b/core/src/main/resources/i18n/displayStrings_zh-hans.properties
index 91166e64df..b9cd9a21c5 100644
--- a/core/src/main/resources/i18n/displayStrings_zh-hans.properties
+++ b/core/src/main/resources/i18n/displayStrings_zh-hans.properties
@@ -40,6 +40,8 @@ shared.buyMonero=买入比特币
shared.sellMonero=卖出比特币
shared.buyCurrency=买入 {0}
shared.sellCurrency=卖出 {0}
+shared.buyCurrencyLocked=买入 {0} 🔒
+shared.sellCurrencyLocked=卖出 {0} 🔒
shared.buyingXMRWith=用 {0} 买入 XMR
shared.sellingXMRFor=卖出 XMR 为 {0}
shared.buyingCurrency=买入 {0}(卖出 XMR)
@@ -186,7 +188,7 @@ shared.total=合计
shared.totalsNeeded=需要资金
shared.tradeWalletAddress=交易钱包地址
shared.tradeWalletBalance=交易钱包余额
-shared.reserveExactAmount=仅保留所需的资金。在您的交易生效前可能需要支付挖矿费和10次确认(约20分钟)。
+shared.reserveExactAmount=仅保留必要的资金。需要支付矿工费用,并且大约需要 20 分钟后您的报价才会生效。
shared.makerTxFee=卖家:{0}
shared.takerTxFee=买家:{0}
shared.iConfirm=我确认
@@ -330,6 +332,7 @@ offerbook.createOffer=创建报价
offerbook.takeOffer=接受报价
offerbook.takeOfferToBuy=接受报价来收购 {0}
offerbook.takeOfferToSell=接受报价来出售 {0}
+offerbook.takeOffer.enterChallenge=输入报价密码
offerbook.trader=商人
offerbook.offerersBankId=卖家的银行 ID(BIC/SWIFT):{0}
offerbook.offerersBankName=卖家的银行名称:{0}
@@ -339,7 +342,9 @@ offerbook.offerersAcceptedBankSeats=接受的银行所在国家(买家):\n
offerbook.availableOffers=可用报价
offerbook.filterByCurrency=以货币筛选
offerbook.filterByPaymentMethod=以支付方式筛选
-offerbook.matchingOffers=Offers matching my accounts
+offerbook.matchingOffers=匹配我的账户的报价
+offerbook.filterNoDeposit=无押金
+offerbook.noDepositOffers=无押金的报价(需要密码短语)
offerbook.timeSinceSigning=账户信息
offerbook.timeSinceSigning.info=此账户已验证,{0}
offerbook.timeSinceSigning.info.arbitrator=由仲裁员验证,并可以验证伙伴账户
@@ -485,7 +490,10 @@ createOffer.setDepositAsBuyer=设置自己作为买家的保证金(%)
createOffer.setDepositForBothTraders=设置双方的保证金比例(%)
createOffer.securityDepositInfo=您的买家的保证金将会是 {0}
createOffer.securityDepositInfoAsBuyer=您作为买家的保证金将会是 {0}
-createOffer.minSecurityDepositUsed=已使用最低买家保证金
+createOffer.minSecurityDepositUsed=最低安全押金已使用
+createOffer.buyerAsTakerWithoutDeposit=无需买家支付押金(使用口令保护)
+createOffer.myDeposit=我的安全押金 (%)
+createOffer.myDepositInfo=您的保证金为 {0}
####################################################################
@@ -509,6 +517,8 @@ takeOffer.fundsBox.networkFee=总共挖矿手续费
takeOffer.fundsBox.takeOfferSpinnerInfo=接受报价:{0}
takeOffer.fundsBox.paymentLabel=Haveno 交易 ID {0}
takeOffer.fundsBox.fundsStructure=({0} 保证金,{1} 交易费,{2} 采矿费)
+takeOffer.fundsBox.noFundingRequiredTitle=无需资金
+takeOffer.fundsBox.noFundingRequiredDescription=从卖方处获取交易密码(在Haveno之外)以接受此报价。
takeOffer.success.headline=你已成功下单一个报价。
takeOffer.success.info=你可以在“业务/未完成交易”页面内查看您的未完成交易。
takeOffer.error.message=下单时发生了一个错误。\n\n{0}
@@ -630,7 +640,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=重要要求:\n完成支付
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=请用“美国邮政汇票”发送 {0} 给 XMR 卖家。\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Please pay {0} via the specified payment method to the XMR seller. You''ll find the seller's account details on the next screen.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1465,6 +1475,7 @@ offerDetailsWindow.confirm.maker=确定:发布报价 {0} 比特币
offerDetailsWindow.confirm.taker=确定:下单买入 {0} 比特币
offerDetailsWindow.creationDate=创建时间
offerDetailsWindow.makersOnion=卖家的匿名地址
+offerDetailsWindow.challenge=提供密码
qRCodeWindow.headline=二维码
qRCodeWindow.msg=请使用二维码从外部钱包充值至 Haveno 钱包
@@ -1505,7 +1516,7 @@ tacWindow.disagree=我不同意并退出
tacWindow.arbitrationSystem=纠纷解决方案
tradeDetailsWindow.headline=交易
-tradeDetailsWindow.disputedPayoutTxId=纠纷支付交易 ID:
+tradeDetailsWindow.disputedPayoutTxId=纠纷支付交易 ID
tradeDetailsWindow.tradeDate=交易时间
tradeDetailsWindow.txFee=矿工手续费
tradeDetailsWindow.tradePeersOnion=交易伙伴匿名地址
@@ -1579,7 +1590,7 @@ popup.headline.error=错误
popup.doNotShowAgain=不要再显示
popup.reportError.log=打开日志文件
popup.reportError.gitHub=报告至 Github issue tracker
-popup.reportError={0}\n\n为了帮助我们改进软件,请在 https://github.com/bisq-network/bisq/issues 上打开一个新问题来报告这个 bug 。\n\n当您单击下面任意一个按钮时,上面的错误消息将被复制到剪贴板。\n\n如果您通过按下“打开日志文件”,保存一份副本,并将其附加到 bug 报告中,如果包含 haveno.log 文件,那么调试就会变得更容易。
+popup.reportError={0}\n\n为了帮助我们改进软件,请在 https://github.com/haveno-dex/haveno/issues 上打开一个新问题来报告这个 bug 。\n\n当您单击下面任意一个按钮时,上面的错误消息将被复制到剪贴板。\n\n如果您通过按下“打开日志文件”,保存一份副本,并将其附加到 bug 报告中,如果包含 haveno.log 文件,那么调试就会变得更容易。
popup.error.tryRestart=请尝试重启您的应用程序或者检查您的网络连接。
popup.error.takeOfferRequestFailed=当有人试图接受你的报价时发生了一个错误:\n{0}
@@ -1624,6 +1635,7 @@ popup.warning.nodeBanned=其中一个 {0} 节点已被禁用
popup.warning.priceRelay=价格传递
popup.warning.seed=种子
popup.warning.mandatoryUpdate.trading=请更新到最新的 Haveno 版本。强制更新禁止了旧版本进行交易。更多信息请访问 Haveno 论坛。
+popup.warning.noFilter=我们没有从种子节点接收到过滤器对象。请通知网络管理员注册一个过滤器对象。
popup.warning.burnXMR=这笔交易是无法实现,因为 {0} 的挖矿手续费用会超过 {1} 的转账金额。请等到挖矿手续费再次降低或您积累了更多的 XMR 来转账。
popup.warning.openOffer.makerFeeTxRejected=交易 ID 为 {0} 的挂单费交易被比特币网络拒绝。\n交易 ID = {1}\n交易已被移至失败交易。\n请到“设置/网络信息”进行 SPV 重新同步。\n如需更多帮助,请联系 Haveno Keybase 团队的 Support 频道
@@ -1693,6 +1705,9 @@ popup.accountSigning.unsignedPubKeys.signed=公钥已被验证
popup.accountSigning.unsignedPubKeys.result.signed=已验证公钥
popup.accountSigning.unsignedPubKeys.result.failed=未能验证公钥
+popup.info.buyerAsTakerWithoutDeposit.headline=买家无需支付保证金
+popup.info.buyerAsTakerWithoutDeposit=您的报价将不需要来自XMR买家的保证金或费用。\n\n要接受您的报价,您必须与交易伙伴在Haveno外共享一个密码短语。\n\n密码短语会自动生成,并在创建后显示在报价详情中。
+
####################################################################
# Notifications
####################################################################
@@ -1818,6 +1833,7 @@ navigation.support=“帮助”
formatter.formatVolumeLabel={0} 数量 {1}
formatter.makerTaker=卖家 {0} {1} / 买家 {2} {3}
+formatter.makerTakerLocked=卖家 {0} {1} / 买家 {2} {3} 🔒
formatter.youAreAsMaker=您是 {1} {0} 卖家 / 买家是 {3} {2}
formatter.youAreAsTaker=您是 {1} {0} 买家 / 卖家是 {3} {2}
formatter.youAre=您是 {0} {1} ({2} {3})
@@ -1965,8 +1981,6 @@ payment.accountType=账户类型
payment.checking=检查
payment.savings=保存
payment.personalId=个人 ID
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelle是一项转账服务,转账到其他银行做的很好。\n\n1.检查此页面以查看您的银行是否(以及如何)与 Zelle 合作:\nhttps://www.zellepay.com/get-started\n\n2.特别注意您的转账限额-汇款限额因银行而异,银行通常分别指定每日,每周和每月的限额。\n\n3.如果您的银行不能使用 Zelle,您仍然可以通过 Zelle 移动应用程序使用它,但是您的转账限额会低得多。\n\n4.您的 Haveno 帐户上指定的名称必须与 Zelle/银行帐户上的名称匹配。 \n\n如果您无法按照贸易合同中的规定完成 Zelle 交易,则可能会损失部分(或全部)保证金。\n\n由于 Zelle 的拒付风险较高,因此建议卖家通过电子邮件或 SMS 与未签名的买家联系,以确认买家确实拥有 Haveno 中指定的 Zelle 帐户。
payment.fasterPayments.newRequirements.info=有些银行已经开始核实快捷支付收款人的全名。您当前的快捷支付帐户没有填写全名。\n\n请考虑在 Haveno 中重新创建您的快捷支付帐户,为将来的 {0} 买家提供一个完整的姓名。\n\n重新创建帐户时,请确保将银行区号、帐户编号和帐龄验证盐值从旧帐户复制到新帐户。这将确保您现有的帐龄和签名状态得到保留。
payment.moneyGram.info=使用 MoneyGram 时,XMR 买方必须将授权号码和收据的照片通过电子邮件发送给 XMR 卖方。收据必须清楚地显示卖方的全名、国家或地区、州和金额。买方将在交易过程中显示卖方的电子邮件。
@@ -1983,6 +1997,10 @@ payment.revolut.info=Revolut 要求使用“用户名”作为帐户 ID,而不
payment.account.revolut.addUserNameInfo={0}\n您现有的 Revolut 帐户({1})尚未设置“用户名”。\n请输入您的 Revolut ``用户名''以更新您的帐户数据。\n这不会影响您的账龄验证状态。
payment.revolut.addUserNameInfo.headLine=更新 Revolut 账户
+payment.cashapp.info=请注意,Cash App 的退款风险高于大多数银行转账。
+payment.venmo.info=请注意,Venmo 的退款风险高于大多数银行转账。
+payment.paypal.info=请注意,PayPal 的退款风险高于大多数银行转账。
+
payment.amazonGiftCard.upgrade=Amazon gift cards payment method requires the country to be specified.
payment.account.amazonGiftCard.addCountryInfo={0}\nYour existing Amazon Gift Card account ({1}) does not have a Country specified.\nPlease enter your Amazon Gift Card Country to update your account data.\nThis will not affect your account age status.
payment.amazonGiftCard.upgrade.headLine=Update Amazon Gift Card account
@@ -1997,11 +2015,14 @@ payment.f2f.city=“面对面”会议的城市
payment.f2f.city.prompt=城市将与报价一同显示
payment.shared.optionalExtra=可选的附加信息
payment.shared.extraInfo=附加信息
-payment.shared.extraInfo.prompt=Define any special terms, conditions, or details you would like to be displayed with your offers for this payment account (users will see this info before accepting offers).
+payment.shared.extraInfo.offer=附加报价信息
+payment.shared.extraInfo.prompt.paymentAccount=定义您希望在此支付账户的报价中显示的任何特殊术语、条件或细节(用户在接受报价之前将看到这些信息)。
+payment.shared.extraInfo.prompt.offer=定义您希望随您的报价一起显示的任何特殊条款、条件或详细信息。
+payment.shared.extraInfo.noDeposit=联系方式和优惠条款
payment.f2f.info=与网上交易相比,“面对面”交易有不同的规则,也有不同的风险。\n\n主要区别是:\n●交易伙伴需要使用他们提供的联系方式交换关于会面地点和时间的信息。\n●交易双方需要携带笔记本电脑,在会面地点确认“已发送付款”和“已收到付款”。\n●如果交易方有特殊的“条款和条件”,他们必须在账户的“附加信息”文本框中声明这些条款和条件。\n●在发生争议时,调解员或仲裁员不能提供太多帮助,因为通常很难获得有关会面上所发生情况的篡改证据。在这种情况下,XMR 资金可能会被无限期锁定,或者直到交易双方达成协议。\n\n为确保您完全理解“面对面”交易的不同之处,请阅读以下说明和建议:“https://docs.haveno.exchange/trading-rules.html#f2f-trading”
payment.f2f.info.openURL=打开网页
payment.f2f.offerbook.tooltip.countryAndCity=国家或地区及城市:{0} / {1}
-payment.f2f.offerbook.tooltip.extra=附加信息:{0}
+payment.shared.extraInfo.tooltip=附加信息:{0}
payment.japan.bank=银行
payment.japan.branch=分行
@@ -2010,7 +2031,10 @@ payment.japan.recipient=名称
payment.australia.payid=PayID
payment.payid=PayID 需链接至金融机构。例如电子邮件地址或手机。
payment.payid.info=PayID,如电话号码、电子邮件地址或澳大利亚商业号码(ABN),您可以安全地连接到您的银行、信用合作社或建立社会帐户。你需要在你的澳大利亚金融机构创建一个 PayID。发送和接收金融机构都必须支持 PayID。更多信息请查看[HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.paysafe.info=为了保障您的安全,我们强烈不建议使用 Paysafecard PIN 进行支付。\n\n\
+ 通过 PIN 进行的交易无法被独立验证以解决争议。如果出现问题,资金可能无法追回。\n\n\
+ 为确保交易安全并支持争议解决,请始终使用提供可验证记录的支付方式。
# We use constants from the code so we do not use our normal naming convention
@@ -2090,7 +2114,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=亚马逊电子礼品卡
# suppress inspection "UnusedProperty"
@@ -2142,7 +2166,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=亚马逊电子礼品卡
# suppress inspection "UnusedProperty"
diff --git a/core/src/main/resources/i18n/displayStrings_zh-hant.properties b/core/src/main/resources/i18n/displayStrings_zh-hant.properties
index 37d5bfbbd9..e5bf5ec76b 100644
--- a/core/src/main/resources/i18n/displayStrings_zh-hant.properties
+++ b/core/src/main/resources/i18n/displayStrings_zh-hant.properties
@@ -40,6 +40,8 @@ shared.buyMonero=買入比特幣
shared.sellMonero=賣出比特幣
shared.buyCurrency=買入 {0}
shared.sellCurrency=賣出 {0}
+shared.buyCurrencyLocked=買入 {0} 🔒
+shared.sellCurrencyLocked=賣出 {0} 🔒
shared.buyingXMRWith=用 {0} 買入 XMR
shared.sellingXMRFor=賣出 XMR 為 {0}
shared.buyingCurrency=買入 {0}(賣出 XMR)
@@ -186,7 +188,7 @@ shared.total=合計
shared.totalsNeeded=需要資金
shared.tradeWalletAddress=交易錢包地址
shared.tradeWalletBalance=交易錢包餘額
-shared.reserveExactAmount=僅保留所需的資金。在您的交易生效前可能需要支付礦工費和 10 次確認(約20分鐘)。
+shared.reserveExactAmount=僅保留必要的資金。需支付礦工費,約 20 分鐘後您的報價才會上線。
shared.makerTxFee=賣家:{0}
shared.takerTxFee=買家:{0}
shared.iConfirm=我確認
@@ -330,6 +332,7 @@ offerbook.createOffer=創建報價
offerbook.takeOffer=接受報價
offerbook.takeOfferToBuy=接受報價來收購 {0}
offerbook.takeOfferToSell=接受報價來出售 {0}
+offerbook.takeOffer.enterChallenge=輸入報價密碼
offerbook.trader=商人
offerbook.offerersBankId=賣家的銀行 ID(BIC/SWIFT):{0}
offerbook.offerersBankName=賣家的銀行名稱:{0}
@@ -339,7 +342,9 @@ offerbook.offerersAcceptedBankSeats=接受的銀行所在國家(買家):\n
offerbook.availableOffers=可用報價
offerbook.filterByCurrency=以貨幣篩選
offerbook.filterByPaymentMethod=以支付方式篩選
-offerbook.matchingOffers=Offers matching my accounts
+offerbook.matchingOffers=符合我的帳戶的報價
+offerbook.filterNoDeposit=無押金
+offerbook.noDepositOffers=無押金的報價(需要密碼短語)
offerbook.timeSinceSigning=賬户信息
offerbook.timeSinceSigning.info=此賬户已驗證,{0}
offerbook.timeSinceSigning.info.arbitrator=由仲裁員驗證,並可以驗證夥伴賬户
@@ -485,7 +490,10 @@ createOffer.setDepositAsBuyer=設置自己作為買家的保證金(%)
createOffer.setDepositForBothTraders=設置雙方的保證金比例(%)
createOffer.securityDepositInfo=您的買家的保證金將會是 {0}
createOffer.securityDepositInfoAsBuyer=您作為買家的保證金將會是 {0}
-createOffer.minSecurityDepositUsed=已使用最低買家保證金
+createOffer.minSecurityDepositUsed=最低保證金已使用
+createOffer.buyerAsTakerWithoutDeposit=買家無需支付保證金(通行密碼保護)
+createOffer.myDeposit=我的保證金(%)
+createOffer.myDepositInfo=您的保證金將為 {0}
####################################################################
@@ -509,6 +517,8 @@ takeOffer.fundsBox.networkFee=總共挖礦手續費
takeOffer.fundsBox.takeOfferSpinnerInfo=接受報價:{0}
takeOffer.fundsBox.paymentLabel=Haveno 交易 ID {0}
takeOffer.fundsBox.fundsStructure=({0} 保證金,{1} 交易費,{2} 採礦費)
+takeOffer.fundsBox.noFundingRequiredTitle=無需資金
+takeOffer.fundsBox.noFundingRequiredDescription=從賣家那裡在 Haveno 之外獲取優惠密碼以接受此優惠。
takeOffer.success.headline=你已成功下單一個報價。
takeOffer.success.info=你可以在“業務/未完成交易”頁面內查看您的未完成交易。
takeOffer.error.message=下單時發生了一個錯誤。\n\n{0}
@@ -630,7 +640,7 @@ portfolio.pending.step2_buyer.westernUnion.extra=重要要求:\n完成支付
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.postal=請用“美國郵政匯票”發送 {0} 給 XMR 賣家。\n\n
# suppress inspection "TrailingSpacesInProperty"
-portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://haveno.exchange/wiki/Cash_by_Mail].\n\n
+portfolio.pending.step2_buyer.payByMail=Please send {0} using \"Pay by Mail\" to the XMR seller. Specific instructions are in the trade contract, or if unclear you may ask questions via trader chat. See more details about Pay by Mail on the Haveno wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Pay_By_Mail].\n\n
# suppress inspection "TrailingSpacesInProperty"
portfolio.pending.step2_buyer.pay=Please pay {0} via the specified payment method to the XMR seller. You''ll find the seller's account details on the next screen.\n\n
# suppress inspection "TrailingSpacesInProperty"
@@ -1465,6 +1475,7 @@ offerDetailsWindow.confirm.maker=確定:發佈報價 {0} 比特幣
offerDetailsWindow.confirm.taker=確定:下單買入 {0} 比特幣
offerDetailsWindow.creationDate=創建時間
offerDetailsWindow.makersOnion=賣家的匿名地址
+offerDetailsWindow.challenge=提供密碼
qRCodeWindow.headline=二維碼
qRCodeWindow.msg=請使用二維碼從外部錢包充值至 Haveno 錢包
@@ -1505,7 +1516,7 @@ tacWindow.disagree=我不同意並退出
tacWindow.arbitrationSystem=糾紛解決方案
tradeDetailsWindow.headline=交易
-tradeDetailsWindow.disputedPayoutTxId=糾紛支付交易 ID:
+tradeDetailsWindow.disputedPayoutTxId=糾紛支付交易 ID
tradeDetailsWindow.tradeDate=交易時間
tradeDetailsWindow.txFee=礦工手續費
tradeDetailsWindow.tradePeersOnion=交易夥伴匿名地址
@@ -1577,7 +1588,7 @@ popup.headline.error=錯誤
popup.doNotShowAgain=不要再顯示
popup.reportError.log=打開日誌文件
popup.reportError.gitHub=報吿至 Github issue tracker
-popup.reportError={0}\n\n為了幫助我們改進軟件,請在 https://github.com/bisq-network/bisq/issues 上打開一個新問題來報吿這個 bug 。\n\n當您單擊下面任意一個按鈕時,上面的錯誤消息將被複制到剪貼板。\n\n如果您通過按下“打開日誌文件”,保存一份副本,並將其附加到 bug 報吿中,如果包含 haveno.log 文件,那麼調試就會變得更容易。
+popup.reportError={0}\n\n為了幫助我們改進軟件,請在 https://github.com/haveno-dex/haveno/issues 上打開一個新問題來報吿這個 bug 。\n\n當您單擊下面任意一個按鈕時,上面的錯誤消息將被複制到剪貼板。\n\n如果您通過按下“打開日誌文件”,保存一份副本,並將其附加到 bug 報吿中,如果包含 haveno.log 文件,那麼調試就會變得更容易。
popup.error.tryRestart=請嘗試重啟您的應用程序或者檢查您的網絡連接。
popup.error.takeOfferRequestFailed=當有人試圖接受你的報價時發生了一個錯誤:\n{0}
@@ -1620,6 +1631,7 @@ popup.warning.nodeBanned=其中一個 {0} 節點已被禁用
popup.warning.priceRelay=價格傳遞
popup.warning.seed=種子
popup.warning.mandatoryUpdate.trading=請更新到最新的 Haveno 版本。強制更新禁止了舊版本進行交易。更多信息請訪問 Haveno 論壇。
+popup.warning.noFilter=我們未從種子節點收到過濾器物件。請通知網路管理員註冊過濾器物件。
popup.warning.burnXMR=這筆交易是無法實現,因為 {0} 的挖礦手續費用會超過 {1} 的轉賬金額。請等到挖礦手續費再次降低或您積累了更多的 XMR 來轉賬。
popup.warning.openOffer.makerFeeTxRejected=交易 ID 為 {0} 的掛單費交易被比特幣網絡拒絕。\n交易 ID = {1}\n交易已被移至失敗交易。\n請到“設置/網絡信息”進行 SPV 重新同步。\n如需更多幫助,請聯繫 Haveno Keybase 團隊的 Support 頻道
@@ -1687,6 +1699,9 @@ popup.accountSigning.unsignedPubKeys.signed=公鑰已被驗證
popup.accountSigning.unsignedPubKeys.result.signed=已驗證公鑰
popup.accountSigning.unsignedPubKeys.result.failed=未能驗證公鑰
+popup.info.buyerAsTakerWithoutDeposit.headline=買家無需支付保證金
+popup.info.buyerAsTakerWithoutDeposit=您的報價不需要來自XMR買家的保證金或費用。\n\n要接受您的報價,您必須與您的交易夥伴在Haveno之外分享密碼短語。\n\n密碼短語會自動生成並在報價創建後顯示在報價詳情中。
+
####################################################################
# Notifications
####################################################################
@@ -1812,6 +1827,7 @@ navigation.support=“幫助”
formatter.formatVolumeLabel={0} 數量 {1}
formatter.makerTaker=賣家 {0} {1} / 買家 {2} {3}
+formatter.makerTakerLocked=賣家 {0} {1} / 買家 {2} {3} 🔒
formatter.youAreAsMaker=You are: {1} {0} (maker) / Taker is: {3} {2}
formatter.youAreAsTaker=You are: {1} {0} (taker) / Maker is: {3} {2}
formatter.youAre=您是 {0} {1} ({2} {3})
@@ -1959,8 +1975,6 @@ payment.accountType=賬户類型
payment.checking=檢查
payment.savings=保存
payment.personalId=個人 ID
-payment.makeOfferToUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- make offers >{0}, so you only deal with signed/trusted buyers\n- keep any offers to sell <{0} to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
-payment.takeOfferFromUnsignedAccount.warning=With the recent rise in XMR price, beware that selling {0} or less incurs higher risk than before.\n\nIt is highly recommended to either:\n- take offers from signed buyers only\n- keep trades with unsigned/untrusted buyers to around ~100 USD in value, as this value has (historically) discouraged scammers\n\nHaveno developers are working on better ways to secure the payment account model for such smaller trades. Join the discussion here: [HYPERLINK:https://github.com/bisq-network/bisq/discussions/5339].
payment.zelle.info=Zelle是一項轉賬服務,轉賬到其他銀行做的很好。\n\n1.檢查此頁面以查看您的銀行是否(以及如何)與 Zelle 合作:\nhttps://www.zellepay.com/get-started\n\n2.特別注意您的轉賬限額-匯款限額因銀行而異,銀行通常分別指定每日,每週和每月的限額。\n\n3.如果您的銀行不能使用 Zelle,您仍然可以通過 Zelle 移動應用程序使用它,但是您的轉賬限額會低得多。\n\n4.您的 Haveno 帳户上指定的名稱必須與 Zelle/銀行帳户上的名稱匹配。 \n\n如果您無法按照貿易合同中的規定完成 Zelle 交易,則可能會損失部分(或全部)保證金。\n\n由於 Zelle 的拒付風險較高,因此建議賣家通過電子郵件或 SMS 與未簽名的買家聯繫,以確認買家確實擁有 Haveno 中指定的 Zelle 帳户。
payment.fasterPayments.newRequirements.info=有些銀行已經開始核實快捷支付收款人的全名。您當前的快捷支付帳户沒有填寫全名。\n\n請考慮在 Haveno 中重新創建您的快捷支付帳户,為將來的 {0} 買家提供一個完整的姓名。\n\n重新創建帳户時,請確保將銀行區號、帳户編號和帳齡驗證鹽值從舊帳户複製到新帳户。這將確保您現有的帳齡和簽名狀態得到保留。
payment.moneyGram.info=使用 MoneyGram 時,XMR 買方必須將授權號碼和收據的照片通過電子郵件發送給 XMR 賣方。收據必須清楚地顯示賣方的全名、國家或地區、州和金額。買方將在交易過程中顯示賣方的電子郵件。
@@ -1977,6 +1991,10 @@ payment.revolut.info=Revolut 要求使用“用户名”作為帳户 ID,而不
payment.account.revolut.addUserNameInfo={0}\n您現有的 Revolut 帳户({1})尚未設置“用户名”。\n請輸入您的 Revolut ``用户名''以更新您的帳户數據。\n這不會影響您的賬齡驗證狀態。
payment.revolut.addUserNameInfo.headLine=更新 Revolut 賬户
+payment.cashapp.info=請注意,Cash App 的退款風險高於大多數銀行轉帳。
+payment.venmo.info=請注意,Venmo 的退款風險高於大多數銀行轉帳。
+payment.paypal.info=請注意,PayPal 的退款風險高於大多數銀行轉帳。
+
payment.amazonGiftCard.upgrade=Amazon gift cards payment method requires the country to be specified.
payment.account.amazonGiftCard.addCountryInfo={0}\nYour existing Amazon Gift Card account ({1}) does not have a Country specified.\nPlease enter your Amazon Gift Card Country to update your account data.\nThis will not affect your account age status.
payment.amazonGiftCard.upgrade.headLine=Update Amazon Gift Card account
@@ -1991,11 +2009,14 @@ payment.f2f.city=“面對面”會議的城市
payment.f2f.city.prompt=城市將與報價一同顯示
payment.shared.optionalExtra=可選的附加信息
payment.shared.extraInfo=附加信息
-payment.shared.extraInfo.prompt=Define any special terms, conditions, or details you would like to be displayed with your offers for this payment account (users will see this info before accepting offers).
+payment.shared.extraInfo.offer=額外的優惠資訊
+payment.shared.extraInfo.prompt.paymentAccount=定義您希望在此付款帳戶的報價中顯示的任何特殊術語、條件或細節(用戶在接受報價之前將看到這些資訊)。
+payment.shared.extraInfo.prompt.offer=定義您希望在您的報價中顯示的任何特殊條款、條件或詳細資訊。
+payment.shared.extraInfo.noDeposit=聯絡詳情及優惠條款
payment.f2f.info=與網上交易相比,“面對面”交易有不同的規則,也有不同的風險。\n\n主要區別是:\n●交易夥伴需要使用他們提供的聯繫方式交換關於會面地點和時間的信息。\n●交易雙方需要攜帶筆記本電腦,在會面地點確認“已發送付款”和“已收到付款”。\n●如果交易方有特殊的“條款和條件”,他們必須在賬户的“附加信息”文本框中聲明這些條款和條件。\n●在發生爭議時,調解員或仲裁員不能提供太多幫助,因為通常很難獲得有關會面上所發生情況的篡改證據。在這種情況下,XMR 資金可能會被無限期鎖定,或者直到交易雙方達成協議。\n\n為確保您完全理解“面對面”交易的不同之處,請閲讀以下説明和建議:“https://docs.haveno.exchange/trading-rules.html#f2f-trading”
payment.f2f.info.openURL=打開網頁
payment.f2f.offerbook.tooltip.countryAndCity=國家或地區及城市:{0} / {1}
-payment.f2f.offerbook.tooltip.extra=附加信息:{0}
+payment.shared.extraInfo.tooltip=附加信息:{0}
payment.japan.bank=銀行
payment.japan.branch=分行
@@ -2004,7 +2025,10 @@ payment.japan.recipient=名稱
payment.australia.payid=PayID
payment.payid=PayID 需鏈接至金融機構。例如電子郵件地址或手機。
payment.payid.info=PayID,如電話號碼、電子郵件地址或澳大利亞商業號碼(ABN),您可以安全地連接到您的銀行、信用合作社或建立社會帳户。你需要在你的澳大利亞金融機構創建一個 PayID。發送和接收金融機構都必須支持 PayID。更多信息請查看[HYPERLINK:https://payid.com.au/faqs/]
-payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://haveno.exchange/wiki/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.amazonGiftCard.info=To pay with Amazon eGift Card, you will need to send an Amazon eGift Card to the XMR seller via your Amazon account. \n\nHaveno will show the XMR seller''s email address or phone number where the gift card should be sent, and you must include the trade ID in the gift card''s message field. Please see the wiki [HYPERLINK:https://docs.haveno.exchange/the-project/payment_methods/Amazon_eGift_card] for further details and best practices. \n\nThree important notes:\n- try to send gift cards with amounts of 100 USD or smaller, as Amazon is known to flag larger gift cards as fraudulent\n- try to use creative, believable text for the gift card''s message (e.g., "Happy birthday Susan!") along with the trade ID (and use trader chat to tell your trading peer the reference text you picked so they can verify your payment)\n- Amazon eGift Cards can only be redeemed on the Amazon website they were purchased on (e.g., a gift card purchased on amazon.it can only be redeemed on amazon.it)
+payment.paysafe.info=為了保護您的安全,我們強烈不建議使用 Paysafecard PIN 進行付款。\n\n\
+ 透過 PIN 進行的交易無法獨立驗證以進行爭議解決。如果發生問題,可能無法追回資金。\n\n\
+ 為確保交易安全並支持爭議解決,請始終使用可驗證記錄的付款方式。
# We use constants from the code so we do not use our normal naming convention
@@ -2084,7 +2108,7 @@ PROMPT_PAY=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE=TransferWise
+TRANSFERWISE=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD=亞馬遜電子禮品卡
# suppress inspection "UnusedProperty"
@@ -2136,7 +2160,7 @@ PROMPT_PAY_SHORT=PromptPay
# suppress inspection "UnusedProperty"
ADVANCED_CASH_SHORT=Advanced Cash
# suppress inspection "UnusedProperty"
-TRANSFERWISE_SHORT=TransferWise
+TRANSFERWISE_SHORT=Wise
# suppress inspection "UnusedProperty"
AMAZON_GIFT_CARD_SHORT=亞馬遜電子禮品卡
# suppress inspection "UnusedProperty"
diff --git a/core/src/test/java/haveno/core/offer/OfferMaker.java b/core/src/test/java/haveno/core/offer/OfferMaker.java
index 52084f209b..2f839e1a38 100644
--- a/core/src/test/java/haveno/core/offer/OfferMaker.java
+++ b/core/src/test/java/haveno/core/offer/OfferMaker.java
@@ -73,7 +73,8 @@ public class OfferMaker {
0,
null,
null,
- null));
+ null,
+ "My extra info"));
public static final Maker btcUsdOffer = a(Offer);
}
diff --git a/daemon/src/main/java/haveno/daemon/grpc/GrpcOffersService.java b/daemon/src/main/java/haveno/daemon/grpc/GrpcOffersService.java
index 081a0949f7..84443da4d5 100644
--- a/daemon/src/main/java/haveno/daemon/grpc/GrpcOffersService.java
+++ b/daemon/src/main/java/haveno/daemon/grpc/GrpcOffersService.java
@@ -150,10 +150,13 @@ class GrpcOffersService extends OffersImplBase {
req.getMarketPriceMarginPct(),
req.getAmount(),
req.getMinAmount(),
- req.getBuyerSecurityDepositPct(),
+ req.getSecurityDepositPct(),
req.getTriggerPrice(),
req.getReserveExactAmount(),
req.getPaymentAccountId(),
+ req.getIsPrivateOffer(),
+ req.getBuyerAsTakerWithoutDeposit(),
+ req.getExtraInfo(),
offer -> {
// This result handling consumer's accept operation will return
// the new offer to the gRPC client after async placement is done.
@@ -200,9 +203,9 @@ class GrpcOffersService extends OffersImplBase {
return getCustomRateMeteringInterceptor(coreApi.getConfig().appDataDir, this.getClass())
.or(() -> Optional.of(CallRateMeteringInterceptor.valueOf(
new HashMap<>() {{
- put(getGetOfferMethod().getFullMethodName(), new GrpcCallRateMeter(Config.baseCurrencyNetwork().isTestnet() ? 10 : 1, SECONDS));
- put(getGetMyOfferMethod().getFullMethodName(), new GrpcCallRateMeter(Config.baseCurrencyNetwork().isTestnet() ? 10 : 1, SECONDS));
- put(getGetOffersMethod().getFullMethodName(), new GrpcCallRateMeter(Config.baseCurrencyNetwork().isTestnet() ? 30 : 1, SECONDS));
+ put(getGetOfferMethod().getFullMethodName(), new GrpcCallRateMeter(Config.baseCurrencyNetwork().isTestnet() ? 10 : 3, SECONDS));
+ put(getGetMyOfferMethod().getFullMethodName(), new GrpcCallRateMeter(Config.baseCurrencyNetwork().isTestnet() ? 10 : 3, SECONDS));
+ put(getGetOffersMethod().getFullMethodName(), new GrpcCallRateMeter(Config.baseCurrencyNetwork().isTestnet() ? 30 : 3, SECONDS));
put(getGetMyOffersMethod().getFullMethodName(), new GrpcCallRateMeter(Config.baseCurrencyNetwork().isTestnet() ? 30 : 3, Config.baseCurrencyNetwork().isTestnet() ? SECONDS : MINUTES));
put(getPostOfferMethod().getFullMethodName(), new GrpcCallRateMeter(Config.baseCurrencyNetwork().isTestnet() ? 30 : 3, Config.baseCurrencyNetwork().isTestnet() ? SECONDS : MINUTES));
put(getCancelOfferMethod().getFullMethodName(), new GrpcCallRateMeter(Config.baseCurrencyNetwork().isTestnet() ? 10 : 3, Config.baseCurrencyNetwork().isTestnet() ? SECONDS : MINUTES));
diff --git a/daemon/src/main/java/haveno/daemon/grpc/GrpcTradesService.java b/daemon/src/main/java/haveno/daemon/grpc/GrpcTradesService.java
index 123078b246..286fccf51a 100644
--- a/daemon/src/main/java/haveno/daemon/grpc/GrpcTradesService.java
+++ b/daemon/src/main/java/haveno/daemon/grpc/GrpcTradesService.java
@@ -138,6 +138,7 @@ class GrpcTradesService extends TradesImplBase {
coreApi.takeOffer(req.getOfferId(),
req.getPaymentAccountId(),
req.getAmount(),
+ req.getChallenge(),
trade -> {
TradeInfo tradeInfo = toTradeInfo(trade);
var reply = TakeOfferReply.newBuilder()
diff --git a/daemon/src/main/java/haveno/daemon/grpc/GrpcXmrConnectionService.java b/daemon/src/main/java/haveno/daemon/grpc/GrpcXmrConnectionService.java
index a03dc5a73e..f0fcdcc984 100644
--- a/daemon/src/main/java/haveno/daemon/grpc/GrpcXmrConnectionService.java
+++ b/daemon/src/main/java/haveno/daemon/grpc/GrpcXmrConnectionService.java
@@ -47,8 +47,8 @@ import haveno.proto.grpc.CheckConnectionsReply;
import haveno.proto.grpc.CheckConnectionsRequest;
import haveno.proto.grpc.GetAutoSwitchReply;
import haveno.proto.grpc.GetAutoSwitchRequest;
-import haveno.proto.grpc.GetBestAvailableConnectionReply;
-import haveno.proto.grpc.GetBestAvailableConnectionRequest;
+import haveno.proto.grpc.GetBestConnectionReply;
+import haveno.proto.grpc.GetBestConnectionRequest;
import haveno.proto.grpc.GetConnectionReply;
import haveno.proto.grpc.GetConnectionRequest;
import haveno.proto.grpc.GetConnectionsReply;
@@ -68,7 +68,7 @@ import static haveno.proto.grpc.XmrConnectionsGrpc.XmrConnectionsImplBase;
import static haveno.proto.grpc.XmrConnectionsGrpc.getAddConnectionMethod;
import static haveno.proto.grpc.XmrConnectionsGrpc.getCheckConnectionMethod;
import static haveno.proto.grpc.XmrConnectionsGrpc.getCheckConnectionsMethod;
-import static haveno.proto.grpc.XmrConnectionsGrpc.getGetBestAvailableConnectionMethod;
+import static haveno.proto.grpc.XmrConnectionsGrpc.getGetBestConnectionMethod;
import static haveno.proto.grpc.XmrConnectionsGrpc.getGetConnectionMethod;
import static haveno.proto.grpc.XmrConnectionsGrpc.getGetConnectionsMethod;
import static haveno.proto.grpc.XmrConnectionsGrpc.getRemoveConnectionMethod;
@@ -201,12 +201,12 @@ class GrpcXmrConnectionService extends XmrConnectionsImplBase {
}
@Override
- public void getBestAvailableConnection(GetBestAvailableConnectionRequest request,
- StreamObserver responseObserver) {
+ public void getBestConnection(GetBestConnectionRequest request,
+ StreamObserver responseObserver) {
handleRequest(responseObserver, () -> {
- MoneroRpcConnection connection = coreApi.getBestAvailableXmrConnection();
+ MoneroRpcConnection connection = coreApi.getBestXmrConnection();
UrlConnection replyConnection = toUrlConnection(connection);
- GetBestAvailableConnectionReply.Builder builder = GetBestAvailableConnectionReply.newBuilder();
+ GetBestConnectionReply.Builder builder = GetBestConnectionReply.newBuilder();
if (replyConnection != null) {
builder.setConnection(replyConnection);
}
@@ -314,7 +314,7 @@ class GrpcXmrConnectionService extends XmrConnectionsImplBase {
put(getCheckConnectionsMethod().getFullMethodName(), new GrpcCallRateMeter(allowedCallsPerTimeWindow, SECONDS));
put(getStartCheckingConnectionMethod().getFullMethodName(), new GrpcCallRateMeter(allowedCallsPerTimeWindow, SECONDS));
put(getStopCheckingConnectionMethod().getFullMethodName(), new GrpcCallRateMeter(allowedCallsPerTimeWindow, SECONDS));
- put(getGetBestAvailableConnectionMethod().getFullMethodName(), new GrpcCallRateMeter(allowedCallsPerTimeWindow, SECONDS));
+ put(getGetBestConnectionMethod().getFullMethodName(), new GrpcCallRateMeter(allowedCallsPerTimeWindow, SECONDS));
put(getSetAutoSwitchMethod().getFullMethodName(), new GrpcCallRateMeter(allowedCallsPerTimeWindow, SECONDS));
}}
)));
diff --git a/desktop/package/linux/exchange.haveno.Haveno.metainfo.xml b/desktop/package/linux/exchange.haveno.Haveno.metainfo.xml
index 6805134589..a298688669 100644
--- a/desktop/package/linux/exchange.haveno.Haveno.metainfo.xml
+++ b/desktop/package/linux/exchange.haveno.Haveno.metainfo.xml
@@ -60,6 +60,6 @@
-
+
diff --git a/desktop/package/macosx/Info.plist b/desktop/package/macosx/Info.plist
index 31325683fd..7693e124b7 100644
--- a/desktop/package/macosx/Info.plist
+++ b/desktop/package/macosx/Info.plist
@@ -5,10 +5,10 @@
CFBundleVersion
- 1.0.14
+ 1.0.18CFBundleShortVersionString
- 1.0.14
+ 1.0.18CFBundleExecutableHaveno
diff --git a/desktop/src/main/java/haveno/desktop/app/HavenoAppMain.java b/desktop/src/main/java/haveno/desktop/app/HavenoAppMain.java
index a1aee58c4f..ed7e956eba 100644
--- a/desktop/src/main/java/haveno/desktop/app/HavenoAppMain.java
+++ b/desktop/src/main/java/haveno/desktop/app/HavenoAppMain.java
@@ -29,6 +29,7 @@ import haveno.desktop.setup.DesktopPersistedDataHost;
import haveno.desktop.util.ImageUtil;
import javafx.application.Application;
import javafx.application.Platform;
+import javafx.geometry.Pos;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
@@ -200,7 +201,7 @@ public class HavenoAppMain extends HavenoExecutable {
// Add an icon to the dialog
Stage stage = (Stage) getDialogPane().getScene().getWindow();
- stage.getIcons().add(ImageUtil.getImageByPath("lock.png"));
+ stage.getIcons().add(ImageUtil.getImageByPath("lock@2x.png"));
// Create the password field
PasswordField passwordField = new PasswordField();
@@ -210,9 +211,13 @@ public class HavenoAppMain extends HavenoExecutable {
Label errorMessageField = new Label(errorMessage);
errorMessageField.setTextFill(Color.color(1, 0, 0));
+ // Create the version field
+ Label versionField = new Label("v" + Version.VERSION);
+
// Set the dialog content
VBox vbox = new VBox(10);
- vbox.getChildren().addAll(new ImageView(ImageUtil.getImageByPath("logo_splash.png")), passwordField, errorMessageField);
+ vbox.getChildren().addAll(new ImageView(ImageUtil.getImageByPath("logo_splash.png")), passwordField, errorMessageField, versionField);
+ vbox.setAlignment(Pos.TOP_CENTER);
getDialogPane().setContent(vbox);
// Add OK and Cancel buttons
diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/AliPayForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/AliPayForm.java
index f4d7cce695..6688bb591b 100644
--- a/desktop/src/main/java/haveno/desktop/components/paymentmethods/AliPayForm.java
+++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/AliPayForm.java
@@ -26,6 +26,7 @@ import haveno.core.payment.payload.PaymentAccountPayload;
import haveno.core.payment.validation.AliPayValidator;
import haveno.core.util.coin.CoinFormatter;
import haveno.core.util.validation.InputValidator;
+import javafx.collections.FXCollections;
import javafx.scene.layout.GridPane;
import static haveno.desktop.util.FormBuilder.addCompactTopLabelTextFieldWithCopyIcon;
@@ -44,6 +45,12 @@ public class AliPayForm extends GeneralAccountNumberForm {
this.aliPayAccount = (AliPayAccount) paymentAccount;
}
+ @Override
+ public void addTradeCurrency() {
+ addTradeCurrencyComboBox();
+ currencyComboBox.setItems(FXCollections.observableArrayList(aliPayAccount.getSupportedCurrencies()));
+ }
+
@Override
void setAccountNumber(String newValue) {
aliPayAccount.setAccountNr(newValue);
diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/AustraliaPayidForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/AustraliaPayidForm.java
index 234b5e88b0..615663bbbf 100644
--- a/desktop/src/main/java/haveno/desktop/components/paymentmethods/AustraliaPayidForm.java
+++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/AustraliaPayidForm.java
@@ -91,7 +91,7 @@ public class AustraliaPayidForm extends PaymentMethodForm {
});
TextArea extraTextArea = addTopLabelTextArea(gridPane, ++gridRow,
- Res.get("payment.shared.optionalExtra"), Res.get("payment.shared.extraInfo.prompt")).second;
+ Res.get("payment.shared.optionalExtra"), Res.get("payment.shared.extraInfo.prompt.paymentAccount")).second;
extraTextArea.setMinHeight(70);
((JFXTextArea) extraTextArea).setLabelFloat(false);
extraTextArea.textProperty().addListener((ov, oldValue, newValue) -> {
diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/CashAppForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/CashAppForm.java
index 60fe712709..e1376c2643 100644
--- a/desktop/src/main/java/haveno/desktop/components/paymentmethods/CashAppForm.java
+++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/CashAppForm.java
@@ -79,7 +79,7 @@ public class CashAppForm extends PaymentMethodForm {
});
TextArea extraTextArea = addTopLabelTextArea(gridPane, ++gridRow,
- Res.get("payment.shared.optionalExtra"), Res.get("payment.shared.extraInfo.prompt")).second;
+ Res.get("payment.shared.optionalExtra"), Res.get("payment.shared.extraInfo.prompt.paymentAccount")).second;
extraTextArea.setMinHeight(70);
((JFXTextArea) extraTextArea).setLabelFloat(false);
extraTextArea.textProperty().addListener((ov, oldValue, newValue) -> {
@@ -115,6 +115,8 @@ public class CashAppForm extends PaymentMethodForm {
public void addFormForEditAccount() {
gridRowFrom = gridRow;
addAccountNameTextFieldWithAutoFillToggleButton();
+ addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("shared.paymentMethod"),
+ Res.get(cashAppAccount.getPaymentMethod().getId()));
TextField field = addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.email.mobile.cashtag"),
cashAppAccount.getEmailOrMobileNrOrCashtag()).second;
diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/CashAtAtmForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/CashAtAtmForm.java
index 339dce099e..b6447a868d 100644
--- a/desktop/src/main/java/haveno/desktop/components/paymentmethods/CashAtAtmForm.java
+++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/CashAtAtmForm.java
@@ -41,12 +41,12 @@ public class CashAtAtmForm extends PaymentMethodForm {
public static int addFormForBuyer(GridPane gridPane, int gridRow,
PaymentAccountPayload paymentAccountPayload) {
- CashAtAtmAccountPayload cbm = (CashAtAtmAccountPayload) paymentAccountPayload;
+ CashAtAtmAccountPayload cashAtAtmPayload = (CashAtAtmAccountPayload) paymentAccountPayload;
- TextArea textExtraInfo = addCompactTopLabelTextArea(gridPane, gridRow, 1, Res.get("payment.shared.extraInfo"), "").second;
+ TextArea textExtraInfo = addCompactTopLabelTextArea(gridPane, ++gridRow, 0, Res.get("payment.shared.extraInfo"), "").second;
textExtraInfo.setMinHeight(70);
textExtraInfo.setEditable(false);
- textExtraInfo.setText(cbm.getExtraInfo());
+ textExtraInfo.setText(cashAtAtmPayload.getExtraInfo());
return gridRow;
}
@@ -79,7 +79,11 @@ public class CashAtAtmForm extends PaymentMethodForm {
@Override
protected void autoFillNameTextField() {
- setAccountNameWithString(cashAtAtmAccount.getExtraInfo().substring(0, Math.min(50, cashAtAtmAccount.getExtraInfo().length())));
+ if (cashAtAtmAccount.getExtraInfo() != null && !cashAtAtmAccount.getExtraInfo().isEmpty()) {
+ setAccountNameWithString(cashAtAtmAccount.getExtraInfo().substring(0, Math.min(50, cashAtAtmAccount.getExtraInfo().length())));
+ } else {
+ setAccountNameWithString(cashAtAtmAccount.getSelectedTradeCurrency().getCode());
+ }
}
@Override
@@ -104,7 +108,6 @@ public class CashAtAtmForm extends PaymentMethodForm {
@Override
public void updateAllInputsValid() {
allInputsValid.set(isAccountNameValid()
- && !cashAtAtmAccount.getExtraInfo().isEmpty()
&& paymentAccount.getSingleTradeCurrency() != null);
}
}
diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/F2FForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/F2FForm.java
index ada24a71d4..2a7e7f4f2a 100644
--- a/desktop/src/main/java/haveno/desktop/components/paymentmethods/F2FForm.java
+++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/F2FForm.java
@@ -52,20 +52,20 @@ public class F2FForm extends PaymentMethodForm {
private final F2FValidator f2fValidator;
private Country selectedCountry;
- public static int addFormForBuyer(GridPane gridPane, int gridRow,
- PaymentAccountPayload paymentAccountPayload, Offer offer, double top) {
+ public static int addStep2Form(GridPane gridPane, int gridRow,
+ PaymentAccountPayload paymentAccountPayload, Offer offer, double top, boolean isBuyer) {
F2FAccountPayload f2fAccountPayload = (F2FAccountPayload) paymentAccountPayload;
addCompactTopLabelTextFieldWithCopyIcon(gridPane, ++gridRow, 0, Res.get("shared.country"),
CountryUtil.getNameAndCode(f2fAccountPayload.getCountryCode()), top);
addCompactTopLabelTextFieldWithCopyIcon(gridPane, gridRow, 1, Res.get("payment.f2f.city"),
offer.getF2FCity(), top);
addCompactTopLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.f2f.contact"),
- f2fAccountPayload.getContact());
+ isBuyer ? f2fAccountPayload.getContact() : Res.get("shared.na"));
TextArea textArea = addTopLabelTextArea(gridPane, gridRow, 1, Res.get("payment.shared.extraInfo"), "").second;
textArea.setMinHeight(70);
textArea.setEditable(false);
textArea.setId("text-area-disabled");
- textArea.setText(offer.getExtraInfo());
+ textArea.setText(offer.getPaymentAccountExtraInfo());
return gridRow;
}
@@ -106,7 +106,7 @@ public class F2FForm extends PaymentMethodForm {
});
TextArea extraTextArea = addTopLabelTextArea(gridPane, ++gridRow,
- Res.get("payment.shared.optionalExtra"), Res.get("payment.shared.extraInfo.prompt")).second;
+ Res.get("payment.shared.optionalExtra"), Res.get("payment.shared.extraInfo.prompt.paymentAccount")).second;
extraTextArea.setMinHeight(70);
((JFXTextArea) extraTextArea).setLabelFloat(false);
//extraTextArea.setValidator(f2fValidator);
diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/PayPalForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/PayPalForm.java
index 8e0d48ee6e..83e4614a97 100644
--- a/desktop/src/main/java/haveno/desktop/components/paymentmethods/PayPalForm.java
+++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/PayPalForm.java
@@ -79,7 +79,7 @@ public class PayPalForm extends PaymentMethodForm {
});
TextArea extraTextArea = addTopLabelTextArea(gridPane, ++gridRow,
- Res.get("payment.shared.optionalExtra"), Res.get("payment.shared.extraInfo.prompt")).second;
+ Res.get("payment.shared.optionalExtra"), Res.get("payment.shared.extraInfo.prompt.paymentAccount")).second;
extraTextArea.setMinHeight(70);
((JFXTextArea) extraTextArea).setLabelFloat(false);
extraTextArea.textProperty().addListener((ov, oldValue, newValue) -> {
diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/PaymentMethodForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/PaymentMethodForm.java
index 64d0066d5e..5abdee0d61 100644
--- a/desktop/src/main/java/haveno/desktop/components/paymentmethods/PaymentMethodForm.java
+++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/PaymentMethodForm.java
@@ -184,14 +184,14 @@ public abstract class PaymentMethodForm {
Res.get("payment.maxPeriodAndLimitCrypto",
getTimeText(hours),
HavenoUtils.formatXmr(accountAgeWitnessService.getMyTradeLimit(
- paymentAccount, tradeCurrency.getCode(), OfferDirection.BUY), true))
+ paymentAccount, tradeCurrency.getCode(), OfferDirection.BUY, false), true))
:
Res.get("payment.maxPeriodAndLimit",
getTimeText(hours),
HavenoUtils.formatXmr(accountAgeWitnessService.getMyTradeLimit(
- paymentAccount, tradeCurrency.getCode(), OfferDirection.BUY), true),
+ paymentAccount, tradeCurrency.getCode(), OfferDirection.BUY, false), true),
HavenoUtils.formatXmr(accountAgeWitnessService.getMyTradeLimit(
- paymentAccount, tradeCurrency.getCode(), OfferDirection.SELL), true),
+ paymentAccount, tradeCurrency.getCode(), OfferDirection.SELL, false), true),
DisplayUtils.formatAccountAge(accountAge));
return limitationsText;
}
diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/PaysafeForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/PaysafeForm.java
new file mode 100644
index 0000000000..3eba4c78fa
--- /dev/null
+++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/PaysafeForm.java
@@ -0,0 +1,111 @@
+/*
+ * This file is part of Haveno.
+ *
+ * Haveno 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.
+ *
+ * Haveno 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 Haveno. If not, see .
+ */
+
+package haveno.desktop.components.paymentmethods;
+
+import haveno.core.account.witness.AccountAgeWitnessService;
+import haveno.core.locale.Res;
+import haveno.core.payment.PaymentAccount;
+import haveno.core.payment.PaysafeAccount;
+import haveno.core.payment.payload.PaysafeAccountPayload;
+import haveno.core.payment.payload.PaymentAccountPayload;
+import haveno.core.payment.validation.EmailValidator;
+import haveno.core.util.coin.CoinFormatter;
+import haveno.core.util.validation.InputValidator;
+import haveno.desktop.components.InputTextField;
+import haveno.desktop.util.FormBuilder;
+import javafx.scene.control.TextField;
+import javafx.scene.layout.FlowPane;
+import javafx.scene.layout.GridPane;
+
+import static haveno.desktop.util.FormBuilder.addCompactTopLabelTextField;
+import static haveno.desktop.util.FormBuilder.addCompactTopLabelTextFieldWithCopyIcon;
+
+public class PaysafeForm extends PaymentMethodForm {
+ private final PaysafeAccount account;
+ private final EmailValidator validator = new EmailValidator();
+
+ public static int addFormForBuyer(GridPane gridPane, int gridRow,
+ PaymentAccountPayload paymentAccountPayload) {
+ addCompactTopLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.email"),
+ ((PaysafeAccountPayload) paymentAccountPayload).getEmail());
+ return gridRow;
+ }
+
+ public PaysafeForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService,
+ InputValidator inputValidator, GridPane gridPane,
+ int gridRow, CoinFormatter formatter) {
+ super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter);
+ this.account = (PaysafeAccount) paymentAccount;
+ }
+
+ @Override
+ public void addFormForAddAccount() {
+ gridRowFrom = gridRow + 1;
+
+ InputTextField emailInputTextField = FormBuilder.addInputTextField(gridPane, ++gridRow, Res.get("payment.email"));
+ emailInputTextField.setValidator(validator);
+ emailInputTextField.textProperty().addListener((ov, oldValue, newValue) -> {
+ account.setEmail(newValue.trim());
+ updateFromInputs();
+ });
+
+ addCurrenciesGrid(true);
+ addLimitations(false);
+ addAccountNameTextFieldWithAutoFillToggleButton();
+ }
+
+ private void addCurrenciesGrid(boolean isEditable) {
+ FlowPane flowPane = FormBuilder.addTopLabelFlowPane(gridPane, ++gridRow,
+ Res.get("payment.supportedCurrenciesForReceiver"), 20, 20).second;
+
+ if (isEditable) {
+ flowPane.setId("flow-pane-checkboxes-bg");
+ } else {
+ flowPane.setId("flow-pane-checkboxes-non-editable-bg");
+ }
+
+ paymentAccount.getSupportedCurrencies().forEach(currency ->
+ fillUpFlowPaneWithCurrencies(isEditable, flowPane, currency, account));
+ }
+
+ @Override
+ protected void autoFillNameTextField() {
+ setAccountNameWithString(account.getEmail());
+ }
+
+ @Override
+ public void addFormForEditAccount() {
+ gridRowFrom = gridRow;
+ addAccountNameTextFieldWithAutoFillToggleButton();
+ addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("shared.paymentMethod"),
+ Res.get(account.getPaymentMethod().getId()));
+ TextField field = addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.email"),
+ account.getEmail()).second;
+ field.setMouseTransparent(false);
+ addLimitations(true);
+ addCurrenciesGrid(false);
+ }
+
+ @Override
+ public void updateAllInputsValid() {
+ allInputsValid.set(isAccountNameValid()
+ && account.getEmail() != null
+ && validator.validate(account.getEmail()).isValid
+ && account.getTradeCurrencies().size() > 0);
+ }
+}
diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/WeChatPayForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/WeChatPayForm.java
index eb384687f2..cb1b40f6b7 100644
--- a/desktop/src/main/java/haveno/desktop/components/paymentmethods/WeChatPayForm.java
+++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/WeChatPayForm.java
@@ -26,6 +26,7 @@ import haveno.core.payment.payload.WeChatPayAccountPayload;
import haveno.core.payment.validation.WeChatPayValidator;
import haveno.core.util.coin.CoinFormatter;
import haveno.core.util.validation.InputValidator;
+import javafx.collections.FXCollections;
import javafx.scene.layout.GridPane;
import static haveno.desktop.util.FormBuilder.addCompactTopLabelTextFieldWithCopyIcon;
@@ -44,6 +45,12 @@ public class WeChatPayForm extends GeneralAccountNumberForm {
this.weChatPayAccount = (WeChatPayAccount) paymentAccount;
}
+ @Override
+ public void addTradeCurrency() {
+ addTradeCurrencyComboBox();
+ currencyComboBox.setItems(FXCollections.observableArrayList(weChatPayAccount.getSupportedCurrencies()));
+ }
+
@Override
void setAccountNumber(String newValue) {
weChatPayAccount.setAccountNr(newValue);
diff --git a/desktop/src/main/java/haveno/desktop/images.css b/desktop/src/main/java/haveno/desktop/images.css
index 28887daaab..39f0c7e806 100644
--- a/desktop/src/main/java/haveno/desktop/images.css
+++ b/desktop/src/main/java/haveno/desktop/images.css
@@ -59,6 +59,10 @@
-fx-image: url("../../images/sell_red.png");
}
+#image-lock2x {
+ -fx-image: url("../../images/lock@2x.png");
+}
+
#image-expand {
-fx-image: url("../../images/expand.png");
}
diff --git a/desktop/src/main/java/haveno/desktop/main/MainView.java b/desktop/src/main/java/haveno/desktop/main/MainView.java
index 9bf5f378e7..f294eea7bf 100644
--- a/desktop/src/main/java/haveno/desktop/main/MainView.java
+++ b/desktop/src/main/java/haveno/desktop/main/MainView.java
@@ -20,6 +20,7 @@ package haveno.desktop.main;
import com.google.inject.Inject;
import com.jfoenix.controls.JFXBadge;
import com.jfoenix.controls.JFXComboBox;
+import haveno.common.app.Version;
import haveno.common.HavenoException;
import haveno.common.Timer;
import haveno.common.UserThread;
@@ -621,7 +622,9 @@ public class MainView extends InitializableView {
splashP2PNetworkBox.setPrefHeight(40);
splashP2PNetworkBox.getChildren().addAll(splashP2PNetworkLabel, splashP2PNetworkBusyAnimation, splashP2PNetworkIcon, showTorNetworkSettingsButton);
- vBox.getChildren().addAll(logo, blockchainSyncBox, xmrSyncIndicator, splashP2PNetworkBox);
+ Label versionLabel = new Label("v" + Version.VERSION);
+
+ vBox.getChildren().addAll(logo, blockchainSyncBox, xmrSyncIndicator, splashP2PNetworkBox, versionLabel);
return vBox;
}
diff --git a/desktop/src/main/java/haveno/desktop/main/account/content/traditionalaccounts/TraditionalAccountsView.java b/desktop/src/main/java/haveno/desktop/main/account/content/traditionalaccounts/TraditionalAccountsView.java
index 6ed91e956b..a5f7332c81 100644
--- a/desktop/src/main/java/haveno/desktop/main/account/content/traditionalaccounts/TraditionalAccountsView.java
+++ b/desktop/src/main/java/haveno/desktop/main/account/content/traditionalaccounts/TraditionalAccountsView.java
@@ -38,6 +38,7 @@ import haveno.core.payment.PayByMailAccount;
import haveno.core.payment.PayPalAccount;
import haveno.core.payment.PaymentAccount;
import haveno.core.payment.PaymentAccountFactory;
+import haveno.core.payment.PaysafeAccount;
import haveno.core.payment.RevolutAccount;
import haveno.core.payment.USPostalMoneyOrderAccount;
import haveno.core.payment.VenmoAccount;
@@ -103,6 +104,7 @@ import haveno.desktop.components.paymentmethods.PaxumForm;
import haveno.desktop.components.paymentmethods.PayByMailForm;
import haveno.desktop.components.paymentmethods.PayPalForm;
import haveno.desktop.components.paymentmethods.PaymentMethodForm;
+import haveno.desktop.components.paymentmethods.PaysafeForm;
import haveno.desktop.components.paymentmethods.PayseraForm;
import haveno.desktop.components.paymentmethods.PaytmForm;
import haveno.desktop.components.paymentmethods.PerfectMoneyForm;
@@ -400,6 +402,13 @@ public class TraditionalAccountsView extends PaymentAccountsView doSaveNewAccount(paymentAccount))
.show();
+ } else if (paymentAccount instanceof PaysafeAccount) {
+ new Popup().warning(Res.get("payment.paysafe.info"))
+ .width(700)
+ .closeButtonText(Res.get("shared.cancel"))
+ .actionButtonText(Res.get("shared.iUnderstand"))
+ .onAction(() -> doSaveNewAccount(paymentAccount))
+ .show();
} else {
doSaveNewAccount(paymentAccount);
}
@@ -677,6 +686,8 @@ public class TraditionalAccountsView extends PaymentAccountsView
+
-
diff --git a/desktop/src/main/java/haveno/desktop/main/funds/transactions/TransactionsView.java b/desktop/src/main/java/haveno/desktop/main/funds/transactions/TransactionsView.java
index 9544f50748..b882782212 100644
--- a/desktop/src/main/java/haveno/desktop/main/funds/transactions/TransactionsView.java
+++ b/desktop/src/main/java/haveno/desktop/main/funds/transactions/TransactionsView.java
@@ -70,7 +70,7 @@ public class TransactionsView extends ActivatableView {
@FXML
TableView tableView;
@FXML
- TableColumn dateColumn, detailsColumn, addressColumn, transactionColumn, amountColumn, txFeeColumn, memoColumn, confidenceColumn, revertTxColumn;
+ TableColumn dateColumn, detailsColumn, addressColumn, transactionColumn, amountColumn, txFeeColumn, confidenceColumn, memoColumn, revertTxColumn;
@FXML
Label numItems;
@FXML
@@ -133,8 +133,8 @@ public class TransactionsView extends ActivatableView {
transactionColumn.setGraphic(new AutoTooltipLabel(Res.get("shared.txId", Res.getBaseCurrencyCode())));
amountColumn.setGraphic(new AutoTooltipLabel(Res.get("shared.amountWithCur", Res.getBaseCurrencyCode())));
txFeeColumn.setGraphic(new AutoTooltipLabel(Res.get("shared.txFee", Res.getBaseCurrencyCode())));
- memoColumn.setGraphic(new AutoTooltipLabel(Res.get("funds.tx.memo")));
confidenceColumn.setGraphic(new AutoTooltipLabel(Res.get("shared.confirmations", Res.getBaseCurrencyCode())));
+ memoColumn.setGraphic(new AutoTooltipLabel(Res.get("funds.tx.memo")));
revertTxColumn.setGraphic(new AutoTooltipLabel(Res.get("shared.revert", Res.getBaseCurrencyCode())));
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_FLEX_LAST_COLUMN);
@@ -146,8 +146,8 @@ public class TransactionsView extends ActivatableView {
setTransactionColumnCellFactory();
setAmountColumnCellFactory();
setTxFeeColumnCellFactory();
- setMemoColumnCellFactory();
setConfidenceColumnCellFactory();
+ setMemoColumnCellFactory();
setRevertTxColumnCellFactory();
dateColumn.setComparator(Comparator.comparing(TransactionsListItem::getDate));
@@ -221,8 +221,8 @@ public class TransactionsView extends ActivatableView {
columns[3] = item.getTxId();
columns[4] = item.getAmountStr();
columns[5] = item.getTxFeeStr();
- columns[6] = item.getMemo() == null ? "" : item.getMemo();
- columns[7] = String.valueOf(item.getNumConfirmations());
+ columns[6] = String.valueOf(item.getNumConfirmations());
+ columns[7] = item.getMemo() == null ? "" : item.getMemo();
return columns;
};
diff --git a/desktop/src/main/java/haveno/desktop/main/offer/MutableOfferDataModel.java b/desktop/src/main/java/haveno/desktop/main/offer/MutableOfferDataModel.java
index 325e7f2930..68c5edc733 100644
--- a/desktop/src/main/java/haveno/desktop/main/offer/MutableOfferDataModel.java
+++ b/desktop/src/main/java/haveno/desktop/main/offer/MutableOfferDataModel.java
@@ -105,9 +105,11 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
protected final ObjectProperty price = new SimpleObjectProperty<>();
protected final ObjectProperty volume = new SimpleObjectProperty<>();
protected final ObjectProperty minVolume = new SimpleObjectProperty<>();
+ protected final ObjectProperty extraInfo = new SimpleObjectProperty<>();
// Percentage value of buyer security deposit. E.g. 0.01 means 1% of trade amount
- protected final DoubleProperty buyerSecurityDepositPct = new SimpleDoubleProperty();
+ protected final DoubleProperty securityDepositPct = new SimpleDoubleProperty();
+ protected final BooleanProperty buyerAsTakerWithoutDeposit = new SimpleBooleanProperty();
protected final ObservableList paymentAccounts = FXCollections.observableArrayList();
@@ -166,7 +168,7 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
reserveExactAmount = preferences.getSplitOfferOutput();
useMarketBasedPrice.set(preferences.isUsePercentageBasedPrice());
- buyerSecurityDepositPct.set(Restrictions.getMinBuyerSecurityDepositAsPercent());
+ securityDepositPct.set(Restrictions.getMinSecurityDepositAsPercent());
paymentAccountsChangeListener = change -> fillPaymentAccounts();
}
@@ -301,8 +303,11 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
useMarketBasedPrice.get() ? null : price.get(),
useMarketBasedPrice.get(),
useMarketBasedPrice.get() ? marketPriceMargin : 0,
- buyerSecurityDepositPct.get(),
- paymentAccount);
+ securityDepositPct.get(),
+ paymentAccount,
+ buyerAsTakerWithoutDeposit.get(), // private offer if buyer as taker without deposit
+ buyerAsTakerWithoutDeposit.get(),
+ extraInfo.get());
}
void onPlaceOffer(Offer offer, TransactionResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
@@ -329,10 +334,10 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
}
private void setSuggestedSecurityDeposit(PaymentAccount paymentAccount) {
- var minSecurityDeposit = Restrictions.getMinBuyerSecurityDepositAsPercent();
+ var minSecurityDeposit = Restrictions.getMinSecurityDepositAsPercent();
try {
if (getTradeCurrency() == null) {
- setBuyerSecurityDeposit(minSecurityDeposit);
+ setSecurityDepositPct(minSecurityDeposit);
return;
}
// Get average historic prices over for the prior trade period equaling the lock time
@@ -355,16 +360,16 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
var min = extremes[0];
var max = extremes[1];
if (min == 0d || max == 0d) {
- setBuyerSecurityDeposit(minSecurityDeposit);
+ setSecurityDepositPct(minSecurityDeposit);
return;
}
// Suggested deposit is double the trade range over the previous lock time period, bounded by min/max deposit
var suggestedSecurityDeposit =
- Math.min(2 * (max - min) / max, Restrictions.getMaxBuyerSecurityDepositAsPercent());
- buyerSecurityDepositPct.set(Math.max(suggestedSecurityDeposit, minSecurityDeposit));
+ Math.min(2 * (max - min) / max, Restrictions.getMaxSecurityDepositAsPercent());
+ securityDepositPct.set(Math.max(suggestedSecurityDeposit, minSecurityDeposit));
} catch (Throwable t) {
log.error(t.toString());
- buyerSecurityDepositPct.set(minSecurityDeposit);
+ securityDepositPct.set(minSecurityDeposit);
}
}
@@ -455,6 +460,10 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
preferences.setUsePercentageBasedPrice(useMarketBasedPrice);
}
+ protected void setBuyerAsTakerWithoutDeposit(boolean buyerAsTakerWithoutDeposit) {
+ this.buyerAsTakerWithoutDeposit.set(buyerAsTakerWithoutDeposit);
+ }
+
public ObservableList getPaymentAccounts() {
return paymentAccounts;
}
@@ -467,11 +476,11 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
// disallow offers which no buyer can take due to trade limits on release
if (HavenoUtils.isReleasedWithinDays(HavenoUtils.RELEASE_LIMIT_DAYS)) {
- return accountAgeWitnessService.getMyTradeLimit(paymentAccount, tradeCurrencyCode.get(), OfferDirection.BUY);
+ return accountAgeWitnessService.getMyTradeLimit(paymentAccount, tradeCurrencyCode.get(), OfferDirection.BUY, buyerAsTakerWithoutDeposit.get());
}
if (paymentAccount != null) {
- return accountAgeWitnessService.getMyTradeLimit(paymentAccount, tradeCurrencyCode.get(), direction);
+ return accountAgeWitnessService.getMyTradeLimit(paymentAccount, tradeCurrencyCode.get(), direction, buyerAsTakerWithoutDeposit.get());
} else {
return 0;
}
@@ -560,10 +569,6 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
}
}
- BigInteger getSecurityDeposit() {
- return isBuyOffer() ? getBuyerSecurityDeposit() : getSellerSecurityDeposit();
- }
-
void swapTradeToSavings() {
xmrWalletService.resetAddressEntriesForOpenOffer(offerId);
}
@@ -580,6 +585,10 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
this.amount.set(amount);
}
+ protected void setMinAmount(BigInteger minAmount) {
+ this.minAmount.set(minAmount);
+ }
+
protected void setPrice(Price price) {
this.price.set(price);
}
@@ -588,8 +597,24 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
this.volume.set(volume);
}
- protected void setBuyerSecurityDeposit(double value) {
- this.buyerSecurityDepositPct.set(value);
+ protected void setSecurityDepositPct(double value) {
+ this.securityDepositPct.set(value);
+ }
+
+ public void setMarketPriceAvailable(boolean marketPriceAvailable) {
+ this.marketPriceAvailable = marketPriceAvailable;
+ }
+
+ public void setTriggerPrice(long triggerPrice) {
+ this.triggerPrice = triggerPrice;
+ }
+
+ public void setReserveExactAmount(boolean reserveExactAmount) {
+ this.reserveExactAmount = reserveExactAmount;
+ }
+
+ protected void setExtraInfo(String extraInfo) {
+ this.extraInfo.set(extraInfo);
}
///////////////////////////////////////////////////////////////////////////////////////////
@@ -620,8 +645,8 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
return minVolume;
}
- protected void setMinAmount(BigInteger minAmount) {
- this.minAmount.set(minAmount);
+ public ReadOnlyBooleanProperty getBuyerAsTakerWithoutDeposit() {
+ return buyerAsTakerWithoutDeposit;
}
public ReadOnlyStringProperty getTradeCurrencyCode() {
@@ -644,47 +669,27 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
return useMarketBasedPrice;
}
- ReadOnlyDoubleProperty getBuyerSecurityDepositPct() {
- return buyerSecurityDepositPct;
+ ReadOnlyDoubleProperty getSecurityDepositPct() {
+ return securityDepositPct;
}
- protected BigInteger getBuyerSecurityDeposit() {
- BigInteger percentOfAmount = CoinUtil.getPercentOfAmount(buyerSecurityDepositPct.get(), amount.get());
- return getBoundedBuyerSecurityDeposit(percentOfAmount);
- }
-
- private BigInteger getSellerSecurityDeposit() {
+ protected BigInteger getSecurityDeposit() {
BigInteger amount = this.amount.get();
- if (amount == null)
- amount = BigInteger.ZERO;
-
- BigInteger percentOfAmount = CoinUtil.getPercentOfAmount(
- createOfferService.getSellerSecurityDepositAsDouble(buyerSecurityDepositPct.get()), amount);
- return getBoundedSellerSecurityDeposit(percentOfAmount);
+ if (amount == null) amount = BigInteger.ZERO;
+ BigInteger percentOfAmount = CoinUtil.getPercentOfAmount(securityDepositPct.get(), amount);
+ return getBoundedSecurityDeposit(percentOfAmount);
}
- protected BigInteger getBoundedBuyerSecurityDeposit(BigInteger value) {
- // We need to ensure that for small amount values we don't get a too low BTC amount. We limit it with using the
- // MinBuyerSecurityDeposit from Restrictions.
- return Restrictions.getMinBuyerSecurityDeposit().max(value);
- }
-
- private BigInteger getBoundedSellerSecurityDeposit(BigInteger value) {
- // We need to ensure that for small amount values we don't get a too low BTC amount. We limit it with using the
- // MinSellerSecurityDeposit from Restrictions.
- return Restrictions.getMinSellerSecurityDeposit().max(value);
+ protected BigInteger getBoundedSecurityDeposit(BigInteger value) {
+ return Restrictions.getMinSecurityDeposit().max(value);
}
ReadOnlyObjectProperty totalToPayAsProperty() {
return totalToPay;
}
- public void setMarketPriceAvailable(boolean marketPriceAvailable) {
- this.marketPriceAvailable = marketPriceAvailable;
- }
-
public BigInteger getMaxMakerFee() {
- return HavenoUtils.multiply(amount.get(), HavenoUtils.MAKER_FEE_PCT);
+ return HavenoUtils.multiply(amount.get(), buyerAsTakerWithoutDeposit.get() ? HavenoUtils.MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT : HavenoUtils.MAKER_FEE_PCT);
}
boolean canPlaceOffer() {
@@ -692,15 +697,11 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
GUIUtil.canCreateOrTakeOfferOrShowPopup(user, navigation);
}
- public boolean isMinBuyerSecurityDeposit() {
- return getBuyerSecurityDeposit().compareTo(Restrictions.getMinBuyerSecurityDeposit()) <= 0;
+ public boolean isMinSecurityDeposit() {
+ return getSecurityDeposit().compareTo(Restrictions.getMinSecurityDeposit()) <= 0;
}
- public void setTriggerPrice(long triggerPrice) {
- this.triggerPrice = triggerPrice;
- }
-
- public void setReserveExactAmount(boolean reserveExactAmount) {
- this.reserveExactAmount = reserveExactAmount;
+ public ReadOnlyObjectProperty getExtraInfo() {
+ return extraInfo;
}
}
diff --git a/desktop/src/main/java/haveno/desktop/main/offer/MutableOfferView.java b/desktop/src/main/java/haveno/desktop/main/offer/MutableOfferView.java
index 3c6ed09788..e3f9132a84 100644
--- a/desktop/src/main/java/haveno/desktop/main/offer/MutableOfferView.java
+++ b/desktop/src/main/java/haveno/desktop/main/offer/MutableOfferView.java
@@ -44,6 +44,7 @@ import haveno.desktop.components.AutoTooltipLabel;
import haveno.desktop.components.BalanceTextField;
import haveno.desktop.components.BusyAnimation;
import haveno.desktop.components.FundsTextField;
+import haveno.desktop.components.HavenoTextArea;
import haveno.desktop.components.InfoInputTextField;
import haveno.desktop.components.InputTextField;
import haveno.desktop.components.TitledGroupBg;
@@ -71,12 +72,13 @@ import javafx.geometry.Pos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.control.Button;
-import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.Separator;
+import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
+import javafx.scene.control.ToggleButton;
import javafx.scene.control.Tooltip;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
@@ -126,22 +128,24 @@ public abstract class MutableOfferView> exten
private ScrollPane scrollPane;
protected GridPane gridPane;
- private TitledGroupBg payFundsTitledGroupBg, setDepositTitledGroupBg, paymentTitledGroupBg;
+ private TitledGroupBg payFundsTitledGroupBg, setDepositTitledGroupBg, extraInfoTitledGroupBg, paymentTitledGroupBg;
protected TitledGroupBg amountTitledGroupBg;
private BusyAnimation waitingForFundsSpinner;
private AutoTooltipButton nextButton, cancelButton1, cancelButton2, placeOfferButton, fundFromSavingsWalletButton;
private Button priceTypeToggleButton;
private InputTextField fixedPriceTextField, marketBasedPriceTextField, triggerPriceInputTextField;
- protected InputTextField amountTextField, minAmountTextField, volumeTextField, buyerSecurityDepositInputTextField;
+ protected InputTextField amountTextField, minAmountTextField, volumeTextField, securityDepositInputTextField;
private TextField currencyTextField;
private AddressTextField addressTextField;
private BalanceTextField balanceTextField;
- private CheckBox reserveExactAmountCheckbox;
+ private ToggleButton reserveExactAmountSlider;
+ private ToggleButton buyerAsTakerWithoutDepositSlider;
+ protected TextArea extraInfoTextArea;
private FundsTextField totalToPayTextField;
private Label amountDescriptionLabel, priceCurrencyLabel, priceDescriptionLabel, volumeDescriptionLabel,
waitingForFundsLabel, marketBasedPriceLabel, percentagePriceDescriptionLabel, tradeFeeDescriptionLabel,
- resultLabel, tradeFeeInXmrLabel, xLabel, fakeXLabel, buyerSecurityDepositLabel,
- buyerSecurityDepositPercentageLabel, triggerPriceCurrencyLabel, triggerPriceDescriptionLabel;
+ resultLabel, tradeFeeInXmrLabel, xLabel, fakeXLabel, securityDepositLabel,
+ securityDepositPercentageLabel, triggerPriceCurrencyLabel, triggerPriceDescriptionLabel;
protected Label amountBtcLabel, volumeCurrencyLabel, minAmountBtcLabel;
private ComboBox paymentAccountsComboBox;
private ComboBox currencyComboBox;
@@ -149,16 +153,16 @@ public abstract class MutableOfferView> exten
private VBox currencySelection, fixedPriceBox, percentagePriceBox, currencyTextFieldBox, triggerPriceVBox;
private HBox fundingHBox, firstRowHBox, secondRowHBox, placeOfferBox, amountValueCurrencyBox,
priceAsPercentageValueCurrencyBox, volumeValueCurrencyBox, priceValueCurrencyBox,
- minAmountValueCurrencyBox, advancedOptionsBox, triggerPriceHBox;
+ minAmountValueCurrencyBox, securityDepositAndFeeBox, triggerPriceHBox;
private Subscription isWaitingForFundsSubscription, balanceSubscription;
private ChangeListener amountFocusedListener, minAmountFocusedListener, volumeFocusedListener,
- buyerSecurityDepositFocusedListener, priceFocusedListener, placeOfferCompletedListener,
+ securityDepositFocusedListener, priceFocusedListener, placeOfferCompletedListener,
priceAsPercentageFocusedListener, getShowWalletFundedNotificationListener,
- isMinBuyerSecurityDepositListener, triggerPriceFocusedListener;
+ isMinSecurityDepositListener, buyerAsTakerWithoutDepositListener, triggerPriceFocusedListener, extraInfoFocusedListener;
private ChangeListener missingCoinListener;
private ChangeListener tradeCurrencyCodeListener, errorMessageListener,
- marketPriceMarginListener, volumeListener, buyerSecurityDepositInBTCListener;
+ marketPriceMarginListener, volumeListener, securityDepositInXMRListener, extraInfoListener;
private ChangeListener marketPriceAvailableListener;
private EventHandler currencyComboBoxSelectionHandler, paymentAccountsComboBoxSelectionHandler;
private OfferView.CloseHandler closeHandler;
@@ -168,12 +172,14 @@ public abstract class MutableOfferView> exten
private final HashMap paymentAccountWarningDisplayed = new HashMap<>();
private boolean zelleWarningDisplayed, fasterPaymentsWarningDisplayed, isActivated;
private InfoInputTextField marketBasedPriceInfoInputTextField, volumeInfoInputTextField,
- buyerSecurityDepositInfoInputTextField, triggerPriceInfoInputTextField;
+ securityDepositInfoInputTextField, triggerPriceInfoInputTextField;
private Text xIcon, fakeXIcon;
@Setter
private OfferView.OfferActionHandler offerActionHandler;
+ private int heightAdjustment = -5;
+
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor, lifecycle
@@ -199,6 +205,8 @@ public abstract class MutableOfferView> exten
addPaymentGroup();
addAmountPriceGroup();
addOptionsGroup();
+ addExtraInfoGroup();
+ addNextButtons();
addFundingGroup();
createListeners();
@@ -252,6 +260,10 @@ public abstract class MutableOfferView> exten
Label popOverLabel = OfferViewUtil.createPopOverLabel(Res.get("createOffer.triggerPrice.tooltip"));
triggerPriceInfoInputTextField.setContentForPopOver(popOverLabel, AwesomeIcon.SHIELD);
+
+ buyerAsTakerWithoutDepositSlider.setSelected(model.dataModel.getBuyerAsTakerWithoutDeposit().get());
+
+ extraInfoTextArea.setText(model.dataModel.extraInfo.get());
}
}
@@ -323,6 +335,9 @@ public abstract class MutableOfferView> exten
fundFromSavingsWalletButton.setId("sell-button");
}
+ buyerAsTakerWithoutDepositSlider.setVisible(model.isSellOffer());
+ buyerAsTakerWithoutDepositSlider.setManaged(model.isSellOffer());
+
placeOfferButton.updateText(placeOfferButtonLabel);
updatePriceToggle();
}
@@ -375,8 +390,16 @@ public abstract class MutableOfferView> exten
setDepositTitledGroupBg.setVisible(false);
setDepositTitledGroupBg.setManaged(false);
- advancedOptionsBox.setVisible(false);
- advancedOptionsBox.setManaged(false);
+ securityDepositAndFeeBox.setVisible(false);
+ securityDepositAndFeeBox.setManaged(false);
+
+ buyerAsTakerWithoutDepositSlider.setVisible(false);
+ buyerAsTakerWithoutDepositSlider.setManaged(false);
+
+ extraInfoTitledGroupBg.setVisible(false);
+ extraInfoTitledGroupBg.setManaged(false);
+ extraInfoTextArea.setVisible(false);
+ extraInfoTextArea.setManaged(false);
updateQrCode();
@@ -426,7 +449,7 @@ public abstract class MutableOfferView> exten
qrCodeImageView.setVisible(true);
balanceTextField.setVisible(true);
cancelButton2.setVisible(true);
- reserveExactAmountCheckbox.setVisible(true);
+ reserveExactAmountSlider.setVisible(true);
}
private void updateOfferElementsStyle() {
@@ -556,10 +579,11 @@ public abstract class MutableOfferView> exten
volumeTextField.promptTextProperty().bind(model.volumePromptLabel);
totalToPayTextField.textProperty().bind(model.totalToPay);
addressTextField.amountAsProperty().bind(model.getDataModel().getMissingCoin());
- buyerSecurityDepositInputTextField.textProperty().bindBidirectional(model.buyerSecurityDeposit);
- buyerSecurityDepositLabel.textProperty().bind(model.buyerSecurityDepositLabel);
+ securityDepositInputTextField.textProperty().bindBidirectional(model.securityDeposit);
+ securityDepositLabel.textProperty().bind(model.securityDepositLabel);
tradeFeeInXmrLabel.textProperty().bind(model.tradeFeeInXmrWithFiat);
tradeFeeDescriptionLabel.textProperty().bind(model.tradeFeeDescription);
+ extraInfoTextArea.textProperty().bindBidirectional(model.extraInfo);
// Validation
amountTextField.validationResultProperty().bind(model.amountValidationResult);
@@ -567,7 +591,7 @@ public abstract class MutableOfferView> exten
fixedPriceTextField.validationResultProperty().bind(model.priceValidationResult);
triggerPriceInputTextField.validationResultProperty().bind(model.triggerPriceValidationResult);
volumeTextField.validationResultProperty().bind(model.volumeValidationResult);
- buyerSecurityDepositInputTextField.validationResultProperty().bind(model.buyerSecurityDepositValidationResult);
+ securityDepositInputTextField.validationResultProperty().bind(model.securityDepositValidationResult);
// funding
fundingHBox.visibleProperty().bind(model.getDataModel().getIsXmrWalletFunded().not().and(model.showPayFundsScreenDisplayed));
@@ -604,12 +628,13 @@ public abstract class MutableOfferView> exten
volumeTextField.promptTextProperty().unbindBidirectional(model.volume);
totalToPayTextField.textProperty().unbind();
addressTextField.amountAsProperty().unbind();
- buyerSecurityDepositInputTextField.textProperty().unbindBidirectional(model.buyerSecurityDeposit);
- buyerSecurityDepositLabel.textProperty().unbind();
+ securityDepositInputTextField.textProperty().unbindBidirectional(model.securityDeposit);
+ securityDepositLabel.textProperty().unbind();
tradeFeeInXmrLabel.textProperty().unbind();
tradeFeeDescriptionLabel.textProperty().unbind();
tradeFeeInXmrLabel.visibleProperty().unbind();
tradeFeeDescriptionLabel.visibleProperty().unbind();
+ extraInfoTextArea.textProperty().unbindBidirectional(model.extraInfo);
// Validation
amountTextField.validationResultProperty().unbind();
@@ -617,7 +642,7 @@ public abstract class MutableOfferView> exten
fixedPriceTextField.validationResultProperty().unbind();
triggerPriceInputTextField.validationResultProperty().unbind();
volumeTextField.validationResultProperty().unbind();
- buyerSecurityDepositInputTextField.validationResultProperty().unbind();
+ securityDepositInputTextField.validationResultProperty().unbind();
// funding
fundingHBox.visibleProperty().unbind();
@@ -679,15 +704,18 @@ public abstract class MutableOfferView> exten
model.onFocusOutVolumeTextField(oldValue, newValue);
volumeTextField.setText(model.volume.get());
};
- buyerSecurityDepositFocusedListener = (o, oldValue, newValue) -> {
- model.onFocusOutBuyerSecurityDepositTextField(oldValue, newValue);
- buyerSecurityDepositInputTextField.setText(model.buyerSecurityDeposit.get());
+ securityDepositFocusedListener = (o, oldValue, newValue) -> {
+ model.onFocusOutSecurityDepositTextField(oldValue, newValue);
+ securityDepositInputTextField.setText(model.securityDeposit.get());
};
-
triggerPriceFocusedListener = (o, oldValue, newValue) -> {
model.onFocusOutTriggerPriceTextField(oldValue, newValue);
triggerPriceInputTextField.setText(model.triggerPrice.get());
};
+ extraInfoFocusedListener = (observable, oldValue, newValue) -> {
+ model.onFocusOutExtraInfoTextField(oldValue, newValue);
+ extraInfoTextArea.setText(model.extraInfo.get());
+ };
errorMessageListener = (o, oldValue, newValue) -> {
if (model.createOfferCanceled) return;
@@ -750,12 +778,11 @@ public abstract class MutableOfferView> exten
}
};
- buyerSecurityDepositInBTCListener = (observable, oldValue, newValue) -> {
+ securityDepositInXMRListener = (observable, oldValue, newValue) -> {
if (!newValue.equals("")) {
- Label depositInBTCInfo = OfferViewUtil.createPopOverLabel(model.getSecurityDepositPopOverLabel(newValue));
- buyerSecurityDepositInfoInputTextField.setContentForInfoPopOver(depositInBTCInfo);
+ updateSecurityDepositLabels();
} else {
- buyerSecurityDepositInfoInputTextField.setContentForInfoPopOver(null);
+ securityDepositInfoInputTextField.setContentForInfoPopOver(null);
}
};
@@ -805,17 +832,35 @@ public abstract class MutableOfferView> exten
}
};
- isMinBuyerSecurityDepositListener = ((observable, oldValue, newValue) -> {
- if (newValue) {
- // show BTC
- buyerSecurityDepositPercentageLabel.setText(Res.getBaseCurrencyCode());
- buyerSecurityDepositInputTextField.setDisable(true);
- } else {
- // show %
- buyerSecurityDepositPercentageLabel.setText("%");
- buyerSecurityDepositInputTextField.setDisable(false);
- }
+ isMinSecurityDepositListener = ((observable, oldValue, newValue) -> {
+ updateSecurityDepositLabels();
});
+
+ buyerAsTakerWithoutDepositListener = ((observable, oldValue, newValue) -> {
+ updateSecurityDepositLabels();
+ });
+
+ extraInfoListener = (observable, oldValue, newValue) -> {
+ if (newValue != null && !newValue.equals("")) {
+ // no action
+ }
+ };
+ }
+
+ private void updateSecurityDepositLabels() {
+ if (model.isMinSecurityDeposit.get()) {
+ // show XMR
+ securityDepositPercentageLabel.setText(Res.getBaseCurrencyCode());
+ securityDepositInputTextField.setDisable(true);
+ } else {
+ // show %
+ securityDepositPercentageLabel.setText("%");
+ securityDepositInputTextField.setDisable(model.getDataModel().buyerAsTakerWithoutDeposit.get());
+ }
+ if (model.securityDepositInXMR.get() != null && !model.securityDepositInXMR.get().equals("")) {
+ Label depositInBTCInfo = OfferViewUtil.createPopOverLabel(model.getSecurityDepositPopOverLabel(model.securityDepositInXMR.get()));
+ securityDepositInfoInputTextField.setContentForInfoPopOver(depositInBTCInfo);
+ }
}
private void updateQrCode() {
@@ -856,8 +901,10 @@ public abstract class MutableOfferView> exten
model.marketPriceMargin.addListener(marketPriceMarginListener);
model.volume.addListener(volumeListener);
model.getDataModel().missingCoin.addListener(missingCoinListener);
- model.buyerSecurityDepositInBTC.addListener(buyerSecurityDepositInBTCListener);
- model.isMinBuyerSecurityDeposit.addListener(isMinBuyerSecurityDepositListener);
+ model.securityDepositInXMR.addListener(securityDepositInXMRListener);
+ model.isMinSecurityDeposit.addListener(isMinSecurityDepositListener);
+ model.getDataModel().buyerAsTakerWithoutDeposit.addListener(buyerAsTakerWithoutDepositListener);
+ model.getDataModel().extraInfo.addListener(extraInfoListener);
// focus out
amountTextField.focusedProperty().addListener(amountFocusedListener);
@@ -866,7 +913,8 @@ public abstract class MutableOfferView> exten
triggerPriceInputTextField.focusedProperty().addListener(triggerPriceFocusedListener);
marketBasedPriceTextField.focusedProperty().addListener(priceAsPercentageFocusedListener);
volumeTextField.focusedProperty().addListener(volumeFocusedListener);
- buyerSecurityDepositInputTextField.focusedProperty().addListener(buyerSecurityDepositFocusedListener);
+ securityDepositInputTextField.focusedProperty().addListener(securityDepositFocusedListener);
+ extraInfoTextArea.focusedProperty().addListener(extraInfoFocusedListener);
// notifications
model.getDataModel().getShowWalletFundedNotification().addListener(getShowWalletFundedNotificationListener);
@@ -888,8 +936,10 @@ public abstract class MutableOfferView> exten
model.marketPriceMargin.removeListener(marketPriceMarginListener);
model.volume.removeListener(volumeListener);
model.getDataModel().missingCoin.removeListener(missingCoinListener);
- model.buyerSecurityDepositInBTC.removeListener(buyerSecurityDepositInBTCListener);
- model.isMinBuyerSecurityDeposit.removeListener(isMinBuyerSecurityDepositListener);
+ model.securityDepositInXMR.removeListener(securityDepositInXMRListener);
+ model.isMinSecurityDeposit.removeListener(isMinSecurityDepositListener);
+ model.getDataModel().buyerAsTakerWithoutDeposit.removeListener(buyerAsTakerWithoutDepositListener);
+ model.getDataModel().extraInfo.removeListener(extraInfoListener);
// focus out
amountTextField.focusedProperty().removeListener(amountFocusedListener);
@@ -898,7 +948,8 @@ public abstract class MutableOfferView> exten
triggerPriceInputTextField.focusedProperty().removeListener(triggerPriceFocusedListener);
marketBasedPriceTextField.focusedProperty().removeListener(priceAsPercentageFocusedListener);
volumeTextField.focusedProperty().removeListener(volumeFocusedListener);
- buyerSecurityDepositInputTextField.focusedProperty().removeListener(buyerSecurityDepositFocusedListener);
+ securityDepositInputTextField.focusedProperty().removeListener(securityDepositFocusedListener);
+ extraInfoTextArea.focusedProperty().removeListener(extraInfoFocusedListener);
// notifications
model.getDataModel().getShowWalletFundedNotification().removeListener(getShowWalletFundedNotificationListener);
@@ -935,7 +986,7 @@ public abstract class MutableOfferView> exten
}
private void addPaymentGroup() {
- paymentTitledGroupBg = addTitledGroupBg(gridPane, gridRow, 1, Res.get("offerbook.createOffer"));
+ paymentTitledGroupBg = addTitledGroupBg(gridPane, gridRow, 1, Res.get("offerbook.createOffer"), heightAdjustment);
GridPane.setColumnSpan(paymentTitledGroupBg, 2);
HBox paymentGroupBox = new HBox();
@@ -953,7 +1004,7 @@ public abstract class MutableOfferView> exten
GridPane.setRowIndex(paymentGroupBox, gridRow);
GridPane.setColumnSpan(paymentGroupBox, 2);
- GridPane.setMargin(paymentGroupBox, new Insets(Layout.FIRST_ROW_DISTANCE, 0, 0, 0));
+ GridPane.setMargin(paymentGroupBox, new Insets(Layout.FIRST_ROW_DISTANCE + heightAdjustment, 0, 0, 0));
gridPane.getChildren().add(paymentGroupBox);
tradingAccountBoxTuple.first.setMinWidth(800);
@@ -989,7 +1040,7 @@ public abstract class MutableOfferView> exten
private void addAmountPriceGroup() {
amountTitledGroupBg = addTitledGroupBg(gridPane, ++gridRow, 2,
- Res.get("createOffer.setAmountPrice"), 25);
+ Res.get("createOffer.setAmountPrice"), 25 + heightAdjustment);
GridPane.setColumnSpan(amountTitledGroupBg, 2);
addAmountPriceFields();
@@ -997,23 +1048,72 @@ public abstract class MutableOfferView> exten
}
private void addOptionsGroup() {
- setDepositTitledGroupBg = addTitledGroupBg(gridPane, ++gridRow, 1,
- Res.get("shared.advancedOptions"), Layout.COMPACT_GROUP_DISTANCE);
+ setDepositTitledGroupBg = addTitledGroupBg(gridPane, ++gridRow, 2,
+ Res.get("shared.advancedOptions"), 25 + heightAdjustment);
- advancedOptionsBox = new HBox();
- advancedOptionsBox.setSpacing(40);
+ securityDepositAndFeeBox = new HBox();
+ securityDepositAndFeeBox.setSpacing(40);
- GridPane.setRowIndex(advancedOptionsBox, gridRow);
- GridPane.setColumnSpan(advancedOptionsBox, GridPane.REMAINING);
- GridPane.setColumnIndex(advancedOptionsBox, 0);
- GridPane.setHalignment(advancedOptionsBox, HPos.LEFT);
- GridPane.setMargin(advancedOptionsBox, new Insets(Layout.COMPACT_FIRST_ROW_AND_GROUP_DISTANCE, 0, 0, 0));
- gridPane.getChildren().add(advancedOptionsBox);
+ GridPane.setRowIndex(securityDepositAndFeeBox, gridRow);
+ GridPane.setColumnSpan(securityDepositAndFeeBox, GridPane.REMAINING);
+ GridPane.setColumnIndex(securityDepositAndFeeBox, 0);
+ GridPane.setHalignment(securityDepositAndFeeBox, HPos.LEFT);
+ GridPane.setMargin(securityDepositAndFeeBox, new Insets(Layout.COMPACT_FIRST_ROW_AND_GROUP_DISTANCE, 0, 0, 0));
+ gridPane.getChildren().add(securityDepositAndFeeBox);
VBox tradeFeeFieldsBox = getTradeFeeFieldsBox();
tradeFeeFieldsBox.setMinWidth(240);
- advancedOptionsBox.getChildren().addAll(getBuyerSecurityDepositBox(), tradeFeeFieldsBox);
+ securityDepositAndFeeBox.getChildren().addAll(getSecurityDepositBox(), tradeFeeFieldsBox);
+ buyerAsTakerWithoutDepositSlider = FormBuilder.addSlideToggleButton(gridPane, ++gridRow, Res.get("createOffer.buyerAsTakerWithoutDeposit"));
+ buyerAsTakerWithoutDepositSlider.setPadding(new Insets(0, 0, 0, 0));
+ buyerAsTakerWithoutDepositSlider.setOnAction(event -> {
+
+ // popup info box
+ String key = "popup.info.buyerAsTakerWithoutDeposit";
+ if (buyerAsTakerWithoutDepositSlider.isSelected() && DontShowAgainLookup.showAgain(key)) {
+ new Popup().headLine(Res.get(key + ".headline"))
+ .information(Res.get(key))
+ .closeButtonText(Res.get("shared.cancel"))
+ .actionButtonText(Res.get("shared.ok"))
+ .onAction(() -> model.dataModel.setBuyerAsTakerWithoutDeposit(true))
+ .onClose(() -> {
+ buyerAsTakerWithoutDepositSlider.setSelected(false);
+ model.dataModel.setBuyerAsTakerWithoutDeposit(false);
+ })
+ .dontShowAgainId(key)
+ .show();
+ } else {
+ model.dataModel.setBuyerAsTakerWithoutDeposit(buyerAsTakerWithoutDepositSlider.isSelected());
+ }
+ });
+ GridPane.setHalignment(buyerAsTakerWithoutDepositSlider, HPos.LEFT);
+ GridPane.setMargin(buyerAsTakerWithoutDepositSlider, new Insets(0, 0, 0, 0));
+ }
+
+ private void addExtraInfoGroup() {
+
+ extraInfoTitledGroupBg = addTitledGroupBg(gridPane, ++gridRow, 1,
+ Res.get("payment.shared.optionalExtra"), 25 + heightAdjustment);
+ GridPane.setColumnSpan(extraInfoTitledGroupBg, 3);
+
+ extraInfoTextArea = new HavenoTextArea();
+ extraInfoTextArea.setPromptText(Res.get("payment.shared.extraInfo.prompt.offer"));
+ extraInfoTextArea.getStyleClass().add("text-area");
+ extraInfoTextArea.setWrapText(true);
+ extraInfoTextArea.setPrefHeight(75);
+ extraInfoTextArea.setMinHeight(75);
+ extraInfoTextArea.setMaxHeight(75);
+ extraInfoTextArea.setFocusTraversable(false);
+ GridPane.setRowIndex(extraInfoTextArea, gridRow);
+ GridPane.setColumnSpan(extraInfoTextArea, GridPane.REMAINING);
+ GridPane.setColumnIndex(extraInfoTextArea, 0);
+ GridPane.setHalignment(extraInfoTextArea, HPos.LEFT);
+ GridPane.setMargin(extraInfoTextArea, new Insets(Layout.COMPACT_FIRST_ROW_AND_GROUP_DISTANCE, 0, 0, 0));
+ gridPane.getChildren().add(extraInfoTextArea);
+ }
+
+ private void addNextButtons() {
Tuple2