mirror of
https://github.com/haveno-dex/haveno.git
synced 2024-10-01 01:35:48 -04:00
UI cleanup, can confirm payment sent and received after dispute opened
show buyer and seller trade fee in dispute summary window remove "Error polling trade wallet warning" if disconnected show notification when dispute opened or closed in legacy app resolve disputes under Support > Arbitration, hide other views show "support ticket opened" when dispute request is acked rename all variations of TradingPeer to TradePeer rename "payment started" to "payment sent" for consistency
This commit is contained in:
parent
a50e151c98
commit
aafb47e2ce
@ -418,7 +418,7 @@ waitfortradepaymentreceived() {
|
||||
done
|
||||
}
|
||||
|
||||
delayconfirmpaymentstarted() {
|
||||
delayconfirmpaymentsent() {
|
||||
# Confirm payment started after a random delay. This should be run in the background
|
||||
# while the payee polls the trade status, waiting for the message before confirming
|
||||
# payment has been received.
|
||||
@ -428,11 +428,11 @@ delayconfirmpaymentstarted() {
|
||||
RANDOM_WAIT=$(echo $[$RANDOM % 5 + 1])
|
||||
printdate "$PAYER: Sending 'payment sent' message to seller in $RANDOM_WAIT seconds..."
|
||||
sleeptraced "$RANDOM_WAIT"
|
||||
CMD="$CLI_BASE --port=$PORT confirmpaymentstarted --trade-id=$OFFER_ID"
|
||||
CMD="$CLI_BASE --port=$PORT confirmpaymentsent --trade-id=$OFFER_ID"
|
||||
printdate "$PAYER_CLI: $CMD"
|
||||
SENT_MSG=$($CMD)
|
||||
commandalert $? "Could not send confirmpaymentstarted message."
|
||||
# Print the confirmpaymentstarted command's console output.
|
||||
commandalert $? "Could not send confirmpaymentsent message."
|
||||
# Print the confirmpaymentsent command's console output.
|
||||
printdate "$SENT_MSG"
|
||||
printbreak
|
||||
}
|
||||
@ -450,8 +450,8 @@ delayconfirmpaymentreceived() {
|
||||
CMD="$CLI_BASE --port=$PORT confirmpaymentreceived --trade-id=$OFFER_ID"
|
||||
printdate "$PAYEE_CLI: $CMD"
|
||||
RCVD_MSG=$($CMD)
|
||||
commandalert $? "Could not send confirmpaymentstarted message."
|
||||
# Print the confirmpaymentstarted command's console output.
|
||||
commandalert $? "Could not send confirmpaymentsent message."
|
||||
# Print the confirmpaymentsent command's console output.
|
||||
printdate "$RCVD_MSG"
|
||||
printbreak
|
||||
}
|
||||
@ -505,7 +505,7 @@ executetrade() {
|
||||
fi
|
||||
|
||||
# Asynchronously send a confirm payment started message after a random delay.
|
||||
delayconfirmpaymentstarted "$PAYER" "$PAYER_PORT" "$OFFER_ID" &
|
||||
delayconfirmpaymentsent "$PAYER" "$PAYER_PORT" "$OFFER_ID" &
|
||||
|
||||
if [ "$DIRECTION" = "BUY" ]
|
||||
then
|
||||
|
@ -136,7 +136,7 @@ public class AbstractTradeTest extends AbstractOfferTest {
|
||||
// it might be AVAILABLE, not OFFER_FEE_RESERVED.
|
||||
EXPECTED_PROTOCOL_STATUS.setState(BUYER_SAW_ARRIVED_PAYMENT_SENT_MSG)
|
||||
.setPhase(PAYMENT_SENT)
|
||||
.setPaymentStartedMessageSent(true);
|
||||
.setPaymentSentMessageSent(true);
|
||||
verifyExpectedProtocolStatus(trade);
|
||||
logTrade(log, testInfo, userName + "'s view after confirming trade payment sent", trade);
|
||||
break;
|
||||
@ -185,7 +185,7 @@ public class AbstractTradeTest extends AbstractOfferTest {
|
||||
assertEquals(EXPECTED_PROTOCOL_STATUS.isDepositPublished, trade.getIsDepositsPublished());
|
||||
|
||||
assertEquals(EXPECTED_PROTOCOL_STATUS.isDepositConfirmed, trade.getIsDepositsUnlocked());
|
||||
assertEquals(EXPECTED_PROTOCOL_STATUS.isPaymentStartedMessageSent, trade.getIsPaymentSent());
|
||||
assertEquals(EXPECTED_PROTOCOL_STATUS.isPaymentSentMessageSent, trade.getIsPaymentSent());
|
||||
assertEquals(EXPECTED_PROTOCOL_STATUS.isPaymentReceivedMessageSent, trade.getIsPaymentReceived());
|
||||
assertEquals(EXPECTED_PROTOCOL_STATUS.isPayoutPublished, trade.getIsPayoutPublished());
|
||||
assertEquals(EXPECTED_PROTOCOL_STATUS.isCompleted, trade.getIsCompleted());
|
||||
|
@ -11,7 +11,7 @@ public class ExpectedProtocolStatus {
|
||||
Trade.Phase phase;
|
||||
boolean isDepositPublished;
|
||||
boolean isDepositConfirmed;
|
||||
boolean isPaymentStartedMessageSent;
|
||||
boolean isPaymentSentMessageSent;
|
||||
boolean isPaymentReceivedMessageSent;
|
||||
boolean isPayoutPublished;
|
||||
boolean isCompleted;
|
||||
@ -36,8 +36,8 @@ public class ExpectedProtocolStatus {
|
||||
return this;
|
||||
}
|
||||
|
||||
public ExpectedProtocolStatus setPaymentStartedMessageSent(boolean paymentStartedMessageSent) {
|
||||
isPaymentStartedMessageSent = paymentStartedMessageSent;
|
||||
public ExpectedProtocolStatus setPaymentSentMessageSent(boolean paymentSentMessageSent) {
|
||||
isPaymentSentMessageSent = paymentSentMessageSent;
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -61,7 +61,7 @@ public class ExpectedProtocolStatus {
|
||||
phase = null;
|
||||
isDepositPublished = false;
|
||||
isDepositConfirmed = false;
|
||||
isPaymentStartedMessageSent = false;
|
||||
isPaymentSentMessageSent = false;
|
||||
isPaymentReceivedMessageSent = false;
|
||||
isPayoutPublished = false;
|
||||
isCompleted = false;
|
||||
|
@ -87,11 +87,11 @@ public class TakeBuyBTCOfferTest extends AbstractTradeTest {
|
||||
|
||||
@Test
|
||||
@Order(2)
|
||||
public void testAlicesConfirmPaymentStarted(final TestInfo testInfo) {
|
||||
public void testAlicesConfirmPaymentSent(final TestInfo testInfo) {
|
||||
try {
|
||||
var trade = aliceClient.getTrade(tradeId);
|
||||
waitForDepositUnlocked(log, testInfo, aliceClient, trade.getTradeId());
|
||||
aliceClient.confirmPaymentStarted(trade.getTradeId());
|
||||
aliceClient.confirmPaymentSent(trade.getTradeId());
|
||||
sleep(6_000);
|
||||
waitForBuyerSeesPaymentInitiatedMessage(log, testInfo, aliceClient, tradeId);
|
||||
} catch (StatusRuntimeException e) {
|
||||
|
@ -173,11 +173,11 @@ public class TakeBuyBTCOfferWithNationalBankAcctTest extends AbstractTradeTest {
|
||||
|
||||
@Test
|
||||
@Order(3)
|
||||
public void testAlicesConfirmPaymentStarted(final TestInfo testInfo) {
|
||||
public void testAlicesConfirmPaymentSent(final TestInfo testInfo) {
|
||||
try {
|
||||
var trade = aliceClient.getTrade(tradeId);
|
||||
waitForDepositUnlocked(log, testInfo, aliceClient, trade.getTradeId());
|
||||
aliceClient.confirmPaymentStarted(trade.getTradeId());
|
||||
aliceClient.confirmPaymentSent(trade.getTradeId());
|
||||
sleep(6_000);
|
||||
waitForBuyerSeesPaymentInitiatedMessage(log, testInfo, aliceClient, tradeId);
|
||||
trade = aliceClient.getTrade(tradeId);
|
||||
|
@ -95,13 +95,13 @@ public class TakeBuyXMROfferTest extends AbstractTradeTest {
|
||||
|
||||
@Test
|
||||
@Order(2)
|
||||
public void testBobsConfirmPaymentStarted(final TestInfo testInfo) {
|
||||
public void testBobsConfirmPaymentSent(final TestInfo testInfo) {
|
||||
try {
|
||||
var trade = bobClient.getTrade(tradeId);
|
||||
|
||||
verifyTakerDepositConfirmed(trade);
|
||||
log.debug("Bob sends XMR payment to Alice for trade {}", trade.getTradeId());
|
||||
bobClient.confirmPaymentStarted(trade.getTradeId());
|
||||
bobClient.confirmPaymentSent(trade.getTradeId());
|
||||
sleep(3500);
|
||||
waitForBuyerSeesPaymentInitiatedMessage(log, testInfo, bobClient, tradeId);
|
||||
|
||||
|
@ -96,11 +96,11 @@ public class TakeSellBTCOfferTest extends AbstractTradeTest {
|
||||
|
||||
@Test
|
||||
@Order(2)
|
||||
public void testBobsConfirmPaymentStarted(final TestInfo testInfo) {
|
||||
public void testBobsConfirmPaymentSent(final TestInfo testInfo) {
|
||||
try {
|
||||
var trade = bobClient.getTrade(tradeId);
|
||||
verifyTakerDepositConfirmed(trade);
|
||||
bobClient.confirmPaymentStarted(tradeId);
|
||||
bobClient.confirmPaymentSent(tradeId);
|
||||
sleep(6_000);
|
||||
waitForBuyerSeesPaymentInitiatedMessage(log, testInfo, bobClient, tradeId);
|
||||
} catch (StatusRuntimeException e) {
|
||||
|
@ -103,12 +103,12 @@ public class TakeSellXMROfferTest extends AbstractTradeTest {
|
||||
|
||||
@Test
|
||||
@Order(2)
|
||||
public void testAlicesConfirmPaymentStarted(final TestInfo testInfo) {
|
||||
public void testAlicesConfirmPaymentSent(final TestInfo testInfo) {
|
||||
try {
|
||||
var trade = aliceClient.getTrade(tradeId);
|
||||
waitForDepositUnlocked(log, testInfo, aliceClient, trade.getTradeId());
|
||||
log.debug("Alice sends XMR payment to Bob for trade {}", trade.getTradeId());
|
||||
aliceClient.confirmPaymentStarted(trade.getTradeId());
|
||||
aliceClient.confirmPaymentSent(trade.getTradeId());
|
||||
sleep(3500);
|
||||
|
||||
waitForBuyerSeesPaymentInitiatedMessage(log, testInfo, aliceClient, tradeId);
|
||||
|
@ -69,7 +69,7 @@ public class LongRunningTradesTest extends AbstractTradeTest {
|
||||
TakeBuyBTCOfferTest test = new TakeBuyBTCOfferTest();
|
||||
setLongRunningTest(true);
|
||||
test.testTakeAlicesBuyOffer(testInfo);
|
||||
test.testAlicesConfirmPaymentStarted(testInfo);
|
||||
test.testAlicesConfirmPaymentSent(testInfo);
|
||||
test.testBobsConfirmPaymentReceived(testInfo);
|
||||
}
|
||||
|
||||
@ -77,7 +77,7 @@ public class LongRunningTradesTest extends AbstractTradeTest {
|
||||
TakeSellBTCOfferTest test = new TakeSellBTCOfferTest();
|
||||
setLongRunningTest(true);
|
||||
test.testTakeAlicesSellOffer(testInfo);
|
||||
test.testBobsConfirmPaymentStarted(testInfo);
|
||||
test.testBobsConfirmPaymentSent(testInfo);
|
||||
test.testAlicesConfirmPaymentReceived(testInfo);
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ public class TradeTest extends AbstractTradeTest {
|
||||
public void testTakeBuyBTCOffer(final TestInfo testInfo) {
|
||||
TakeBuyBTCOfferTest test = new TakeBuyBTCOfferTest();
|
||||
test.testTakeAlicesBuyOffer(testInfo);
|
||||
test.testAlicesConfirmPaymentStarted(testInfo);
|
||||
test.testAlicesConfirmPaymentSent(testInfo);
|
||||
test.testBobsConfirmPaymentReceived(testInfo);
|
||||
}
|
||||
|
||||
@ -59,7 +59,7 @@ public class TradeTest extends AbstractTradeTest {
|
||||
public void testTakeSellBTCOffer(final TestInfo testInfo) {
|
||||
TakeSellBTCOfferTest test = new TakeSellBTCOfferTest();
|
||||
test.testTakeAlicesSellOffer(testInfo);
|
||||
test.testBobsConfirmPaymentStarted(testInfo);
|
||||
test.testBobsConfirmPaymentSent(testInfo);
|
||||
test.testAlicesConfirmPaymentReceived(testInfo);
|
||||
}
|
||||
|
||||
@ -69,7 +69,7 @@ public class TradeTest extends AbstractTradeTest {
|
||||
TakeBuyBTCOfferWithNationalBankAcctTest test = new TakeBuyBTCOfferWithNationalBankAcctTest();
|
||||
test.testTakeAlicesBuyOffer(testInfo);
|
||||
test.testBankAcctDetailsIncludedInContracts(testInfo);
|
||||
test.testAlicesConfirmPaymentStarted(testInfo);
|
||||
test.testAlicesConfirmPaymentSent(testInfo);
|
||||
test.testBobsConfirmPaymentReceived(testInfo);
|
||||
}
|
||||
|
||||
@ -79,7 +79,7 @@ public class TradeTest extends AbstractTradeTest {
|
||||
TakeBuyXMROfferTest test = new TakeBuyXMROfferTest();
|
||||
TakeBuyXMROfferTest.createXmrPaymentAccounts();
|
||||
test.testTakeAlicesSellBTCForXMROffer(testInfo);
|
||||
test.testBobsConfirmPaymentStarted(testInfo);
|
||||
test.testBobsConfirmPaymentSent(testInfo);
|
||||
test.testAlicesConfirmPaymentReceived(testInfo);
|
||||
}
|
||||
|
||||
@ -89,7 +89,7 @@ public class TradeTest extends AbstractTradeTest {
|
||||
TakeSellXMROfferTest test = new TakeSellXMROfferTest();
|
||||
TakeBuyXMROfferTest.createXmrPaymentAccounts();
|
||||
test.testTakeAlicesBuyBTCForXMROffer(testInfo);
|
||||
test.testAlicesConfirmPaymentStarted(testInfo);
|
||||
test.testAlicesConfirmPaymentSent(testInfo);
|
||||
test.testBobsConfirmPaymentReceived(testInfo);
|
||||
}
|
||||
}
|
||||
|
@ -239,7 +239,7 @@ public class BotClient {
|
||||
* @param tradeId a valid trade id
|
||||
* @return boolean
|
||||
*/
|
||||
public boolean isTradePaymentStartedSent(String tradeId) {
|
||||
public boolean isTradePaymentSentSent(String tradeId) {
|
||||
return grpcClient.getTrade(tradeId).getIsPaymentSent();
|
||||
}
|
||||
|
||||
@ -266,8 +266,8 @@ public class BotClient {
|
||||
* or throws an exception.
|
||||
* @param tradeId
|
||||
*/
|
||||
public void sendConfirmPaymentStartedMessage(String tradeId) {
|
||||
grpcClient.confirmPaymentStarted(tradeId);
|
||||
public void sendConfirmPaymentSentMessage(String tradeId) {
|
||||
grpcClient.confirmPaymentSent(tradeId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -124,10 +124,10 @@ public abstract class BotProtocol {
|
||||
return trade;
|
||||
};
|
||||
|
||||
protected final Function<TradeInfo, TradeInfo> waitForPaymentStartedMessage = (trade) -> {
|
||||
initProtocolStep.accept(WAIT_FOR_PAYMENT_STARTED_MESSAGE);
|
||||
protected final Function<TradeInfo, TradeInfo> waitForPaymentSentMessage = (trade) -> {
|
||||
initProtocolStep.accept(WAIT_FOR_PAYMENT_SENT_MESSAGE);
|
||||
try {
|
||||
createPaymentStartedScript(trade);
|
||||
createPaymentSentScript(trade);
|
||||
log.info(" Waiting for a 'payment started' message from buyer for trade with id {}.", trade.getTradeId());
|
||||
while (isWithinProtocolStepTimeLimit()) {
|
||||
checkIfShutdownCalled("Interrupted before checking if 'payment started' message has been sent.");
|
||||
@ -152,10 +152,10 @@ public abstract class BotProtocol {
|
||||
}
|
||||
};
|
||||
|
||||
protected final Function<TradeInfo, TradeInfo> sendPaymentStartedMessage = (trade) -> {
|
||||
initProtocolStep.accept(SEND_PAYMENT_STARTED_MESSAGE);
|
||||
protected final Function<TradeInfo, TradeInfo> sendPaymentSentMessage = (trade) -> {
|
||||
initProtocolStep.accept(SEND_PAYMENT_SENT_MESSAGE);
|
||||
checkIfShutdownCalled("Interrupted before sending 'payment started' message.");
|
||||
this.getBotClient().sendConfirmPaymentStartedMessage(trade.getTradeId());
|
||||
this.getBotClient().sendConfirmPaymentSentMessage(trade.getTradeId());
|
||||
return trade;
|
||||
};
|
||||
|
||||
@ -222,8 +222,8 @@ public abstract class BotProtocol {
|
||||
}
|
||||
};
|
||||
|
||||
protected void createPaymentStartedScript(TradeInfo trade) {
|
||||
File script = bashScriptGenerator.createPaymentStartedScript(trade);
|
||||
protected void createPaymentSentScript(TradeInfo trade) {
|
||||
File script = bashScriptGenerator.createPaymentSentScript(trade);
|
||||
printCliHintAndOrScript(script, "The manual CLI side can send a 'payment started' message");
|
||||
}
|
||||
|
||||
|
@ -52,8 +52,8 @@ public class MakerBotProtocol extends BotProtocol {
|
||||
|
||||
var makerIsBuyer = trade.getOffer().getDirection().equalsIgnoreCase(BUY);
|
||||
Function<TradeInfo, TradeInfo> completeFiatTransaction = makerIsBuyer
|
||||
? sendPaymentStartedMessage.andThen(waitForPaymentReceivedConfirmation)
|
||||
: waitForPaymentStartedMessage.andThen(sendPaymentReceivedMessage);
|
||||
? sendPaymentSentMessage.andThen(waitForPaymentReceivedConfirmation)
|
||||
: waitForPaymentSentMessage.andThen(sendPaymentReceivedMessage);
|
||||
completeFiatTransaction.apply(trade);
|
||||
|
||||
currentProtocolStep = DONE;
|
||||
|
@ -7,8 +7,8 @@ public enum ProtocolStep {
|
||||
WAIT_FOR_OFFER_TAKER,
|
||||
WAIT_FOR_TAKER_DEPOSIT_TX_PUBLISHED,
|
||||
WAIT_FOR_TAKER_DEPOSIT_TX_CONFIRMED,
|
||||
SEND_PAYMENT_STARTED_MESSAGE,
|
||||
WAIT_FOR_PAYMENT_STARTED_MESSAGE,
|
||||
SEND_PAYMENT_SENT_MESSAGE,
|
||||
WAIT_FOR_PAYMENT_SENT_MESSAGE,
|
||||
SEND_PAYMENT_RECEIVED_CONFIRMATION_MESSAGE,
|
||||
WAIT_FOR_PAYMENT_RECEIVED_CONFIRMATION_MESSAGE,
|
||||
WAIT_FOR_PAYOUT_TX,
|
||||
|
@ -52,8 +52,8 @@ public class TakerBotProtocol extends BotProtocol {
|
||||
|
||||
var takerIsSeller = trade.getOffer().getDirection().equalsIgnoreCase(BUY);
|
||||
Function<TradeInfo, TradeInfo> completeFiatTransaction = takerIsSeller
|
||||
? waitForPaymentStartedMessage.andThen(sendPaymentReceivedMessage)
|
||||
: sendPaymentStartedMessage.andThen(waitForPaymentReceivedConfirmation);
|
||||
? waitForPaymentSentMessage.andThen(sendPaymentReceivedMessage)
|
||||
: sendPaymentSentMessage.andThen(waitForPaymentReceivedConfirmation);
|
||||
completeFiatTransaction.apply(trade);
|
||||
|
||||
currentProtocolStep = DONE;
|
||||
|
@ -140,34 +140,34 @@ public class BashScriptGenerator {
|
||||
getTradeCmd);
|
||||
}
|
||||
|
||||
public File createPaymentStartedScript(TradeInfo trade) {
|
||||
String paymentStartedCmd = format("%s confirmpaymentstarted --trade-id=%s",
|
||||
public File createPaymentSentScript(TradeInfo trade) {
|
||||
String paymentSentCmd = format("%s confirmpaymentsent --trade-id=%s",
|
||||
cliBase,
|
||||
trade.getTradeId());
|
||||
String getTradeCmd = format("%s gettrade --trade-id=%s", cliBase, trade.getTradeId());
|
||||
return createCliScript("confirmpaymentstarted.sh",
|
||||
paymentStartedCmd,
|
||||
return createCliScript("confirmpaymentsent.sh",
|
||||
paymentSentCmd,
|
||||
"sleep 2",
|
||||
getTradeCmd);
|
||||
}
|
||||
|
||||
public File createPaymentReceivedScript(TradeInfo trade) {
|
||||
String paymentStartedCmd = format("%s confirmpaymentreceived --trade-id=%s",
|
||||
String paymentSentCmd = format("%s confirmpaymentreceived --trade-id=%s",
|
||||
cliBase,
|
||||
trade.getTradeId());
|
||||
String getTradeCmd = format("%s gettrade --trade-id=%s", cliBase, trade.getTradeId());
|
||||
return createCliScript("confirmpaymentreceived.sh",
|
||||
paymentStartedCmd,
|
||||
paymentSentCmd,
|
||||
"sleep 2",
|
||||
getTradeCmd);
|
||||
}
|
||||
|
||||
public File createKeepFundsScript(TradeInfo trade) {
|
||||
String paymentStartedCmd = format("%s closetrade --trade-id=%s", cliBase, trade.getTradeId());
|
||||
String paymentSentCmd = format("%s closetrade --trade-id=%s", cliBase, trade.getTradeId());
|
||||
String getTradeCmd = format("%s gettrade --trade-id=%s", cliBase, trade.getTradeId());
|
||||
String getBalanceCmd = format("%s getbalance", cliBase);
|
||||
return createCliScript("closetrade.sh",
|
||||
paymentStartedCmd,
|
||||
paymentSentCmd,
|
||||
"sleep 2",
|
||||
getTradeCmd,
|
||||
getBalanceCmd);
|
||||
|
@ -374,14 +374,14 @@ public class CliMain {
|
||||
}
|
||||
return;
|
||||
}
|
||||
case confirmpaymentstarted: {
|
||||
case confirmpaymentsent: {
|
||||
var opts = new GetTradeOptionParser(args).parse();
|
||||
if (opts.isForHelp()) {
|
||||
out.println(client.getMethodHelp(method));
|
||||
return;
|
||||
}
|
||||
var tradeId = opts.getTradeId();
|
||||
client.confirmPaymentStarted(tradeId);
|
||||
client.confirmPaymentSent(tradeId);
|
||||
out.printf("trade %s payment started message sent%n", tradeId);
|
||||
return;
|
||||
}
|
||||
@ -700,7 +700,7 @@ public class CliMain {
|
||||
stream.println();
|
||||
stream.format(rowFormat, gettrades.name(), "[--category=<open|closed|failed>]", "Get open (default), closed, or failed trades");
|
||||
stream.println();
|
||||
stream.format(rowFormat, confirmpaymentstarted.name(), "--trade-id=<trade-id>", "Confirm payment started");
|
||||
stream.format(rowFormat, confirmpaymentsent.name(), "--trade-id=<trade-id>", "Confirm payment started");
|
||||
stream.println();
|
||||
stream.format(rowFormat, confirmpaymentreceived.name(), "--trade-id=<trade-id>", "Confirm payment received");
|
||||
stream.println();
|
||||
|
@ -211,8 +211,8 @@ public final class GrpcClient {
|
||||
return tradesServiceRequest.getTradeHistory(category);
|
||||
}
|
||||
|
||||
public void confirmPaymentStarted(String tradeId) {
|
||||
tradesServiceRequest.confirmPaymentStarted(tradeId);
|
||||
public void confirmPaymentSent(String tradeId) {
|
||||
tradesServiceRequest.confirmPaymentSent(tradeId);
|
||||
}
|
||||
|
||||
public void confirmPaymentReceived(String tradeId) {
|
||||
|
@ -24,7 +24,7 @@ public enum Method {
|
||||
canceloffer,
|
||||
closetrade,
|
||||
confirmpaymentreceived,
|
||||
confirmpaymentstarted,
|
||||
confirmpaymentsent,
|
||||
createoffer,
|
||||
editoffer,
|
||||
createpaymentacct,
|
||||
|
@ -18,7 +18,7 @@
|
||||
package bisq.cli.request;
|
||||
|
||||
import bisq.proto.grpc.ConfirmPaymentReceivedRequest;
|
||||
import bisq.proto.grpc.ConfirmPaymentStartedRequest;
|
||||
import bisq.proto.grpc.ConfirmPaymentSentRequest;
|
||||
import bisq.proto.grpc.GetTradeRequest;
|
||||
import bisq.proto.grpc.GetTradesRequest;
|
||||
import bisq.proto.grpc.TakeOfferReply;
|
||||
@ -82,12 +82,12 @@ public class TradesServiceRequest {
|
||||
return grpcStubs.tradesService.getTrades(request).getTradesList();
|
||||
}
|
||||
|
||||
public void confirmPaymentStarted(String tradeId) {
|
||||
var request = ConfirmPaymentStartedRequest.newBuilder()
|
||||
public void confirmPaymentSent(String tradeId) {
|
||||
var request = ConfirmPaymentSentRequest.newBuilder()
|
||||
.setTradeId(tradeId)
|
||||
.build();
|
||||
//noinspection ResultOfMethodCallIgnored
|
||||
grpcStubs.tradesService.confirmPaymentStarted(request);
|
||||
grpcStubs.tradesService.confirmPaymentSent(request);
|
||||
}
|
||||
|
||||
public void confirmPaymentReceived(String tradeId) {
|
||||
|
@ -94,7 +94,7 @@ abstract class AbstractTradeListBuilder extends AbstractTableBuilder {
|
||||
@Nullable
|
||||
protected final Column<String> colTradeCost;
|
||||
@Nullable
|
||||
protected final Column<Boolean> colIsPaymentStartedMessageSent;
|
||||
protected final Column<Boolean> colIsPaymentSentMessageSent;
|
||||
@Nullable
|
||||
protected final Column<Boolean> colIsPaymentReceivedMessageSent;
|
||||
@Nullable
|
||||
@ -132,7 +132,7 @@ abstract class AbstractTradeListBuilder extends AbstractTableBuilder {
|
||||
this.colIsCompleted = colSupplier.fundsWithdrawnColumn.get();
|
||||
this.colBisqTradeFee = colSupplier.bisqTradeDetailFeeColumn.get();
|
||||
this.colTradeCost = colSupplier.tradeCostColumn.get();
|
||||
this.colIsPaymentStartedMessageSent = colSupplier.paymentStartedMessageSentColumn.get();
|
||||
this.colIsPaymentSentMessageSent = colSupplier.paymentSentMessageSentColumn.get();
|
||||
this.colIsPaymentReceivedMessageSent = colSupplier.paymentReceivedMessageSentColumn.get();
|
||||
//noinspection ConstantConditions
|
||||
this.colAltcoinReceiveAddressColumn = colSupplier.altcoinReceiveAddressColumn.get();
|
||||
|
@ -68,7 +68,7 @@ class TradeDetailTableBuilder extends AbstractTradeListBuilder {
|
||||
colIsDepositPublished.addRow(trade.getIsDepositsPublished());
|
||||
colIsDepositConfirmed.addRow(trade.getIsDepositsUnlocked());
|
||||
colTradeCost.addRow(toTradeVolumeAsString.apply(trade));
|
||||
colIsPaymentStartedMessageSent.addRow(trade.getIsPaymentSent());
|
||||
colIsPaymentSentMessageSent.addRow(trade.getIsPaymentSent());
|
||||
colIsPaymentReceivedMessageSent.addRow(trade.getIsPaymentReceived());
|
||||
colIsPayoutPublished.addRow(trade.getIsPayoutPublished());
|
||||
colIsCompleted.addRow(trade.getIsCompleted());
|
||||
@ -91,7 +91,7 @@ class TradeDetailTableBuilder extends AbstractTradeListBuilder {
|
||||
add(colIsDepositPublished.asStringColumn());
|
||||
add(colIsDepositConfirmed.asStringColumn());
|
||||
add(colTradeCost.justify());
|
||||
add(colIsPaymentStartedMessageSent.asStringColumn());
|
||||
add(colIsPaymentSentMessageSent.asStringColumn());
|
||||
add(colIsPaymentReceivedMessageSent.asStringColumn());
|
||||
add(colIsPayoutPublished.asStringColumn());
|
||||
add(colIsCompleted.asStringColumn());
|
||||
|
@ -204,7 +204,7 @@ class TradeTableColumnSupplier {
|
||||
? t.getOffer().getCounterCurrencyCode()
|
||||
: t.getOffer().getBaseCurrencyCode();
|
||||
|
||||
final Supplier<Column<Boolean>> paymentStartedMessageSentColumn = () -> {
|
||||
final Supplier<Column<Boolean>> paymentSentMessageSentColumn = () -> {
|
||||
if (isTradeDetailTblBuilder.get()) {
|
||||
String headerCurrencyCode = toPaymentCurrencyCode.apply(firstRow.get());
|
||||
String colHeader = format(COL_HEADER_TRADE_PAYMENT_SENT, headerCurrencyCode);
|
||||
|
@ -34,7 +34,7 @@ import bisq.core.support.dispute.DisputeResult;
|
||||
import bisq.core.support.dispute.arbitration.TraderDataItem;
|
||||
import bisq.core.trade.ArbitratorTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.core.user.User;
|
||||
|
||||
import bisq.network.p2p.BootstrapListener;
|
||||
@ -308,12 +308,12 @@ public class AccountAgeWitnessService {
|
||||
|
||||
private Optional<AccountAgeWitness> findTradePeerWitness(Trade trade) {
|
||||
if (trade instanceof ArbitratorTrade) return Optional.empty(); // TODO (woodser): arbitrator trade has two peers
|
||||
TradingPeer tradingPeer = trade.getTradingPeer();
|
||||
return (tradingPeer == null ||
|
||||
tradingPeer.getPaymentAccountPayload() == null ||
|
||||
tradingPeer.getPubKeyRing() == null) ?
|
||||
TradePeer tradePeer = trade.getTradePeer();
|
||||
return (tradePeer == null ||
|
||||
tradePeer.getPaymentAccountPayload() == null ||
|
||||
tradePeer.getPubKeyRing() == null) ?
|
||||
Optional.empty() :
|
||||
findWitness(tradingPeer.getPaymentAccountPayload(), tradingPeer.getPubKeyRing());
|
||||
findWitness(tradePeer.getPaymentAccountPayload(), tradePeer.getPubKeyRing());
|
||||
}
|
||||
|
||||
private Optional<AccountAgeWitness> getWitnessByHash(byte[] hash) {
|
||||
@ -732,8 +732,8 @@ public class AccountAgeWitnessService {
|
||||
public Optional<SignedWitness> traderSignAndPublishPeersAccountAgeWitness(Trade trade) {
|
||||
AccountAgeWitness peersWitness = findTradePeerWitness(trade).orElse(null);
|
||||
Coin tradeAmount = trade.getAmount();
|
||||
checkNotNull(trade.getTradingPeer().getPubKeyRing(), "Peer must have a keyring");
|
||||
PublicKey peersPubKey = trade.getTradingPeer().getPubKeyRing().getSignaturePubKey();
|
||||
checkNotNull(trade.getTradePeer().getPubKeyRing(), "Peer must have a keyring");
|
||||
PublicKey peersPubKey = trade.getTradePeer().getPubKeyRing().getSignaturePubKey();
|
||||
checkNotNull(peersWitness, "Not able to find peers witness, unable to sign for trade {}",
|
||||
trade.toString());
|
||||
checkNotNull(tradeAmount, "Trade amount must not be null");
|
||||
|
@ -541,10 +541,10 @@ public class CoreApi {
|
||||
coreTradesService.takeOffer(offer, paymentAccountId, resultHandler, errorMessageHandler);
|
||||
}
|
||||
|
||||
public void confirmPaymentStarted(String tradeId,
|
||||
public void confirmPaymentSent(String tradeId,
|
||||
ResultHandler resultHandler,
|
||||
ErrorMessageHandler errorMessageHandler) {
|
||||
coreTradesService.confirmPaymentStarted(tradeId, resultHandler, errorMessageHandler);
|
||||
coreTradesService.confirmPaymentSent(tradeId, resultHandler, errorMessageHandler);
|
||||
}
|
||||
|
||||
public void confirmPaymentReceived(String tradeId,
|
||||
|
@ -151,7 +151,7 @@ public class CoreDisputesService {
|
||||
Trade trade = tradeManager.getTrade(tradeId);
|
||||
var winningDisputeOptional = arbitrationManager.getDisputesAsObservableList().stream() // TODO (woodser): use getDispute()
|
||||
.filter(d -> tradeId.equals(d.getTradeId()))
|
||||
.filter(d -> trade.getTradingPeer(d.getTraderPubKeyRing()) == (winner == DisputeResult.Winner.BUYER ? trade.getBuyer() : trade.getSeller()))
|
||||
.filter(d -> trade.getTradePeer(d.getTraderPubKeyRing()) == (winner == DisputeResult.Winner.BUYER ? trade.getBuyer() : trade.getSeller()))
|
||||
.findFirst();
|
||||
if (winningDisputeOptional.isPresent()) winningDispute = winningDisputeOptional.get();
|
||||
else throw new IllegalStateException(format("dispute for tradeId '%s' not found", tradeId));
|
||||
|
@ -129,13 +129,13 @@ class CoreTradesService {
|
||||
}
|
||||
}
|
||||
|
||||
void confirmPaymentStarted(String tradeId,
|
||||
void confirmPaymentSent(String tradeId,
|
||||
ResultHandler resultHandler,
|
||||
ErrorMessageHandler errorMessageHandler) {
|
||||
var trade = getTrade(tradeId);
|
||||
if (isFollowingBuyerProtocol(trade)) {
|
||||
var tradeProtocol = tradeManager.getTradeProtocol(trade);
|
||||
((BuyerProtocol) tradeProtocol).onPaymentStarted(resultHandler, errorMessageHandler);
|
||||
((BuyerProtocol) tradeProtocol).onPaymentSent(resultHandler, errorMessageHandler);
|
||||
} else {
|
||||
throw new IllegalStateException("you are the seller and not sending payment");
|
||||
}
|
||||
|
@ -41,9 +41,9 @@ public class TradeInfo implements Payload {
|
||||
// view and interact with trades.
|
||||
|
||||
private static final Function<Trade, String> toPeerNodeAddress = (trade) ->
|
||||
trade.getTradingPeerNodeAddress() == null
|
||||
trade.getTradePeerNodeAddress() == null
|
||||
? ""
|
||||
: trade.getTradingPeerNodeAddress().getFullAddress();
|
||||
: trade.getTradePeerNodeAddress().getFullAddress();
|
||||
|
||||
private static final Function<Trade, String> toArbitratorNodeAddress = (trade) ->
|
||||
trade.getArbitratorNodeAddress() == null
|
||||
@ -76,7 +76,7 @@ public class TradeInfo implements Payload {
|
||||
private final String price;
|
||||
private final String volume;
|
||||
private final String arbitratorNodeAddress;
|
||||
private final String tradingPeerNodeAddress;
|
||||
private final String tradePeerNodeAddress;
|
||||
private final String state;
|
||||
private final String phase;
|
||||
private final String periodState;
|
||||
@ -111,7 +111,7 @@ public class TradeInfo implements Payload {
|
||||
this.price = builder.getPrice();
|
||||
this.volume = builder.getVolume();
|
||||
this.arbitratorNodeAddress = builder.getArbitratorNodeAddress();
|
||||
this.tradingPeerNodeAddress = builder.getTradingPeerNodeAddress();
|
||||
this.tradePeerNodeAddress = builder.getTradePeerNodeAddress();
|
||||
this.state = builder.getState();
|
||||
this.phase = builder.getPhase();
|
||||
this.periodState = builder.getPeriodState();
|
||||
@ -169,7 +169,7 @@ public class TradeInfo implements Payload {
|
||||
.withPrice(toPreciseTradePrice.apply(trade))
|
||||
.withVolume(toRoundedVolume.apply(trade))
|
||||
.withArbitratorNodeAddress(toArbitratorNodeAddress.apply(trade))
|
||||
.withTradingPeerNodeAddress(toPeerNodeAddress.apply(trade))
|
||||
.withTradePeerNodeAddress(toPeerNodeAddress.apply(trade))
|
||||
.withState(trade.getState().name())
|
||||
.withPhase(trade.getPhase().name())
|
||||
.withPeriodState(trade.getPeriodState().name())
|
||||
@ -213,7 +213,7 @@ public class TradeInfo implements Payload {
|
||||
.setPrice(price)
|
||||
.setTradeVolume(volume)
|
||||
.setArbitratorNodeAddress(arbitratorNodeAddress)
|
||||
.setTradingPeerNodeAddress(tradingPeerNodeAddress)
|
||||
.setTradePeerNodeAddress(tradePeerNodeAddress)
|
||||
.setState(state)
|
||||
.setPhase(phase)
|
||||
.setPeriodState(periodState)
|
||||
@ -256,7 +256,7 @@ public class TradeInfo implements Payload {
|
||||
.withState(proto.getState())
|
||||
.withPhase(proto.getPhase())
|
||||
.withArbitratorNodeAddress(proto.getArbitratorNodeAddress())
|
||||
.withTradingPeerNodeAddress(proto.getTradingPeerNodeAddress())
|
||||
.withTradePeerNodeAddress(proto.getTradePeerNodeAddress())
|
||||
.withIsDepositsPublished(proto.getIsDepositsPublished())
|
||||
.withIsDepositsConfirmed(proto.getIsDepositsConfirmed())
|
||||
.withIsDepositsUnlocked(proto.getIsDepositsUnlocked())
|
||||
@ -288,7 +288,7 @@ public class TradeInfo implements Payload {
|
||||
", sellerSecurityDeposit='" + sellerSecurityDeposit + '\'' + "\n" +
|
||||
", price='" + price + '\'' + "\n" +
|
||||
", arbitratorNodeAddress='" + arbitratorNodeAddress + '\'' + "\n" +
|
||||
", tradingPeerNodeAddress='" + tradingPeerNodeAddress + '\'' + "\n" +
|
||||
", tradePeerNodeAddress='" + tradePeerNodeAddress + '\'' + "\n" +
|
||||
", state='" + state + '\'' + "\n" +
|
||||
", phase='" + phase + '\'' + "\n" +
|
||||
", periodState='" + periodState + '\'' + "\n" +
|
||||
|
@ -49,7 +49,7 @@ public final class TradeInfoV1Builder {
|
||||
private String price;
|
||||
private String volume;
|
||||
private String arbitratorNodeAddress;
|
||||
private String tradingPeerNodeAddress;
|
||||
private String tradePeerNodeAddress;
|
||||
private String state;
|
||||
private String phase;
|
||||
private String periodState;
|
||||
@ -178,8 +178,8 @@ public final class TradeInfoV1Builder {
|
||||
return this;
|
||||
}
|
||||
|
||||
public TradeInfoV1Builder withTradingPeerNodeAddress(String tradingPeerNodeAddress) {
|
||||
this.tradingPeerNodeAddress = tradingPeerNodeAddress;
|
||||
public TradeInfoV1Builder withTradePeerNodeAddress(String tradePeerNodeAddress) {
|
||||
this.tradePeerNodeAddress = tradePeerNodeAddress;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -19,7 +19,6 @@ package bisq.core.app;
|
||||
|
||||
import bisq.core.api.AccountServiceListener;
|
||||
import bisq.core.api.CoreAccountService;
|
||||
import bisq.core.api.CoreMoneroConnectionsService;
|
||||
import bisq.core.btc.setup.WalletsSetup;
|
||||
import bisq.core.btc.wallet.BtcWalletService;
|
||||
import bisq.core.btc.wallet.XmrWalletService;
|
||||
@ -317,11 +316,11 @@ public abstract class HavenoExecutable implements GracefulShutDownHandler, Haven
|
||||
injector.getInstance(XmrTxProofService.class).shutDown();
|
||||
injector.getInstance(AvoidStandbyModeService.class).shutDown();
|
||||
injector.getInstance(TradeManager.class).shutDown();
|
||||
injector.getInstance(XmrWalletService.class).shutDown(!isReadOnly); // TODO: why not shut down BtcWalletService, etc? shutdown CoreMoneroConnectionsService
|
||||
log.info("OpenOfferManager shutdown started");
|
||||
injector.getInstance(OpenOfferManager.class).shutDown(() -> {
|
||||
log.info("OpenOfferManager shutdown completed");
|
||||
|
||||
injector.getInstance(XmrWalletService.class).shutDown(!isReadOnly);
|
||||
injector.getInstance(BtcWalletService.class).shutDown();
|
||||
|
||||
// We need to shutdown BitcoinJ before the P2PService as it uses Tor.
|
||||
|
@ -97,7 +97,7 @@ public abstract class ExecutableForAppWithP2p extends HavenoExecutable {
|
||||
});
|
||||
});
|
||||
injector.getInstance(WalletsSetup.class).shutDown();
|
||||
injector.getInstance(XmrWalletService.class).shutDown(true); // TODO (woodser): this is not actually called, perhaps because WalletsSetup.class completes too quick so its listener calls System.exit(0)
|
||||
injector.getInstance(XmrWalletService.class).shutDown(true);
|
||||
injector.getInstance(BtcWalletService.class).shutDown();
|
||||
}));
|
||||
// we wait max 5 sec.
|
||||
|
@ -196,7 +196,7 @@ public abstract class SupportManager {
|
||||
for (Dispute dispute : trade.getDisputes()) {
|
||||
for (ChatMessage chatMessage : dispute.getChatMessages()) {
|
||||
if (chatMessage.getUid().equals(ackMessage.getSourceUid())) {
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.DISPUTE_OPENED);
|
||||
trade.advanceDisputeState(Trade.DisputeState.DISPUTE_OPENED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -451,9 +451,9 @@ public final class Dispute implements NetworkPayload, PersistablePayload {
|
||||
public String getRoleString() {
|
||||
if (disputeOpenerIsMaker) {
|
||||
if (disputeOpenerIsBuyer)
|
||||
return Res.get("support.buyerOfferer");
|
||||
return Res.get("support.buyerMaker");
|
||||
else
|
||||
return Res.get("support.sellerOfferer");
|
||||
return Res.get("support.sellerMaker");
|
||||
} else {
|
||||
if (disputeOpenerIsBuyer)
|
||||
return Res.get("support.buyerTaker");
|
||||
|
@ -42,7 +42,7 @@ import bisq.core.trade.HavenoUtils;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.TradeDataValidation;
|
||||
import bisq.core.trade.TradeManager;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.network.p2p.BootstrapListener;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
import bisq.network.p2p.P2PService;
|
||||
@ -387,7 +387,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
||||
// We use the chatMessage wrapped inside the openNewDisputeMessage for
|
||||
// the state, as that is displayed to the user and we only persist that msg
|
||||
chatMessage.setArrived(true);
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.DISPUTE_REQUESTED);
|
||||
trade.advanceDisputeState(Trade.DisputeState.DISPUTE_REQUESTED);
|
||||
requestPersistence();
|
||||
resultHandler.handleResult();
|
||||
}
|
||||
@ -403,7 +403,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
||||
// We use the chatMessage wrapped inside the openNewDisputeMessage for
|
||||
// the state, as that is displayed to the user and we only persist that msg
|
||||
chatMessage.setStoredInMailbox(true);
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.DISPUTE_REQUESTED);
|
||||
trade.advanceDisputeState(Trade.DisputeState.DISPUTE_REQUESTED);
|
||||
requestPersistence();
|
||||
resultHandler.handleResult();
|
||||
}
|
||||
@ -478,7 +478,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
||||
|
||||
// get sender
|
||||
senderPubKeyRing = trade.isArbitrator() ? (dispute.isDisputeOpenerIsBuyer() ? contract.getBuyerPubKeyRing() : contract.getSellerPubKeyRing()) : trade.getArbitrator().getPubKeyRing();
|
||||
TradingPeer sender = trade.getTradingPeer(senderPubKeyRing);
|
||||
TradePeer sender = trade.getTradePeer(senderPubKeyRing);
|
||||
if (sender == null) throw new RuntimeException("Pub key ring is not from arbitrator, buyer, or seller");
|
||||
|
||||
// message to trader is expected from arbitrator
|
||||
@ -490,7 +490,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
||||
if (trade.isArbitrator() && message.getPaymentSentMessage() != null) {
|
||||
HavenoUtils.verifyPaymentSentMessage(trade, message.getPaymentSentMessage());
|
||||
trade.getBuyer().setUpdatedMultisigHex(message.getPaymentSentMessage().getUpdatedMultisigHex());
|
||||
trade.setStateIfProgress(sender == trade.getBuyer() ? Trade.State.BUYER_SENT_PAYMENT_SENT_MSG : Trade.State.SELLER_RECEIVED_PAYMENT_SENT_MSG);
|
||||
trade.advanceState(sender == trade.getBuyer() ? Trade.State.BUYER_SENT_PAYMENT_SENT_MSG : Trade.State.SELLER_RECEIVED_PAYMENT_SENT_MSG);
|
||||
}
|
||||
|
||||
// update multisig hex
|
||||
@ -509,7 +509,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
||||
Optional<Dispute> storedDisputeOptional = findDispute(dispute);
|
||||
if (!storedDisputeOptional.isPresent()) {
|
||||
disputeList.add(dispute);
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.DISPUTE_OPENED);
|
||||
trade.advanceDisputeState(Trade.DisputeState.DISPUTE_OPENED);
|
||||
|
||||
// send dispute opened message to peer if arbitrator
|
||||
if (trade.isArbitrator()) sendDisputeOpenedMessageToPeer(dispute, contract, dispute.isDisputeOpenerIsBuyer() ? contract.getSellerPubKeyRing() : contract.getBuyerPubKeyRing(), trade.getSelf().getUpdatedMultisigHex());
|
||||
@ -724,9 +724,9 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
||||
}
|
||||
|
||||
// create dispute closed message
|
||||
TradingPeer receiver = trade.getTradingPeer(dispute.getTraderPubKeyRing());
|
||||
TradePeer receiver = trade.getTradePeer(dispute.getTraderPubKeyRing());
|
||||
String unsignedPayoutTxHex = payoutTx == null ? null : payoutTx.getTxSet().getMultisigTxHex();
|
||||
TradingPeer receiverPeer = receiver == trade.getBuyer() ? trade.getSeller() : trade.getBuyer();
|
||||
TradePeer receiverPeer = receiver == trade.getBuyer() ? trade.getSeller() : trade.getBuyer();
|
||||
boolean deferPublishPayout = !resending && unsignedPayoutTxHex != null && receiverPeer.getUpdatedMultisigHex() != null && trade.getDisputeState().ordinal() >= Trade.DisputeState.ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG.ordinal() ;
|
||||
DisputeClosedMessage disputeClosedMessage = new DisputeClosedMessage(disputeResult,
|
||||
p2PService.getAddress(),
|
||||
@ -756,7 +756,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
||||
// We use the chatMessage wrapped inside the DisputeClosedMessage for
|
||||
// the state, as that is displayed to the user and we only persist that msg
|
||||
disputeResult.getChatMessage().setArrived(true);
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG);
|
||||
trade.advanceDisputeState(Trade.DisputeState.ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG);
|
||||
trade.syncWalletNormallyForMs(30000);
|
||||
requestPersistence();
|
||||
resultHandler.handleResult();
|
||||
@ -774,7 +774,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
||||
// the state, as that is displayed to the user and we only persist that msg
|
||||
disputeResult.getChatMessage().setStoredInMailbox(true);
|
||||
Trade trade = tradeManager.getTrade(dispute.getTradeId());
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG);
|
||||
trade.advanceDisputeState(Trade.DisputeState.ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG);
|
||||
requestPersistence();
|
||||
resultHandler.handleResult();
|
||||
}
|
||||
@ -790,7 +790,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
||||
// We use the chatMessage wrapped inside the DisputeClosedMessage for
|
||||
// the state, as that is displayed to the user and we only persist that msg
|
||||
disputeResult.getChatMessage().setSendMessageError(errorMessage);
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG);
|
||||
trade.advanceDisputeState(Trade.DisputeState.ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG);
|
||||
requestPersistence();
|
||||
faultHandler.handleFault(errorMessage, new RuntimeException(errorMessage));
|
||||
}
|
||||
@ -802,7 +802,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
||||
trade.setPayoutTx(payoutTx);
|
||||
trade.setPayoutTxHex(payoutTx.getTxSet().getMultisigTxHex());
|
||||
}
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.ARBITRATOR_SENT_DISPUTE_CLOSED_MSG);
|
||||
trade.advanceDisputeState(Trade.DisputeState.ARBITRATOR_SENT_DISPUTE_CLOSED_MSG);
|
||||
requestPersistence();
|
||||
} catch (Exception e) {
|
||||
faultHandler.handleFault(e.getMessage(), e);
|
||||
@ -820,7 +820,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
||||
trade.saveWallet();
|
||||
|
||||
// create unsigned dispute payout tx if not already published and arbitrator has trader's updated multisig info
|
||||
TradingPeer receiver = trade.getTradingPeer(dispute.getTraderPubKeyRing());
|
||||
TradePeer receiver = trade.getTradePeer(dispute.getTraderPubKeyRing());
|
||||
if (!trade.isPayoutPublished() && receiver.getUpdatedMultisigHex() != null) {
|
||||
MoneroWallet multisigWallet = trade.getWallet();
|
||||
|
||||
|
@ -260,7 +260,7 @@ public final class ArbitrationManager extends DisputeManager<ArbitrationDisputeL
|
||||
|
||||
// import multisig hex
|
||||
List<String> updatedMultisigHexes = new ArrayList<String>();
|
||||
if (trade.getTradingPeer().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getTradingPeer().getUpdatedMultisigHex());
|
||||
if (trade.getTradePeer().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getTradePeer().getUpdatedMultisigHex());
|
||||
if (trade.getArbitrator().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getArbitrator().getUpdatedMultisigHex());
|
||||
if (!updatedMultisigHexes.isEmpty()) trade.getWallet().importMultisigHex(updatedMultisigHexes.toArray(new String[0])); // TODO (monero-project): fails if multisig hex imported individually
|
||||
|
||||
@ -315,7 +315,7 @@ public final class ArbitrationManager extends DisputeManager<ArbitrationDisputeL
|
||||
throw e;
|
||||
}
|
||||
|
||||
// reprocess on error
|
||||
// schedule to reprocess message unless deleted
|
||||
if (trade.getProcessModel().getDisputeClosedMessage() != null) {
|
||||
if (!reprocessDisputeClosedMessageCounts.containsKey(trade.getId())) reprocessDisputeClosedMessageCounts.put(trade.getId(), 0);
|
||||
UserThread.runAfter(() -> {
|
||||
|
@ -240,7 +240,7 @@ public final class MediationManager extends DisputeManager<MediationDisputeList>
|
||||
|
||||
// If we have not got yet the peers signature we sign and send to the peer our signature.
|
||||
// Otherwise we sign and complete with the peers signature the payout tx.
|
||||
if (trade.getTradingPeer().getMediatedPayoutTxSignature() == null) {
|
||||
if (trade.getTradePeer().getMediatedPayoutTxSignature() == null) {
|
||||
tradeProtocol.onAcceptMediationResult(() -> {
|
||||
if (trade.getPayoutTx() != null) {
|
||||
tradeManager.closeDisputedTrade(tradeId, Trade.DisputeState.MEDIATION_CLOSED);
|
||||
|
@ -63,6 +63,6 @@ public abstract class BuyerTrade extends Trade {
|
||||
|
||||
@Override
|
||||
public boolean confirmPermitted() {
|
||||
return !getDisputeState().isArbitrated();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -122,7 +122,7 @@ public class CleanupMailboxMessages {
|
||||
private boolean isPubKeyValid(DecryptedMessageWithPubKey decryptedMessageWithPubKey, Trade trade) {
|
||||
// We can only validate the peers pubKey if we have it already. If we are the taker we get it from the offer
|
||||
// Otherwise it depends on the state of the trade protocol if we have received the peers pubKeyRing already.
|
||||
PubKeyRing peersPubKeyRing = trade.getTradingPeer().getPubKeyRing();
|
||||
PubKeyRing peersPubKeyRing = trade.getTradePeer().getPubKeyRing();
|
||||
boolean isValid = true;
|
||||
if (peersPubKeyRing != null &&
|
||||
!decryptedMessageWithPubKey.getSignaturePubKey().equals(peersPubKeyRing.getSignaturePubKey())) {
|
||||
|
@ -122,7 +122,7 @@ public class CleanupMailboxMessagesService {
|
||||
private boolean isPubKeyValid(DecryptedMessageWithPubKey decryptedMessageWithPubKey, Trade trade) {
|
||||
// We can only validate the peers pubKey if we have it already. If we are the taker we get it from the offer
|
||||
// Otherwise it depends on the state of the trade protocol if we have received the peers pubKeyRing already.
|
||||
PubKeyRing peersPubKeyRing = trade.getTradingPeer().getPubKeyRing();
|
||||
PubKeyRing peersPubKeyRing = trade.getTradePeer().getPubKeyRing();
|
||||
boolean isValid = true;
|
||||
if (peersPubKeyRing != null &&
|
||||
!decryptedMessageWithPubKey.getSignaturePubKey().equals(peersPubKeyRing.getSignaturePubKey())) {
|
||||
|
@ -191,9 +191,9 @@ public class ClosedTradableManager implements PersistedDataHost {
|
||||
if (isOpenOffer(tradable)) {
|
||||
return 0;
|
||||
}
|
||||
NodeAddress addressInTrade = castToTradeModel(tradable).getTradingPeerNodeAddress();
|
||||
NodeAddress addressInTrade = castToTradeModel(tradable).getTradePeerNodeAddress();
|
||||
return (int) getTradeModelStream()
|
||||
.map(Trade::getTradingPeerNodeAddress)
|
||||
.map(Trade::getTradePeerNodeAddress)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(address -> address.equals(addressInTrade))
|
||||
.count();
|
||||
|
@ -195,7 +195,7 @@ public class HavenoUtils {
|
||||
* @return a unique deterministic id for sending a trade mailbox message
|
||||
*/
|
||||
public static String getDeterministicId(Trade trade, Class<?> tradeMessageClass, NodeAddress receiver) {
|
||||
String uniqueId = trade.getId() + "_" + tradeMessageClass.getSimpleName() + "_" + trade.getRole() + "_to_" + trade.getPeerRole(trade.getTradingPeer(receiver));
|
||||
String uniqueId = trade.getId() + "_" + tradeMessageClass.getSimpleName() + "_" + trade.getRole() + "_to_" + trade.getPeerRole(trade.getTradePeer(receiver));
|
||||
return Utilities.bytesAsHexString(Hash.getSha256Ripemd160hash(uniqueId.getBytes(Charsets.UTF_8)));
|
||||
}
|
||||
|
||||
|
@ -63,35 +63,7 @@ public abstract class SellerTrade extends Trade {
|
||||
|
||||
@Override
|
||||
public boolean confirmPermitted() {
|
||||
// For altcoin there is no reason to delay BTC release as no chargeback risk
|
||||
if (CurrencyUtil.isCryptoCurrency(getOffer().getCurrencyCode())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (getDisputeState()) {
|
||||
case NO_DISPUTE:
|
||||
return true;
|
||||
|
||||
case DISPUTE_REQUESTED:
|
||||
case DISPUTE_OPENED:
|
||||
case ARBITRATOR_SENT_DISPUTE_CLOSED_MSG:
|
||||
case ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG:
|
||||
case ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG:
|
||||
case ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG:
|
||||
case DISPUTE_CLOSED:
|
||||
case MEDIATION_REQUESTED:
|
||||
case MEDIATION_STARTED_BY_PEER:
|
||||
return false;
|
||||
|
||||
case MEDIATION_CLOSED:
|
||||
return !mediationResultAppliedPenaltyToSeller();
|
||||
|
||||
case REFUND_REQUESTED:
|
||||
case REFUND_REQUEST_STARTED_BY_PEER:
|
||||
case REFUND_REQUEST_CLOSED:
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ public interface Tradable extends PersistablePayload {
|
||||
return asTradeModel().map(Trade::getOffer).map(Offer::getMakerFee).or(() -> Optional.ofNullable(getOffer().getMakerFee()));
|
||||
}
|
||||
|
||||
default Optional<NodeAddress> getOptionalTradingPeerNodeAddress() {
|
||||
return asTradeModel().map(Trade::getTradingPeerNodeAddress);
|
||||
default Optional<NodeAddress> getOptionalTradePeerNodeAddress() {
|
||||
return asTradeModel().map(Trade::getTradePeerNodeAddress);
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ import bisq.core.trade.protocol.ProcessModel;
|
||||
import bisq.core.trade.protocol.ProcessModelServiceProvider;
|
||||
import bisq.core.trade.protocol.TradeListener;
|
||||
import bisq.core.trade.protocol.TradeProtocol;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.core.trade.txproof.AssetTxProofResult;
|
||||
import bisq.core.util.VolumeUtil;
|
||||
import bisq.network.p2p.AckMessage;
|
||||
@ -672,8 +672,8 @@ public abstract class Trade implements Tradable, Model {
|
||||
getSelf().setNodeAddress(P2PService.getMyNodeAddress());
|
||||
}
|
||||
|
||||
public NodeAddress getTradingPeerNodeAddress() {
|
||||
return getTradingPeer() == null ? null : getTradingPeer().getNodeAddress();
|
||||
public NodeAddress getTradePeerNodeAddress() {
|
||||
return getTradePeer() == null ? null : getTradePeer().getNodeAddress();
|
||||
}
|
||||
|
||||
public NodeAddress getArbitratorNodeAddress() {
|
||||
@ -883,9 +883,9 @@ public abstract class Trade implements Tradable, Model {
|
||||
try {
|
||||
|
||||
// decrypt payment account payload
|
||||
getTradingPeer().setPaymentAccountKey(paymentAccountKey);
|
||||
SecretKey sk = Encryption.getSecretKeyFromBytes(getTradingPeer().getPaymentAccountKey());
|
||||
byte[] decryptedPaymentAccountPayload = Encryption.decrypt(getTradingPeer().getEncryptedPaymentAccountPayload(), sk);
|
||||
getTradePeer().setPaymentAccountKey(paymentAccountKey);
|
||||
SecretKey sk = Encryption.getSecretKeyFromBytes(getTradePeer().getPaymentAccountKey());
|
||||
byte[] decryptedPaymentAccountPayload = Encryption.decrypt(getTradePeer().getEncryptedPaymentAccountPayload(), sk);
|
||||
CoreNetworkProtoResolver resolver = new CoreNetworkProtoResolver(Clock.systemDefaultZone()); // TODO: reuse resolver from elsewhere?
|
||||
PaymentAccountPayload paymentAccountPayload = resolver.fromProto(protobuf.PaymentAccountPayload.parseFrom(decryptedPaymentAccountPayload));
|
||||
|
||||
@ -894,7 +894,7 @@ public abstract class Trade implements Tradable, Model {
|
||||
if (!Arrays.equals(paymentAccountPayload.getHash(), peerPaymentAccountPayloadHash)) throw new RuntimeException("Hash of peer's payment account payload does not match contract");
|
||||
|
||||
// set payment account payload
|
||||
getTradingPeer().setPaymentAccountPayload(paymentAccountPayload);
|
||||
getTradePeer().setPaymentAccountPayload(paymentAccountPayload);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
@ -977,7 +977,7 @@ public abstract class Trade implements Tradable, Model {
|
||||
try {
|
||||
syncWallet();
|
||||
} catch (Exception e) {
|
||||
log.warn("Error syncing wallet for {} {}: {}", getClass().getSimpleName(), getId(), e.getMessage());
|
||||
if (isInitialized) log.warn("Error syncing wallet for {} {}: {}", getClass().getSimpleName(), getId(), e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1074,7 +1074,7 @@ public abstract class Trade implements Tradable, Model {
|
||||
});
|
||||
}
|
||||
|
||||
public void setStateIfProgress(State state) {
|
||||
public void advanceState(State state) {
|
||||
if (state.ordinal() > getState().ordinal()) setState(state);
|
||||
}
|
||||
|
||||
@ -1121,7 +1121,7 @@ public abstract class Trade implements Tradable, Model {
|
||||
});
|
||||
}
|
||||
|
||||
public void setDisputeStateIfProgress(DisputeState disputeState) {
|
||||
public void advanceDisputeState(DisputeState disputeState) {
|
||||
if (disputeState.ordinal() > getDisputeState().ordinal()) setDisputeState(disputeState);
|
||||
}
|
||||
|
||||
@ -1193,35 +1193,35 @@ public abstract class Trade implements Tradable, Model {
|
||||
return this instanceof TakerTrade;
|
||||
}
|
||||
|
||||
public TradingPeer getSelf() {
|
||||
public TradePeer getSelf() {
|
||||
if (this instanceof MakerTrade) return processModel.getMaker();
|
||||
if (this instanceof TakerTrade) return processModel.getTaker();
|
||||
if (this instanceof ArbitratorTrade) return processModel.getArbitrator();
|
||||
throw new RuntimeException("Trade is not maker, taker, or arbitrator");
|
||||
}
|
||||
|
||||
public TradingPeer getArbitrator() {
|
||||
public TradePeer getArbitrator() {
|
||||
return processModel.getArbitrator();
|
||||
}
|
||||
|
||||
public TradingPeer getMaker() {
|
||||
public TradePeer getMaker() {
|
||||
return processModel.getMaker();
|
||||
}
|
||||
|
||||
public TradingPeer getTaker() {
|
||||
public TradePeer getTaker() {
|
||||
return processModel.getTaker();
|
||||
}
|
||||
|
||||
public TradingPeer getBuyer() {
|
||||
public TradePeer getBuyer() {
|
||||
return offer.getDirection() == OfferDirection.BUY ? processModel.getMaker() : processModel.getTaker();
|
||||
}
|
||||
|
||||
public TradingPeer getSeller() {
|
||||
public TradePeer getSeller() {
|
||||
return offer.getDirection() == OfferDirection.BUY ? processModel.getTaker() : processModel.getMaker();
|
||||
}
|
||||
|
||||
// get the taker if maker, maker if taker, null if arbitrator
|
||||
public TradingPeer getTradingPeer() {
|
||||
public TradePeer getTradePeer() {
|
||||
if (this instanceof MakerTrade) return processModel.getTaker();
|
||||
else if (this instanceof TakerTrade) return processModel.getMaker();
|
||||
else if (this instanceof ArbitratorTrade) return null;
|
||||
@ -1229,14 +1229,14 @@ public abstract class Trade implements Tradable, Model {
|
||||
}
|
||||
|
||||
// TODO (woodser): this naming convention is confusing
|
||||
public TradingPeer getTradingPeer(NodeAddress address) {
|
||||
public TradePeer getTradePeer(NodeAddress address) {
|
||||
if (address.equals(getMaker().getNodeAddress())) return processModel.getMaker();
|
||||
if (address.equals(getTaker().getNodeAddress())) return processModel.getTaker();
|
||||
if (address.equals(getArbitrator().getNodeAddress())) return processModel.getArbitrator();
|
||||
return null;
|
||||
}
|
||||
|
||||
public TradingPeer getTradingPeer(PubKeyRing pubKeyRing) {
|
||||
public TradePeer getTradePeer(PubKeyRing pubKeyRing) {
|
||||
if (getMaker() != null && getMaker().getPubKeyRing().equals(pubKeyRing)) return getMaker();
|
||||
if (getTaker() != null && getTaker().getPubKeyRing().equals(pubKeyRing)) return getTaker();
|
||||
if (getArbitrator() != null && getArbitrator().getPubKeyRing().equals(pubKeyRing)) return getArbitrator();
|
||||
@ -1250,7 +1250,7 @@ public abstract class Trade implements Tradable, Model {
|
||||
throw new IllegalArgumentException("Trade is not buyer, seller, or arbitrator");
|
||||
}
|
||||
|
||||
public String getPeerRole(TradingPeer peer) {
|
||||
public String getPeerRole(TradePeer peer) {
|
||||
if (peer == getBuyer()) return "Buyer";
|
||||
if (peer == getSeller()) return "Seller";
|
||||
if (peer == getArbitrator()) return "Arbitrator";
|
||||
@ -1637,7 +1637,7 @@ public abstract class Trade implements Tradable, Model {
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (isInitialized && getWallet() != null) log.warn("Error polling trade wallet {}: {}", getId(), e.getMessage()); // TODO (monero-java): poller.isPolling() and then don't need to use isInitialized here as shutdown flag
|
||||
if (isInitialized && getWallet() != null && isWalletConnected()) log.warn("Error polling trade wallet {}: {}", getId(), e.getMessage()); // TODO (monero-java): poller.isPolling() and then don't need to use isInitialized here as shutdown flag
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -343,28 +343,6 @@ public class TradeDataValidation {
|
||||
}
|
||||
}
|
||||
|
||||
public static void validateDepositInputs(Trade trade) throws InvalidTxException {
|
||||
throw new RuntimeException("TradeDataValidation.validateDepositInputs() needs updated for XMR");
|
||||
// // assumption: deposit tx always has 2 inputs, the maker and taker
|
||||
// if (trade == null || trade.getDepositTx() == null || trade.getDepositTx().getInputs().size() != 2) {
|
||||
// throw new InvalidTxException("Deposit transaction is null or has unexpected input count");
|
||||
// }
|
||||
// Transaction depositTx = trade.getDepositTx();
|
||||
// String txIdInput0 = depositTx.getInput(0).getOutpoint().getHash().toString();
|
||||
// String txIdInput1 = depositTx.getInput(1).getOutpoint().getHash().toString();
|
||||
// String contractMakerTxId = trade.getContract().getOfferPayload().getOfferFeePaymentTxId();
|
||||
// String contractTakerTxId = trade.getContract().getTakerFeeTxID();
|
||||
// boolean makerFirstMatch = contractMakerTxId.equalsIgnoreCase(txIdInput0) && contractTakerTxId.equalsIgnoreCase(txIdInput1);
|
||||
// boolean takerFirstMatch = contractMakerTxId.equalsIgnoreCase(txIdInput1) && contractTakerTxId.equalsIgnoreCase(txIdInput0);
|
||||
// if (!makerFirstMatch && !takerFirstMatch) {
|
||||
// String errMsg = "Maker/Taker txId in contract does not match deposit tx input";
|
||||
// log.error(errMsg +
|
||||
// "\nContract Maker tx=" + contractMakerTxId + " Contract Taker tx=" + contractTakerTxId +
|
||||
// "\nDeposit Input0=" + txIdInput0 + " Deposit Input1=" + txIdInput1);
|
||||
// throw new InvalidTxException(errMsg);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Exceptions
|
||||
|
@ -557,8 +557,8 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
|
||||
request.getTakerNodeAddress(),
|
||||
request.getArbitratorNodeAddress());
|
||||
|
||||
//System.out.println("TradeManager trade.getTradingPeer().setNodeAddress(): " + sender);
|
||||
//trade.getTradingPeer().setNodeAddress(sender);
|
||||
//System.out.println("TradeManager trade.getTradePeer().setNodeAddress(): " + sender);
|
||||
//trade.getTradePeer().setNodeAddress(sender);
|
||||
// TODO (woodser): what if maker's address changes while offer open, or taker's address changes after multisig deposit available? need to verify and update. see OpenOfferManager.maybeUpdatePersistedOffers()
|
||||
trade.getArbitrator().setPubKeyRing(arbitrator.getPubKeyRing());
|
||||
trade.getMaker().setPubKeyRing(trade.getOffer().getPubKeyRing());
|
||||
|
@ -20,6 +20,7 @@ package bisq.core.trade.protocol;
|
||||
import bisq.core.trade.BuyerAsMakerTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.InitTradeRequest;
|
||||
import bisq.core.trade.protocol.tasks.ApplyFilter;
|
||||
import bisq.core.trade.protocol.tasks.MakerSendInitTradeRequest;
|
||||
import bisq.core.trade.protocol.tasks.ProcessInitTradeRequest;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
@ -50,9 +51,8 @@ public class BuyerAsMakerProtocol extends BuyerProtocol implements MakerProtocol
|
||||
.with(message)
|
||||
.from(peer))
|
||||
.setup(tasks(
|
||||
ApplyFilter.class,
|
||||
ProcessInitTradeRequest.class,
|
||||
//ApplyFilter.class, // TODO (woodser): these checks apply when maker signs availability request, but not here
|
||||
//VerifyPeersAccountAgeWitness.class, // TODO (woodser): these checks apply after in multisig, means if rejected need to reimburse other's fee
|
||||
MakerSendInitTradeRequest.class)
|
||||
.using(new TradeTaskRunner(trade,
|
||||
() -> {
|
||||
|
@ -56,7 +56,7 @@ public class BuyerAsTakerProtocol extends BuyerProtocol implements TakerProtocol
|
||||
this.errorMessageHandler = errorMessageHandler;
|
||||
expect(phase(Trade.Phase.INIT)
|
||||
.with(TakerEvent.TAKE_OFFER)
|
||||
.from(trade.getTradingPeer().getNodeAddress()))
|
||||
.from(trade.getTradePeer().getNodeAddress()))
|
||||
.setup(tasks(
|
||||
ApplyFilter.class,
|
||||
TakerReserveTradeFunds.class,
|
||||
|
@ -95,8 +95,8 @@ public class BuyerProtocol extends DisputeProtocol {
|
||||
// User interaction
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
public void onPaymentStarted(ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||
System.out.println("BuyerProtocol.onPaymentStarted()");
|
||||
public void onPaymentSent(ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||
System.out.println("BuyerProtocol.onPaymentSent()");
|
||||
new Thread(() -> {
|
||||
synchronized (trade) {
|
||||
latchTrade();
|
||||
|
@ -87,7 +87,7 @@ public abstract class DisputeProtocol extends TradeProtocol {
|
||||
Trade.Phase.PAYMENT_SENT,
|
||||
Trade.Phase.PAYMENT_RECEIVED)
|
||||
.with(event)
|
||||
.preCondition(trade.getTradingPeer().getMediatedPayoutTxSignature() == null,
|
||||
.preCondition(trade.getTradePeer().getMediatedPayoutTxSignature() == null,
|
||||
() -> errorMessageHandler.handleErrorMessage("We have received already the signature from the peer."))
|
||||
.preCondition(trade.getPayoutTx() == null,
|
||||
() -> errorMessageHandler.handleErrorMessage("Payout tx is already published.")))
|
||||
|
@ -109,7 +109,7 @@ public class FluentProtocol {
|
||||
|
||||
NodeAddress peer = condition.getPeer();
|
||||
if (peer != null) {
|
||||
tradeProtocol.processModel.setTempTradingPeerNodeAddress(peer); // TODO (woodser): node has multiple peers (arbitrator and maker or taker), but fluent protocol assumes only one
|
||||
tradeProtocol.processModel.setTempTradePeerNodeAddress(peer); // TODO (woodser): node has multiple peers (arbitrator and maker or taker), but fluent protocol assumes only one
|
||||
tradeProtocol.processModel.getTradeManager().requestPersistence();
|
||||
}
|
||||
|
||||
|
@ -108,9 +108,9 @@ public class ProcessModel implements Model, PersistablePayload {
|
||||
transient private Transaction depositTx; // TODO (woodser): remove and rename depositTxBtc with depositTx
|
||||
|
||||
// Persistable Immutable (private setter only used by PB method)
|
||||
private TradingPeer maker = new TradingPeer();
|
||||
private TradingPeer taker = new TradingPeer();
|
||||
private TradingPeer arbitrator = new TradingPeer();
|
||||
private TradePeer maker = new TradePeer();
|
||||
private TradePeer taker = new TradePeer();
|
||||
private TradePeer arbitrator = new TradePeer();
|
||||
private String offerId;
|
||||
private String accountId;
|
||||
private PubKeyRing pubKeyRing;
|
||||
@ -141,10 +141,10 @@ public class ProcessModel implements Model, PersistablePayload {
|
||||
@Setter
|
||||
private byte[] myMultiSigPubKey;
|
||||
// that is used to store temp. the peers address when we get an incoming message before the message is verified.
|
||||
// After successful verified we copy that over to the trade.tradingPeerAddress
|
||||
// After successful verified we copy that over to the trade.tradePeerAddress
|
||||
@Nullable
|
||||
@Setter
|
||||
private NodeAddress tempTradingPeerNodeAddress; // TODO (woodser): remove entirely?
|
||||
private NodeAddress tempTradePeerNodeAddress; // TODO (woodser): remove entirely?
|
||||
|
||||
// Added in v.1.1.6
|
||||
@Nullable
|
||||
@ -195,20 +195,20 @@ public class ProcessModel implements Model, PersistablePayload {
|
||||
// PaymentSentMessage. As well we do an automatic re-send in case it was not ACKed yet.
|
||||
// To enable that even after restart we persist the state.
|
||||
@Setter
|
||||
private ObjectProperty<MessageState> paymentStartedMessageStateProperty = new SimpleObjectProperty<>(MessageState.UNDEFINED);
|
||||
private ObjectProperty<MessageState> paymentSentMessageStateProperty = new SimpleObjectProperty<>(MessageState.UNDEFINED);
|
||||
|
||||
public ProcessModel(String offerId, String accountId, PubKeyRing pubKeyRing) {
|
||||
this(offerId, accountId, pubKeyRing, new TradingPeer(), new TradingPeer(), new TradingPeer());
|
||||
this(offerId, accountId, pubKeyRing, new TradePeer(), new TradePeer(), new TradePeer());
|
||||
}
|
||||
|
||||
public ProcessModel(String offerId, String accountId, PubKeyRing pubKeyRing, TradingPeer arbitrator, TradingPeer maker, TradingPeer taker) {
|
||||
public ProcessModel(String offerId, String accountId, PubKeyRing pubKeyRing, TradePeer arbitrator, TradePeer maker, TradePeer taker) {
|
||||
this.offerId = offerId;
|
||||
this.accountId = accountId;
|
||||
this.pubKeyRing = pubKeyRing;
|
||||
// If tradingPeer was null in persisted data from some error cases we set a new one to not cause nullPointers
|
||||
this.arbitrator = arbitrator != null ? arbitrator : new TradingPeer();
|
||||
this.maker = maker != null ? maker : new TradingPeer();
|
||||
this.taker = taker != null ? taker : new TradingPeer();
|
||||
// If tradePeer was null in persisted data from some error cases we set a new one to not cause nullPointers
|
||||
this.arbitrator = arbitrator != null ? arbitrator : new TradePeer();
|
||||
this.maker = maker != null ? maker : new TradePeer();
|
||||
this.taker = taker != null ? taker : new TradePeer();
|
||||
}
|
||||
|
||||
public void applyTransient(ProcessModelServiceProvider provider,
|
||||
@ -233,19 +233,19 @@ public class ProcessModel implements Model, PersistablePayload {
|
||||
.setChangeOutputValue(changeOutputValue)
|
||||
.setUseSavingsWallet(useSavingsWallet)
|
||||
.setFundsNeededForTradeAsLong(fundsNeededForTradeAsLong)
|
||||
.setPaymentStartedMessageState(paymentStartedMessageStateProperty.get().name())
|
||||
.setPaymentSentMessageState(paymentSentMessageStateProperty.get().name())
|
||||
.setBuyerPayoutAmountFromMediation(buyerPayoutAmountFromMediation)
|
||||
.setSellerPayoutAmountFromMediation(sellerPayoutAmountFromMediation)
|
||||
.setDepositsConfirmedMessagesDelivered(isDepositsConfirmedMessagesDelivered);
|
||||
Optional.ofNullable(maker).ifPresent(e -> builder.setMaker((protobuf.TradingPeer) maker.toProtoMessage()));
|
||||
Optional.ofNullable(taker).ifPresent(e -> builder.setTaker((protobuf.TradingPeer) taker.toProtoMessage()));
|
||||
Optional.ofNullable(arbitrator).ifPresent(e -> builder.setArbitrator((protobuf.TradingPeer) arbitrator.toProtoMessage()));
|
||||
Optional.ofNullable(maker).ifPresent(e -> builder.setMaker((protobuf.TradePeer) maker.toProtoMessage()));
|
||||
Optional.ofNullable(taker).ifPresent(e -> builder.setTaker((protobuf.TradePeer) taker.toProtoMessage()));
|
||||
Optional.ofNullable(arbitrator).ifPresent(e -> builder.setArbitrator((protobuf.TradePeer) arbitrator.toProtoMessage()));
|
||||
Optional.ofNullable(takeOfferFeeTxId).ifPresent(builder::setTakeOfferFeeTxId);
|
||||
Optional.ofNullable(payoutTxSignature).ifPresent(e -> builder.setPayoutTxSignature(ByteString.copyFrom(payoutTxSignature)));
|
||||
Optional.ofNullable(rawTransactionInputs).ifPresent(e -> builder.addAllRawTransactionInputs(ProtoUtil.collectionToProto(rawTransactionInputs, protobuf.RawTransactionInput.class)));
|
||||
Optional.ofNullable(changeOutputAddress).ifPresent(builder::setChangeOutputAddress);
|
||||
Optional.ofNullable(myMultiSigPubKey).ifPresent(e -> builder.setMyMultiSigPubKey(ByteString.copyFrom(myMultiSigPubKey)));
|
||||
Optional.ofNullable(tempTradingPeerNodeAddress).ifPresent(e -> builder.setTempTradingPeerNodeAddress(tempTradingPeerNodeAddress.toProtoMessage()));
|
||||
Optional.ofNullable(tempTradePeerNodeAddress).ifPresent(e -> builder.setTempTradePeerNodeAddress(tempTradePeerNodeAddress.toProtoMessage()));
|
||||
Optional.ofNullable(makerSignature).ifPresent(e -> builder.setMakerSignature(makerSignature));
|
||||
Optional.ofNullable(multisigAddress).ifPresent(e -> builder.setMultisigAddress(multisigAddress));
|
||||
Optional.ofNullable(paymentSentMessage).ifPresent(e -> builder.setPaymentSentMessage(paymentSentMessage.toProtoNetworkEnvelope().getPaymentSentMessage()));
|
||||
@ -255,9 +255,9 @@ public class ProcessModel implements Model, PersistablePayload {
|
||||
}
|
||||
|
||||
public static ProcessModel fromProto(protobuf.ProcessModel proto, CoreProtoResolver coreProtoResolver) {
|
||||
TradingPeer arbitrator = TradingPeer.fromProto(proto.getArbitrator(), coreProtoResolver);
|
||||
TradingPeer maker = TradingPeer.fromProto(proto.getMaker(), coreProtoResolver);
|
||||
TradingPeer taker = TradingPeer.fromProto(proto.getTaker(), coreProtoResolver);
|
||||
TradePeer arbitrator = TradePeer.fromProto(proto.getArbitrator(), coreProtoResolver);
|
||||
TradePeer maker = TradePeer.fromProto(proto.getMaker(), coreProtoResolver);
|
||||
TradePeer taker = TradePeer.fromProto(proto.getTaker(), coreProtoResolver);
|
||||
PubKeyRing pubKeyRing = PubKeyRing.fromProto(proto.getPubKeyRing());
|
||||
ProcessModel processModel = new ProcessModel(proto.getOfferId(), proto.getAccountId(), pubKeyRing, arbitrator, maker, taker);
|
||||
processModel.setChangeOutputValue(proto.getChangeOutputValue());
|
||||
@ -276,14 +276,14 @@ public class ProcessModel implements Model, PersistablePayload {
|
||||
processModel.setRawTransactionInputs(rawTransactionInputs);
|
||||
processModel.setChangeOutputAddress(ProtoUtil.stringOrNullFromProto(proto.getChangeOutputAddress()));
|
||||
processModel.setMyMultiSigPubKey(ProtoUtil.byteArrayOrNullFromProto(proto.getMyMultiSigPubKey()));
|
||||
processModel.setTempTradingPeerNodeAddress(proto.hasTempTradingPeerNodeAddress() ? NodeAddress.fromProto(proto.getTempTradingPeerNodeAddress()) : null);
|
||||
processModel.setTempTradePeerNodeAddress(proto.hasTempTradePeerNodeAddress() ? NodeAddress.fromProto(proto.getTempTradePeerNodeAddress()) : null);
|
||||
processModel.setMediatedPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getMediatedPayoutTxSignature()));
|
||||
processModel.setMakerSignature(proto.getMakerSignature());
|
||||
processModel.setMultisigAddress(ProtoUtil.stringOrNullFromProto(proto.getMultisigAddress()));
|
||||
|
||||
String paymentStartedMessageStateString = ProtoUtil.stringOrNullFromProto(proto.getPaymentStartedMessageState());
|
||||
MessageState paymentStartedMessageState = ProtoUtil.enumFromProto(MessageState.class, paymentStartedMessageStateString);
|
||||
processModel.setPaymentStartedMessageState(paymentStartedMessageState);
|
||||
String paymentSentMessageStateString = ProtoUtil.stringOrNullFromProto(proto.getPaymentSentMessageState());
|
||||
MessageState paymentSentMessageState = ProtoUtil.enumFromProto(MessageState.class, paymentSentMessageStateString);
|
||||
processModel.setPaymentSentMessageState(paymentSentMessageState);
|
||||
|
||||
processModel.setPaymentSentMessage(proto.hasPaymentSentMessage() ? PaymentSentMessage.fromProto(proto.getPaymentSentMessage(), Version.getP2PMessageVersion()) : null);
|
||||
processModel.setPaymentReceivedMessage(proto.hasPaymentReceivedMessage() ? PaymentReceivedMessage.fromProto(proto.getPaymentReceivedMessage(), Version.getP2PMessageVersion()) : null);
|
||||
@ -330,15 +330,15 @@ public class ProcessModel implements Model, PersistablePayload {
|
||||
return getP2PService().getAddress();
|
||||
}
|
||||
|
||||
void setPaymentStartedAckMessage(AckMessage ackMessage) {
|
||||
void setPaymentSentAckMessage(AckMessage ackMessage) {
|
||||
MessageState messageState = ackMessage.isSuccess() ?
|
||||
MessageState.ACKNOWLEDGED :
|
||||
MessageState.FAILED;
|
||||
setPaymentStartedMessageState(messageState);
|
||||
setPaymentSentMessageState(messageState);
|
||||
}
|
||||
|
||||
public void setPaymentStartedMessageState(MessageState paymentStartedMessageStateProperty) {
|
||||
this.paymentStartedMessageStateProperty.set(paymentStartedMessageStateProperty);
|
||||
public void setPaymentSentMessageState(MessageState paymentSentMessageStateProperty) {
|
||||
this.paymentSentMessageStateProperty.set(paymentSentMessageStateProperty);
|
||||
if (tradeManager != null) {
|
||||
tradeManager.requestPersistence();
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ package bisq.core.trade.protocol;
|
||||
import bisq.core.trade.SellerAsMakerTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.InitTradeRequest;
|
||||
import bisq.core.trade.protocol.tasks.ApplyFilter;
|
||||
import bisq.core.trade.protocol.tasks.MakerSendInitTradeRequest;
|
||||
import bisq.core.trade.protocol.tasks.ProcessInitTradeRequest;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
@ -56,9 +57,8 @@ public class SellerAsMakerProtocol extends SellerProtocol implements MakerProtoc
|
||||
.with(message)
|
||||
.from(peer))
|
||||
.setup(tasks(
|
||||
ApplyFilter.class,
|
||||
ProcessInitTradeRequest.class,
|
||||
//ApplyFilter.class, // TODO (woodser): these checks apply when maker signs availability request, but not here
|
||||
//VerifyPeersAccountAgeWitness.class, // TODO (woodser): these checks apply after in multisig, means if rejected need to reimburse other's fee
|
||||
MakerSendInitTradeRequest.class)
|
||||
.using(new TradeTaskRunner(trade,
|
||||
() -> {
|
||||
|
@ -56,7 +56,7 @@ public class SellerAsTakerProtocol extends SellerProtocol implements TakerProtoc
|
||||
this.errorMessageHandler = errorMessageHandler;
|
||||
expect(phase(Trade.Phase.INIT)
|
||||
.with(TakerEvent.TAKE_OFFER)
|
||||
.from(trade.getTradingPeer().getNodeAddress()))
|
||||
.from(trade.getTradePeer().getNodeAddress()))
|
||||
.setup(tasks(
|
||||
ApplyFilter.class,
|
||||
TakerReserveTradeFunds.class,
|
||||
|
@ -45,7 +45,7 @@ import javax.annotation.Nullable;
|
||||
@Slf4j
|
||||
@Getter
|
||||
@Setter
|
||||
public final class TradingPeer implements PersistablePayload {
|
||||
public final class TradePeer implements PersistablePayload {
|
||||
// Transient/Mutable
|
||||
// Added in v1.2.0
|
||||
@Setter
|
||||
@ -130,12 +130,12 @@ public final class TradingPeer implements PersistablePayload {
|
||||
@Nullable
|
||||
private String updatedMultisigHex;
|
||||
|
||||
public TradingPeer() {
|
||||
public TradePeer() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Message toProtoMessage() {
|
||||
final protobuf.TradingPeer.Builder builder = protobuf.TradingPeer.newBuilder()
|
||||
final protobuf.TradePeer.Builder builder = protobuf.TradePeer.newBuilder()
|
||||
.setChangeOutputValue(changeOutputValue);
|
||||
Optional.ofNullable(nodeAddress).ifPresent(e -> builder.setNodeAddress(nodeAddress.toProtoMessage()));
|
||||
Optional.ofNullable(pubKeyRing).ifPresent(e -> builder.setPubKeyRing(pubKeyRing.toProtoMessage()));
|
||||
@ -174,52 +174,52 @@ public final class TradingPeer implements PersistablePayload {
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
public static TradingPeer fromProto(protobuf.TradingPeer proto, CoreProtoResolver coreProtoResolver) {
|
||||
public static TradePeer fromProto(protobuf.TradePeer proto, CoreProtoResolver coreProtoResolver) {
|
||||
if (proto.getDefaultInstanceForType().equals(proto)) {
|
||||
return null;
|
||||
} else {
|
||||
TradingPeer tradingPeer = new TradingPeer();
|
||||
tradingPeer.setNodeAddress(proto.hasNodeAddress() ? NodeAddress.fromProto(proto.getNodeAddress()) : null);
|
||||
tradingPeer.setPubKeyRing(proto.hasPubKeyRing() ? PubKeyRing.fromProto(proto.getPubKeyRing()) : null);
|
||||
tradingPeer.setChangeOutputValue(proto.getChangeOutputValue());
|
||||
tradingPeer.setAccountId(ProtoUtil.stringOrNullFromProto(proto.getAccountId()));
|
||||
tradingPeer.setPaymentAccountId(ProtoUtil.stringOrNullFromProto(proto.getPaymentAccountId()));
|
||||
tradingPeer.setPaymentMethodId(ProtoUtil.stringOrNullFromProto(proto.getPaymentMethodId()));
|
||||
tradingPeer.setPaymentAccountPayloadHash(proto.getPaymentAccountPayloadHash().toByteArray());
|
||||
tradingPeer.setEncryptedPaymentAccountPayload(proto.getEncryptedPaymentAccountPayload().toByteArray());
|
||||
tradingPeer.setPaymentAccountKey(ProtoUtil.byteArrayOrNullFromProto(proto.getPaymentAccountKey()));
|
||||
tradingPeer.setPaymentAccountPayload(proto.hasPaymentAccountPayload() ? coreProtoResolver.fromProto(proto.getPaymentAccountPayload()) : null);
|
||||
tradingPeer.setPayoutAddressString(ProtoUtil.stringOrNullFromProto(proto.getPayoutAddressString()));
|
||||
tradingPeer.setContractAsJson(ProtoUtil.stringOrNullFromProto(proto.getContractAsJson()));
|
||||
tradingPeer.setContractSignature(ProtoUtil.stringOrNullFromProto(proto.getContractSignature()));
|
||||
tradingPeer.setSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getSignature()));
|
||||
tradingPeer.setPubKeyRing(proto.hasPubKeyRing() ? PubKeyRing.fromProto(proto.getPubKeyRing()) : null);
|
||||
tradingPeer.setMultiSigPubKey(ProtoUtil.byteArrayOrNullFromProto(proto.getMultiSigPubKey()));
|
||||
TradePeer tradePeer = new TradePeer();
|
||||
tradePeer.setNodeAddress(proto.hasNodeAddress() ? NodeAddress.fromProto(proto.getNodeAddress()) : null);
|
||||
tradePeer.setPubKeyRing(proto.hasPubKeyRing() ? PubKeyRing.fromProto(proto.getPubKeyRing()) : null);
|
||||
tradePeer.setChangeOutputValue(proto.getChangeOutputValue());
|
||||
tradePeer.setAccountId(ProtoUtil.stringOrNullFromProto(proto.getAccountId()));
|
||||
tradePeer.setPaymentAccountId(ProtoUtil.stringOrNullFromProto(proto.getPaymentAccountId()));
|
||||
tradePeer.setPaymentMethodId(ProtoUtil.stringOrNullFromProto(proto.getPaymentMethodId()));
|
||||
tradePeer.setPaymentAccountPayloadHash(proto.getPaymentAccountPayloadHash().toByteArray());
|
||||
tradePeer.setEncryptedPaymentAccountPayload(proto.getEncryptedPaymentAccountPayload().toByteArray());
|
||||
tradePeer.setPaymentAccountKey(ProtoUtil.byteArrayOrNullFromProto(proto.getPaymentAccountKey()));
|
||||
tradePeer.setPaymentAccountPayload(proto.hasPaymentAccountPayload() ? coreProtoResolver.fromProto(proto.getPaymentAccountPayload()) : null);
|
||||
tradePeer.setPayoutAddressString(ProtoUtil.stringOrNullFromProto(proto.getPayoutAddressString()));
|
||||
tradePeer.setContractAsJson(ProtoUtil.stringOrNullFromProto(proto.getContractAsJson()));
|
||||
tradePeer.setContractSignature(ProtoUtil.stringOrNullFromProto(proto.getContractSignature()));
|
||||
tradePeer.setSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getSignature()));
|
||||
tradePeer.setPubKeyRing(proto.hasPubKeyRing() ? PubKeyRing.fromProto(proto.getPubKeyRing()) : null);
|
||||
tradePeer.setMultiSigPubKey(ProtoUtil.byteArrayOrNullFromProto(proto.getMultiSigPubKey()));
|
||||
List<RawTransactionInput> rawTransactionInputs = proto.getRawTransactionInputsList().isEmpty() ?
|
||||
null :
|
||||
proto.getRawTransactionInputsList().stream()
|
||||
.map(RawTransactionInput::fromProto)
|
||||
.collect(Collectors.toList());
|
||||
tradingPeer.setRawTransactionInputs(rawTransactionInputs);
|
||||
tradingPeer.setChangeOutputAddress(ProtoUtil.stringOrNullFromProto(proto.getChangeOutputAddress()));
|
||||
tradingPeer.setAccountAgeWitnessNonce(ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessNonce()));
|
||||
tradingPeer.setAccountAgeWitnessSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessSignature()));
|
||||
tradePeer.setRawTransactionInputs(rawTransactionInputs);
|
||||
tradePeer.setChangeOutputAddress(ProtoUtil.stringOrNullFromProto(proto.getChangeOutputAddress()));
|
||||
tradePeer.setAccountAgeWitnessNonce(ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessNonce()));
|
||||
tradePeer.setAccountAgeWitnessSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessSignature()));
|
||||
protobuf.AccountAgeWitness protoAccountAgeWitness = proto.getAccountAgeWitness();
|
||||
tradingPeer.setAccountAgeWitness(protoAccountAgeWitness.getHash().isEmpty() ? null : AccountAgeWitness.fromProto(protoAccountAgeWitness));
|
||||
tradingPeer.setCurrentDate(proto.getCurrentDate());
|
||||
tradingPeer.setMediatedPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getMediatedPayoutTxSignature()));
|
||||
tradingPeer.setReserveTxHash(ProtoUtil.stringOrNullFromProto(proto.getReserveTxHash()));
|
||||
tradingPeer.setReserveTxHex(ProtoUtil.stringOrNullFromProto(proto.getReserveTxHex()));
|
||||
tradingPeer.setReserveTxKey(ProtoUtil.stringOrNullFromProto(proto.getReserveTxKey()));
|
||||
tradingPeer.setReserveTxKeyImages(proto.getReserveTxKeyImagesList());
|
||||
tradingPeer.setPreparedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getPreparedMultisigHex()));
|
||||
tradingPeer.setMadeMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getMadeMultisigHex()));
|
||||
tradingPeer.setExchangedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getExchangedMultisigHex()));
|
||||
tradingPeer.setDepositTxHash(ProtoUtil.stringOrNullFromProto(proto.getDepositTxHash()));
|
||||
tradingPeer.setDepositTxHex(ProtoUtil.stringOrNullFromProto(proto.getDepositTxHex()));
|
||||
tradingPeer.setDepositTxKey(ProtoUtil.stringOrNullFromProto(proto.getDepositTxKey()));
|
||||
tradingPeer.setUpdatedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getUpdatedMultisigHex()));
|
||||
return tradingPeer;
|
||||
tradePeer.setAccountAgeWitness(protoAccountAgeWitness.getHash().isEmpty() ? null : AccountAgeWitness.fromProto(protoAccountAgeWitness));
|
||||
tradePeer.setCurrentDate(proto.getCurrentDate());
|
||||
tradePeer.setMediatedPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getMediatedPayoutTxSignature()));
|
||||
tradePeer.setReserveTxHash(ProtoUtil.stringOrNullFromProto(proto.getReserveTxHash()));
|
||||
tradePeer.setReserveTxHex(ProtoUtil.stringOrNullFromProto(proto.getReserveTxHex()));
|
||||
tradePeer.setReserveTxKey(ProtoUtil.stringOrNullFromProto(proto.getReserveTxKey()));
|
||||
tradePeer.setReserveTxKeyImages(proto.getReserveTxKeyImagesList());
|
||||
tradePeer.setPreparedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getPreparedMultisigHex()));
|
||||
tradePeer.setMadeMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getMadeMultisigHex()));
|
||||
tradePeer.setExchangedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getExchangedMultisigHex()));
|
||||
tradePeer.setDepositTxHash(ProtoUtil.stringOrNullFromProto(proto.getDepositTxHash()));
|
||||
tradePeer.setDepositTxHex(ProtoUtil.stringOrNullFromProto(proto.getDepositTxHex()));
|
||||
tradePeer.setDepositTxKey(ProtoUtil.stringOrNullFromProto(proto.getDepositTxKey()));
|
||||
tradePeer.setUpdatedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getUpdatedMultisigHex()));
|
||||
return tradePeer;
|
||||
}
|
||||
}
|
||||
}
|
@ -508,7 +508,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
|
||||
log.warn("Error processing payment received message: " + errorMessage);
|
||||
processModel.getTradeManager().requestPersistence();
|
||||
|
||||
// reprocess message depending on error
|
||||
// schedule to reprocess message unless deleted
|
||||
if (trade.getProcessModel().getPaymentReceivedMessage() != null) {
|
||||
UserThread.runAfter(() -> {
|
||||
reprocessPaymentReceivedMessageCount++;
|
||||
@ -583,8 +583,8 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
|
||||
private void onAckMessage(AckMessage ackMessage, NodeAddress peer) {
|
||||
// We handle the ack for PaymentSentMessage and DepositTxAndDelayedPayoutTxMessage
|
||||
// as we support automatic re-send of the msg in case it was not ACKed after a certain time
|
||||
if (ackMessage.getSourceMsgClassName().equals(PaymentSentMessage.class.getSimpleName()) && trade.getTradingPeer(peer) == trade.getSeller()) {
|
||||
processModel.setPaymentStartedAckMessage(ackMessage);
|
||||
if (ackMessage.getSourceMsgClassName().equals(PaymentSentMessage.class.getSimpleName()) && trade.getTradePeer(peer) == trade.getSeller()) {
|
||||
processModel.setPaymentSentAckMessage(ackMessage);
|
||||
}
|
||||
|
||||
if (ackMessage.isSuccess()) {
|
||||
@ -705,7 +705,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
|
||||
|
||||
private PubKeyRing getPeersPubKeyRing(NodeAddress address) {
|
||||
trade.setMyNodeAddress(); // TODO: this is a hack to update my node address before verifying the message
|
||||
TradingPeer peer = trade.getTradingPeer(address);
|
||||
TradePeer peer = trade.getTradePeer(address);
|
||||
if (peer == null) {
|
||||
log.warn("Cannot get peer's pub key ring because peer is not maker, taker, or arbitrator. Their address might have changed: " + peer);
|
||||
return null;
|
||||
@ -733,13 +733,13 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
|
||||
} else {
|
||||
|
||||
// valid if arbitrator or peer unknown
|
||||
if (trade.getArbitrator().getPubKeyRing() == null || (trade.getTradingPeer() == null || trade.getTradingPeer().getPubKeyRing() == null)) return true;
|
||||
if (trade.getArbitrator().getPubKeyRing() == null || (trade.getTradePeer() == null || trade.getTradePeer().getPubKeyRing() == null)) return true;
|
||||
|
||||
// valid if arbitrator's pub key ring
|
||||
if (message.getSignaturePubKey().equals(trade.getArbitrator().getPubKeyRing().getSignaturePubKey())) return true;
|
||||
|
||||
// valid if peer's pub key ring
|
||||
if (message.getSignaturePubKey().equals(trade.getTradingPeer().getPubKeyRing().getSignaturePubKey())) return true;
|
||||
if (message.getSignaturePubKey().equals(trade.getTradePeer().getPubKeyRing().getSignaturePubKey())) return true;
|
||||
}
|
||||
|
||||
// invalid
|
||||
|
@ -18,18 +18,13 @@
|
||||
package bisq.core.trade.protocol.tasks;
|
||||
|
||||
import bisq.core.filter.FilterManager;
|
||||
import bisq.core.payment.payload.PaymentAccountPayload;
|
||||
import bisq.core.trade.ArbitratorTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.InitTradeRequest;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
|
||||
import bisq.common.taskrunner.TaskRunner;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
@Slf4j
|
||||
@ -43,12 +38,12 @@ public class ApplyFilter extends TradeTask {
|
||||
try {
|
||||
runInterceptHook();
|
||||
|
||||
NodeAddress nodeAddress = checkNotNull(processModel.getTempTradingPeerNodeAddress());
|
||||
NodeAddress nodeAddress = checkNotNull(processModel.getTempTradePeerNodeAddress());
|
||||
|
||||
FilterManager filterManager = processModel.getFilterManager();
|
||||
if (filterManager.isNodeAddressBanned(nodeAddress)) {
|
||||
failed("Other trader is banned by their node address.\n" +
|
||||
"tradingPeerNodeAddress=" + nodeAddress);
|
||||
"tradePeerNodeAddress=" + nodeAddress);
|
||||
} else if (filterManager.isOfferIdBanned(trade.getId())) {
|
||||
failed("Offer ID is banned.\n" +
|
||||
"Offer ID=" + trade.getId());
|
||||
|
@ -27,7 +27,7 @@ import bisq.core.trade.HavenoUtils;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.DepositRequest;
|
||||
import bisq.core.trade.messages.DepositResponse;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
import bisq.network.p2p.SendDirectMessageListener;
|
||||
import common.utils.JsonUtils;
|
||||
@ -65,7 +65,7 @@ public class ArbitratorProcessDepositRequest extends TradeTask {
|
||||
String signature = request.getContractSignature();
|
||||
|
||||
// get trader info
|
||||
TradingPeer trader = trade.getTradingPeer(processModel.getTempTradingPeerNodeAddress());
|
||||
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();
|
||||
|
||||
|
@ -23,7 +23,7 @@ import bisq.core.offer.OfferDirection;
|
||||
import bisq.core.trade.HavenoUtils;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.InitTradeRequest;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import java.math.BigInteger;
|
||||
|
||||
import org.bitcoinj.core.Coin;
|
||||
@ -73,7 +73,7 @@ public class ArbitratorProcessReserveTx extends TradeTask {
|
||||
}
|
||||
|
||||
// save reserve tx to model
|
||||
TradingPeer trader = isFromTaker ? processModel.getTaker() : processModel.getMaker();
|
||||
TradePeer trader = isFromTaker ? processModel.getTaker() : processModel.getMaker();
|
||||
trader.setReserveTxHash(request.getReserveTxHash());
|
||||
trader.setReserveTxHex(request.getReserveTxHex());
|
||||
trader.setReserveTxKey(request.getReserveTxKey());
|
||||
|
@ -91,7 +91,7 @@ public abstract class BuyerSendPaymentSentMessage extends SendMailboxMessageTask
|
||||
trade.getPayoutTxHex(),
|
||||
trade.getSelf().getUpdatedMultisigHex(),
|
||||
trade.getSelf().getPaymentAccountKey(),
|
||||
trade.getTradingPeer().getAccountAgeWitness()
|
||||
trade.getTradePeer().getAccountAgeWitness()
|
||||
);
|
||||
|
||||
// sign message
|
||||
@ -139,7 +139,7 @@ public abstract class BuyerSendPaymentSentMessage extends SendMailboxMessageTask
|
||||
timer.stop();
|
||||
}
|
||||
if (listener != null) {
|
||||
processModel.getPaymentStartedMessageStateProperty().removeListener(listener);
|
||||
processModel.getPaymentSentMessageStateProperty().removeListener(listener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -98,16 +98,16 @@ public class MaybeSendSignContractRequest extends TradeTask {
|
||||
sig);
|
||||
|
||||
// send request to trading peer
|
||||
processModel.getP2PService().sendEncryptedDirectMessage(trade.getTradingPeer().getNodeAddress(), trade.getTradingPeer().getPubKeyRing(), request, new SendDirectMessageListener() {
|
||||
processModel.getP2PService().sendEncryptedDirectMessage(trade.getTradePeer().getNodeAddress(), trade.getTradePeer().getPubKeyRing(), request, new SendDirectMessageListener() {
|
||||
@Override
|
||||
public void onArrived() {
|
||||
log.info("{} arrived: trading peer={}; offerId={}; uid={}", request.getClass().getSimpleName(), trade.getTradingPeer().getNodeAddress(), trade.getId());
|
||||
log.info("{} arrived: trading peer={}; offerId={}; uid={}", request.getClass().getSimpleName(), trade.getTradePeer().getNodeAddress(), trade.getId());
|
||||
ack1 = true;
|
||||
if (ack1 && ack2) completeAux();
|
||||
}
|
||||
@Override
|
||||
public void onFault(String errorMessage) {
|
||||
log.error("Sending {} failed: uid={}; peer={}; error={}", request.getClass().getSimpleName(), trade.getTradingPeer().getNodeAddress(), trade.getId(), errorMessage);
|
||||
log.error("Sending {} failed: uid={}; peer={}; error={}", request.getClass().getSimpleName(), trade.getTradePeer().getNodeAddress(), trade.getId(), errorMessage);
|
||||
appendToErrorMessage("Sending message failed: message=" + request + "\nerrorMessage=" + errorMessage);
|
||||
failed();
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ package bisq.core.trade.protocol.tasks;
|
||||
import bisq.common.taskrunner.TaskRunner;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.DepositsConfirmedMessage;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.core.util.Validator;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@ -44,11 +44,11 @@ public class ProcessDepositsConfirmedMessage extends TradeTask {
|
||||
DepositsConfirmedMessage request = (DepositsConfirmedMessage) processModel.getTradeMessage();
|
||||
checkNotNull(request);
|
||||
Validator.checkTradeId(processModel.getOfferId(), request);
|
||||
TradingPeer sender = trade.getTradingPeer(request.getPubKeyRing());
|
||||
TradePeer sender = trade.getTradePeer(request.getPubKeyRing());
|
||||
if (sender == null) throw new RuntimeException("Pub key ring is not from arbitrator, buyer, or seller");
|
||||
|
||||
// update peer node address
|
||||
sender.setNodeAddress(processModel.getTempTradingPeerNodeAddress());
|
||||
sender.setNodeAddress(processModel.getTempTradePeerNodeAddress());
|
||||
if (sender.getNodeAddress().equals(trade.getBuyer().getNodeAddress()) && sender != trade.getBuyer()) trade.getBuyer().setNodeAddress(null); // tests can reuse addresses
|
||||
if (sender.getNodeAddress().equals(trade.getSeller().getNodeAddress()) && sender != trade.getSeller()) trade.getSeller().setNodeAddress(null);
|
||||
if (sender.getNodeAddress().equals(trade.getArbitrator().getNodeAddress()) && sender != trade.getArbitrator()) trade.getArbitrator().setNodeAddress(null);
|
||||
@ -57,7 +57,7 @@ public class ProcessDepositsConfirmedMessage extends TradeTask {
|
||||
sender.setUpdatedMultisigHex(request.getUpdatedMultisigHex());
|
||||
|
||||
// decrypt seller payment account payload if key given
|
||||
if (request.getSellerPaymentAccountKey() != null && trade.getTradingPeer().getPaymentAccountPayload() == null) {
|
||||
if (request.getSellerPaymentAccountKey() != null && trade.getTradePeer().getPaymentAccountPayload() == null) {
|
||||
log.info(trade.getClass().getSimpleName() + " decrypting using seller payment account key");
|
||||
trade.decryptPeerPaymentAccountPayload(request.getSellerPaymentAccountKey());
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ import bisq.core.trade.MakerTrade;
|
||||
import bisq.core.trade.TakerTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.InitMultisigRequest;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
import bisq.network.p2p.SendDirectMessageListener;
|
||||
|
||||
@ -68,7 +68,7 @@ public class ProcessInitMultisigRequest extends TradeTask {
|
||||
XmrWalletService xmrWalletService = processModel.getProvider().getXmrWalletService();
|
||||
|
||||
// get peer multisig participant
|
||||
TradingPeer multisigParticipant = trade.getTradingPeer(processModel.getTempTradingPeerNodeAddress());
|
||||
TradePeer multisigParticipant = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
|
||||
|
||||
// reconcile peer's established multisig hex with message
|
||||
if (multisigParticipant.getPreparedMultisigHex() == null) multisigParticipant.setPreparedMultisigHex(request.getPreparedMultisigHex());
|
||||
@ -91,7 +91,7 @@ public class ProcessInitMultisigRequest extends TradeTask {
|
||||
}
|
||||
|
||||
// make multisig if applicable
|
||||
TradingPeer[] peers = getMultisigPeers();
|
||||
TradePeer[] peers = getMultisigPeers();
|
||||
if (trade.getSelf().getMadeMultisigHex() == null && peers[0].getPreparedMultisigHex() != null && peers[1].getPreparedMultisigHex() != null) {
|
||||
log.info("Making multisig wallet for trade {}", trade.getId());
|
||||
String multisigHex = multisigWallet.makeMultisig(Arrays.asList(peers[0].getPreparedMultisigHex(), peers[1].getPreparedMultisigHex()), 2, xmrWalletService.getWalletPassword()); // TODO (woodser): xmrWalletService.makeMultisig(tradeId, multisigHexes, threshold)?
|
||||
@ -187,8 +187,8 @@ public class ProcessInitMultisigRequest extends TradeTask {
|
||||
}
|
||||
}
|
||||
|
||||
private TradingPeer[] getMultisigPeers() {
|
||||
TradingPeer[] peers = new TradingPeer[2];
|
||||
private TradePeer[] getMultisigPeers() {
|
||||
TradePeer[] peers = new TradePeer[2];
|
||||
if (trade instanceof TakerTrade) {
|
||||
peers[0] = processModel.getArbitrator();
|
||||
peers[1] = processModel.getMaker();
|
||||
|
@ -24,7 +24,7 @@ import bisq.core.trade.MakerTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.HavenoUtils;
|
||||
import bisq.core.trade.messages.InitTradeRequest;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
|
||||
import bisq.common.taskrunner.TaskRunner;
|
||||
import org.bitcoinj.core.Coin;
|
||||
@ -58,7 +58,7 @@ public class ProcessInitTradeRequest extends TradeTask {
|
||||
checkTradeId(processModel.getOfferId(), request);
|
||||
|
||||
// handle request as arbitrator
|
||||
TradingPeer multisigParticipant;
|
||||
TradePeer multisigParticipant;
|
||||
if (trade instanceof ArbitratorTrade) {
|
||||
trade.getMaker().setPubKeyRing((trade.getOffer().getPubKeyRing()));
|
||||
trade.getArbitrator().setPubKeyRing(processModel.getPubKeyRing()); // TODO (woodser): why duplicating field in process model
|
||||
|
@ -68,12 +68,12 @@ public class ProcessPaymentReceivedMessage extends TradeTask {
|
||||
trade.getBuyer().setAccountAgeWitness(message.getBuyerAccountAgeWitness());
|
||||
|
||||
// update to the latest peer address of our peer if message is correct
|
||||
trade.getSeller().setNodeAddress(processModel.getTempTradingPeerNodeAddress());
|
||||
trade.getSeller().setNodeAddress(processModel.getTempTradePeerNodeAddress());
|
||||
if (trade.getSeller().getNodeAddress().equals(trade.getBuyer().getNodeAddress())) trade.getBuyer().setNodeAddress(null); // tests can reuse addresses
|
||||
|
||||
// close open disputes
|
||||
if (trade.getDisputeState().ordinal() >= Trade.DisputeState.DISPUTE_REQUESTED.ordinal()) {
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.DISPUTE_CLOSED);
|
||||
trade.advanceDisputeState(Trade.DisputeState.DISPUTE_CLOSED);
|
||||
for (Dispute dispute : trade.getDisputes()) {
|
||||
dispute.setIsClosed();
|
||||
}
|
||||
@ -94,7 +94,7 @@ public class ProcessPaymentReceivedMessage extends TradeTask {
|
||||
}
|
||||
|
||||
// complete
|
||||
trade.setStateIfProgress(Trade.State.SELLER_SENT_PAYMENT_RECEIVED_MSG); // arbitrator auto completes when payout published
|
||||
trade.advanceState(Trade.State.SELLER_SENT_PAYMENT_RECEIVED_MSG); // arbitrator auto completes when payout published
|
||||
trade.requestPersistence();
|
||||
complete();
|
||||
} catch (Throwable t) {
|
||||
|
@ -54,14 +54,14 @@ public class ProcessPaymentSentMessage extends TradeTask {
|
||||
if (trade.isSeller()) trade.decryptPeerPaymentAccountPayload(message.getPaymentAccountKey());
|
||||
|
||||
// update latest peer address
|
||||
trade.getBuyer().setNodeAddress(processModel.getTempTradingPeerNodeAddress());
|
||||
trade.getBuyer().setNodeAddress(processModel.getTempTradePeerNodeAddress());
|
||||
|
||||
// set state
|
||||
String counterCurrencyTxId = message.getCounterCurrencyTxId();
|
||||
if (counterCurrencyTxId != null && counterCurrencyTxId.length() < 100) trade.setCounterCurrencyTxId(counterCurrencyTxId);
|
||||
String counterCurrencyExtraData = message.getCounterCurrencyExtraData();
|
||||
if (counterCurrencyExtraData != null && counterCurrencyExtraData.length() < 100) trade.setCounterCurrencyExtraData(counterCurrencyExtraData);
|
||||
trade.setStateIfProgress(trade.isSeller() ? Trade.State.SELLER_RECEIVED_PAYMENT_SENT_MSG : Trade.State.BUYER_SENT_PAYMENT_SENT_MSG);
|
||||
trade.advanceState(trade.isSeller() ? Trade.State.SELLER_RECEIVED_PAYMENT_SENT_MSG : Trade.State.BUYER_SENT_PAYMENT_SENT_MSG);
|
||||
trade.requestPersistence();
|
||||
complete();
|
||||
} catch (Throwable t) {
|
||||
|
@ -33,7 +33,7 @@ import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.Trade.State;
|
||||
import bisq.core.trade.messages.SignContractRequest;
|
||||
import bisq.core.trade.messages.SignContractResponse;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.core.util.JsonUtil;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
import bisq.network.p2p.SendDirectMessageListener;
|
||||
@ -65,7 +65,7 @@ public class ProcessSignContractRequest extends TradeTask {
|
||||
// extract fields from request
|
||||
// TODO (woodser): verify request and from maker or taker
|
||||
SignContractRequest request = (SignContractRequest) processModel.getTradeMessage();
|
||||
TradingPeer trader = trade.getTradingPeer(processModel.getTempTradingPeerNodeAddress());
|
||||
TradePeer trader = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
|
||||
trader.setDepositTxHash(request.getDepositTxHash());
|
||||
trader.setAccountId(request.getAccountId());
|
||||
trader.setPaymentAccountPayloadHash(request.getPaymentAccountPayloadHash());
|
||||
@ -120,8 +120,8 @@ public class ProcessSignContractRequest extends TradeTask {
|
||||
encryptedPaymentAccountPayload);
|
||||
|
||||
// get response recipients. only arbitrator sends response to both peers
|
||||
NodeAddress recipient1 = trade instanceof ArbitratorTrade ? trade.getMaker().getNodeAddress() : trade.getTradingPeer().getNodeAddress();
|
||||
PubKeyRing recipient1PubKey = trade instanceof ArbitratorTrade ? trade.getMaker().getPubKeyRing() : trade.getTradingPeer().getPubKeyRing();
|
||||
NodeAddress recipient1 = trade instanceof ArbitratorTrade ? trade.getMaker().getNodeAddress() : trade.getTradePeer().getNodeAddress();
|
||||
PubKeyRing recipient1PubKey = trade instanceof ArbitratorTrade ? trade.getMaker().getPubKeyRing() : trade.getTradePeer().getPubKeyRing();
|
||||
NodeAddress recipient2 = trade instanceof ArbitratorTrade ? trade.getTaker().getNodeAddress() : null;
|
||||
PubKeyRing recipient2PubKey = trade instanceof ArbitratorTrade ? trade.getTaker().getPubKeyRing() : null;
|
||||
|
||||
|
@ -25,7 +25,7 @@ import bisq.common.taskrunner.TaskRunner;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.DepositRequest;
|
||||
import bisq.core.trade.messages.SignContractResponse;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.network.p2p.SendDirectMessageListener;
|
||||
import java.util.Date;
|
||||
import java.util.UUID;
|
||||
@ -54,7 +54,7 @@ public class ProcessSignContractResponse extends TradeTask {
|
||||
}
|
||||
|
||||
// get peer info
|
||||
TradingPeer peer = trade.getTradingPeer(processModel.getTempTradingPeerNodeAddress());
|
||||
TradePeer peer = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
|
||||
PubKeyRing peerPubKeyRing = peer.getPubKeyRing();
|
||||
|
||||
// save peer's encrypted payment account payload
|
||||
|
@ -23,7 +23,7 @@ import bisq.core.support.dispute.Dispute;
|
||||
import bisq.core.trade.HavenoUtils;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.DepositsConfirmedMessage;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.core.util.Validator;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@ -48,7 +48,7 @@ public class ResendDisputeClosedMessageWithPayout extends TradeTask {
|
||||
DepositsConfirmedMessage request = (DepositsConfirmedMessage) processModel.getTradeMessage();
|
||||
checkNotNull(request);
|
||||
Validator.checkTradeId(processModel.getOfferId(), request);
|
||||
TradingPeer sender = trade.getTradingPeer(request.getPubKeyRing());
|
||||
TradePeer sender = trade.getTradePeer(request.getPubKeyRing());
|
||||
if (sender == null) throw new RuntimeException("Pub key ring is not from arbitrator, buyer, or seller");
|
||||
|
||||
// arbitrator resends DisputeClosedMessage with payout tx when updated multisig info received
|
||||
|
@ -36,7 +36,7 @@ public class SellerPublishTradeStatistics extends TradeTask {
|
||||
//
|
||||
// checkNotNull(trade.getDepositTx());
|
||||
//
|
||||
// processModel.getP2PService().findPeersCapabilities(trade.getTradingPeer().getNodeAddress())
|
||||
// processModel.getP2PService().findPeersCapabilities(trade.getTradePeer().getNodeAddress())
|
||||
// .filter(capabilities -> capabilities.containsAll(Capability.TRADE_STATISTICS_3))
|
||||
// .ifPresentOrElse(capabilities -> {
|
||||
// // Our peer has updated, so as we are the seller we will publish the trade statistics.
|
||||
|
@ -85,7 +85,7 @@ public abstract class SellerSendPaymentReceivedMessage extends SendMailboxMessag
|
||||
trade.isPayoutPublished() ? trade.getPayoutTxHex() : null, // signed
|
||||
trade.getSelf().getUpdatedMultisigHex(),
|
||||
trade.getState().ordinal() >= Trade.State.SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG.ordinal(), // informs to expect payout
|
||||
trade.getTradingPeer().getAccountAgeWitness(),
|
||||
trade.getTradePeer().getAccountAgeWitness(),
|
||||
signedWitness,
|
||||
processModel.getPaymentSentMessage()
|
||||
);
|
||||
@ -106,28 +106,28 @@ public abstract class SellerSendPaymentReceivedMessage extends SendMailboxMessag
|
||||
|
||||
@Override
|
||||
protected void setStateSent() {
|
||||
trade.setStateIfProgress(Trade.State.SELLER_SENT_PAYMENT_RECEIVED_MSG);
|
||||
trade.advanceState(Trade.State.SELLER_SENT_PAYMENT_RECEIVED_MSG);
|
||||
log.info("{} sent: tradeId={} at peer {} SignedWitness {}", getClass().getSimpleName(), trade.getId(), getReceiverNodeAddress(), signedWitness);
|
||||
processModel.getTradeManager().requestPersistence();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setStateFault() {
|
||||
trade.setStateIfProgress(Trade.State.SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG);
|
||||
trade.advanceState(Trade.State.SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG);
|
||||
log.error("{} failed: tradeId={} at peer {} SignedWitness {}", getClass().getSimpleName(), trade.getId(), getReceiverNodeAddress(), signedWitness);
|
||||
processModel.getTradeManager().requestPersistence();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setStateStoredInMailbox() {
|
||||
trade.setStateIfProgress(Trade.State.SELLER_STORED_IN_MAILBOX_PAYMENT_RECEIVED_MSG);
|
||||
trade.advanceState(Trade.State.SELLER_STORED_IN_MAILBOX_PAYMENT_RECEIVED_MSG);
|
||||
log.info("{} stored in mailbox: tradeId={} at peer {} SignedWitness {}", getClass().getSimpleName(), trade.getId(), getReceiverNodeAddress(), signedWitness);
|
||||
processModel.getTradeManager().requestPersistence();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setStateArrived() {
|
||||
trade.setStateIfProgress(Trade.State.SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG);
|
||||
trade.advanceState(Trade.State.SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG);
|
||||
log.info("{} arrived: tradeId={} at peer {} SignedWitness {}", getClass().getSimpleName(), trade.getId(), getReceiverNodeAddress(), signedWitness);
|
||||
processModel.getTradeManager().requestPersistence();
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ public abstract class SendDepositsConfirmedMessage extends SendMailboxMessageTas
|
||||
processModel.getMyNodeAddress(),
|
||||
processModel.getPubKeyRing(),
|
||||
deterministicId,
|
||||
trade.getBuyer() == trade.getTradingPeer(getReceiverNodeAddress()) ? trade.getSeller().getPaymentAccountKey() : null, // buyer receives seller's payment account decryption key
|
||||
trade.getBuyer() == trade.getTradePeer(getReceiverNodeAddress()) ? trade.getSeller().getPaymentAccountKey() : null, // buyer receives seller's payment account decryption key
|
||||
trade.getSelf().getUpdatedMultisigHex());
|
||||
}
|
||||
return message;
|
||||
|
@ -35,11 +35,11 @@ public abstract class SendMailboxMessageTask extends TradeTask {
|
||||
}
|
||||
|
||||
protected NodeAddress getReceiverNodeAddress() {
|
||||
return trade.getTradingPeer().getNodeAddress();
|
||||
return trade.getTradePeer().getNodeAddress();
|
||||
}
|
||||
|
||||
protected PubKeyRing getReceiverPubKeyRing() {
|
||||
return trade.getTradingPeer().getPubKeyRing();
|
||||
return trade.getTradePeer().getPubKeyRing();
|
||||
}
|
||||
|
||||
protected abstract TradeMailboxMessage getTradeMailboxMessage(String tradeId);
|
||||
|
@ -23,7 +23,7 @@ import bisq.core.offer.Offer;
|
||||
import bisq.core.payment.payload.PaymentAccountPayload;
|
||||
import bisq.core.trade.ArbitratorTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
|
||||
import bisq.common.crypto.PubKeyRing;
|
||||
import bisq.common.taskrunner.TaskRunner;
|
||||
@ -61,18 +61,18 @@ public class VerifyPeersAccountAgeWitness extends TradeTask {
|
||||
}
|
||||
|
||||
// skip if payment account payload is null
|
||||
TradingPeer tradingPeer = trade.getTradingPeer();
|
||||
if (tradingPeer.getPaymentAccountPayload() == null) {
|
||||
TradePeer tradePeer = trade.getTradePeer();
|
||||
if (tradePeer.getPaymentAccountPayload() == null) {
|
||||
complete();
|
||||
return;
|
||||
}
|
||||
|
||||
AccountAgeWitnessService accountAgeWitnessService = processModel.getAccountAgeWitnessService();
|
||||
PaymentAccountPayload peersPaymentAccountPayload = checkNotNull(tradingPeer.getPaymentAccountPayload(),
|
||||
PaymentAccountPayload peersPaymentAccountPayload = checkNotNull(tradePeer.getPaymentAccountPayload(),
|
||||
"Peers peersPaymentAccountPayload must not be null");
|
||||
PubKeyRing peersPubKeyRing = checkNotNull(tradingPeer.getPubKeyRing(), "peersPubKeyRing must not be null");
|
||||
byte[] nonce = checkNotNull(tradingPeer.getAccountAgeWitnessNonce());
|
||||
byte[] signature = checkNotNull(tradingPeer.getAccountAgeWitnessSignature());
|
||||
PubKeyRing peersPubKeyRing = checkNotNull(tradePeer.getPubKeyRing(), "peersPubKeyRing must not be null");
|
||||
byte[] nonce = checkNotNull(tradePeer.getAccountAgeWitnessNonce());
|
||||
byte[] signature = checkNotNull(tradePeer.getAccountAgeWitnessSignature());
|
||||
AtomicReference<String> errorMsg = new AtomicReference<>();
|
||||
boolean isValid = accountAgeWitnessService.verifyAccountAgeWitness(trade,
|
||||
peersPaymentAccountPayload,
|
||||
@ -81,8 +81,8 @@ public class VerifyPeersAccountAgeWitness extends TradeTask {
|
||||
signature,
|
||||
errorMsg::set);
|
||||
if (isValid) {
|
||||
trade.getTradingPeer().setAccountAgeWitness(processModel.getAccountAgeWitnessService().findWitness(trade.getTradingPeer().getPaymentAccountPayload(), trade.getTradingPeer().getPubKeyRing()).orElse(null));
|
||||
log.info("{} {} verified witness data of peer {}", trade.getClass().getSimpleName(), trade.getId(), tradingPeer.getNodeAddress());
|
||||
trade.getTradePeer().setAccountAgeWitness(processModel.getAccountAgeWitnessService().findWitness(trade.getTradePeer().getPaymentAccountPayload(), trade.getTradePeer().getPubKeyRing()).orElse(null));
|
||||
log.info("{} {} verified witness data of peer {}", trade.getClass().getSimpleName(), trade.getId(), tradePeer.getNodeAddress());
|
||||
complete();
|
||||
} else {
|
||||
failed(errorMsg.get());
|
||||
|
@ -39,7 +39,7 @@ public class FinalizeMediatedPayoutTx extends TradeTask {
|
||||
|
||||
// Transaction depositTx = checkNotNull(trade.getDepositTx());
|
||||
// String tradeId = trade.getId();
|
||||
// TradingPeer tradingPeer = trade.getTradingPeer();
|
||||
// TradePeer tradePeer = trade.getTradePeer();
|
||||
// BtcWalletService walletService = processModel.getBtcWalletService();
|
||||
// Offer offer = checkNotNull(trade.getOffer(), "offer must not be null");
|
||||
// Coin tradeAmount = checkNotNull(trade.getTradeAmount(), "tradeAmount must not be null");
|
||||
@ -50,8 +50,8 @@ public class FinalizeMediatedPayoutTx extends TradeTask {
|
||||
//
|
||||
// byte[] mySignature = checkNotNull(processModel.getMediatedPayoutTxSignature(),
|
||||
// "processModel.getTxSignatureFromMediation must not be null");
|
||||
// byte[] peersSignature = checkNotNull(tradingPeer.getMediatedPayoutTxSignature(),
|
||||
// "tradingPeer.getTxSignatureFromMediation must not be null");
|
||||
// byte[] peersSignature = checkNotNull(tradePeer.getMediatedPayoutTxSignature(),
|
||||
// "tradePeer.getTxSignatureFromMediation must not be null");
|
||||
//
|
||||
// boolean isMyRoleBuyer = contract.isMyRoleBuyer(processModel.getPubKeyRing());
|
||||
// byte[] buyerSignature = isMyRoleBuyer ? mySignature : peersSignature;
|
||||
@ -65,12 +65,12 @@ public class FinalizeMediatedPayoutTx extends TradeTask {
|
||||
// "; sellerPayoutAmount=" + sellerPayoutAmount);
|
||||
//
|
||||
// String myPayoutAddressString = walletService.getOrCreateAddressEntry(tradeId, AddressEntry.Context.TRADE_PAYOUT).getAddressString();
|
||||
// String peersPayoutAddressString = tradingPeer.getPayoutAddressString();
|
||||
// String peersPayoutAddressString = tradePeer.getPayoutAddressString();
|
||||
// String buyerPayoutAddressString = isMyRoleBuyer ? myPayoutAddressString : peersPayoutAddressString;
|
||||
// String sellerPayoutAddressString = isMyRoleBuyer ? peersPayoutAddressString : myPayoutAddressString;
|
||||
//
|
||||
// byte[] myMultiSigPubKey = processModel.getMyMultiSigPubKey();
|
||||
// byte[] peersMultiSigPubKey = tradingPeer.getMultiSigPubKey();
|
||||
// byte[] peersMultiSigPubKey = tradePeer.getMultiSigPubKey();
|
||||
// byte[] buyerMultiSigPubKey = isMyRoleBuyer ? myMultiSigPubKey : peersMultiSigPubKey;
|
||||
// byte[] sellerMultiSigPubKey = isMyRoleBuyer ? peersMultiSigPubKey : myMultiSigPubKey;
|
||||
//
|
||||
|
@ -44,10 +44,10 @@ public class ProcessMediatedPayoutSignatureMessage extends TradeTask {
|
||||
Validator.checkTradeId(processModel.getOfferId(), message);
|
||||
checkNotNull(message);
|
||||
|
||||
trade.getTradingPeer().setMediatedPayoutTxSignature(checkNotNull(message.getTxSignature()));
|
||||
trade.getTradePeer().setMediatedPayoutTxSignature(checkNotNull(message.getTxSignature()));
|
||||
|
||||
// update to the latest peer address of our peer if the message is correct
|
||||
trade.getTradingPeer().setNodeAddress(processModel.getTempTradingPeerNodeAddress());
|
||||
trade.getTradePeer().setNodeAddress(processModel.getTempTradePeerNodeAddress());
|
||||
|
||||
trade.setMediationResultState(MediationResultState.RECEIVED_SIG_MSG);
|
||||
|
||||
|
@ -41,7 +41,7 @@ public class ProcessMediatedPayoutTxPublishedMessage extends TradeTask {
|
||||
// checkArgument(message.getPayoutTx() != null);
|
||||
//
|
||||
// // update to the latest peer address of our peer if the message is correct
|
||||
// trade.getTradingPeer().setNodeAddress(processModel.getTempTradingPeerNodeAddress());
|
||||
// trade.getTradePeer().setNodeAddress(processModel.getTempTradePeerNodeAddress());
|
||||
//
|
||||
// if (trade.getPayoutTx() == null) {
|
||||
// Transaction committedMediatedPayoutTx = WalletService.maybeAddNetworkTxToWallet(message.getPayoutTx(), processModel.getBtcWalletService().getWallet());
|
||||
|
@ -37,7 +37,7 @@ public class SignMediatedPayoutTx extends TradeTask {
|
||||
runInterceptHook();
|
||||
throw new RuntimeException("SignMediatedPayoutTx not implemented for xmr");
|
||||
|
||||
// TradingPeer tradingPeer = trade.getTradingPeer();
|
||||
// TradePeer tradePeer = trade.getTradePeer();
|
||||
// if (processModel.getMediatedPayoutTxSignature() != null) {
|
||||
// log.warn("processModel.getTxSignatureFromMediation is already set");
|
||||
// }
|
||||
@ -60,12 +60,12 @@ public class SignMediatedPayoutTx extends TradeTask {
|
||||
// boolean isMyRoleBuyer = contract.isMyRoleBuyer(processModel.getPubKeyRing());
|
||||
//
|
||||
// String myPayoutAddressString = walletService.getOrCreateAddressEntry(tradeId, AddressEntry.Context.TRADE_PAYOUT).getAddressString();
|
||||
// String peersPayoutAddressString = tradingPeer.getPayoutAddressString();
|
||||
// String peersPayoutAddressString = tradePeer.getPayoutAddressString();
|
||||
// String buyerPayoutAddressString = isMyRoleBuyer ? myPayoutAddressString : peersPayoutAddressString;
|
||||
// String sellerPayoutAddressString = isMyRoleBuyer ? peersPayoutAddressString : myPayoutAddressString;
|
||||
//
|
||||
// byte[] myMultiSigPubKey = processModel.getMyMultiSigPubKey();
|
||||
// byte[] peersMultiSigPubKey = tradingPeer.getMultiSigPubKey();
|
||||
// byte[] peersMultiSigPubKey = tradePeer.getMultiSigPubKey();
|
||||
// byte[] buyerMultiSigPubKey = isMyRoleBuyer ? myMultiSigPubKey : peersMultiSigPubKey;
|
||||
// byte[] sellerMultiSigPubKey = isMyRoleBuyer ? peersMultiSigPubKey : myMultiSigPubKey;
|
||||
//
|
||||
|
@ -1,17 +1,17 @@
|
||||
confirmpaymentstarted
|
||||
confirmpaymentsent
|
||||
|
||||
NAME
|
||||
----
|
||||
confirmpaymentstarted - confirm payment has been sent
|
||||
confirmpaymentsent - confirm payment has been sent
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
confirmpaymentstarted
|
||||
confirmpaymentsent
|
||||
--trade-id=<trade-id>
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
After the buyer initiates payment to the BTC seller, confirmpaymentstarted notifies
|
||||
After the buyer initiates payment to the BTC seller, confirmpaymentsent notifies
|
||||
the seller to begin watching for a funds deposit in her payment account.
|
||||
|
||||
OPTIONS
|
||||
@ -23,4 +23,4 @@ EXAMPLES
|
||||
--------
|
||||
A BTC buyer has taken an offer with ID 83e8b2e2-51b6-4f39-a748-3ebd29c22aea, and has recently
|
||||
initiated the required fiat payment to the seller's fiat account:
|
||||
$ ./bisq-cli --password=xyz --port=9998 confirmpaymentstarted --trade-id=83e8b2e2-51b6-4f39-a748-3ebd29c22aea
|
||||
$ ./bisq-cli --password=xyz --port=9998 confirmpaymentsent --trade-id=83e8b2e2-51b6-4f39-a748-3ebd29c22aea
|
||||
|
@ -605,7 +605,7 @@ portfolio.pending.unconfirmedTooLong=Deposit transactions on trade {0} are still
|
||||
|
||||
portfolio.pending.step1.waitForConf=Wait for blockchain confirmations
|
||||
portfolio.pending.step2_buyer.startPayment=Start payment
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=Wait until payment has started
|
||||
portfolio.pending.step2_seller.waitPaymentSent=Wait until payment has been sent
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=Wait until payment arrived
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=Confirm payment received
|
||||
portfolio.pending.step5.completed=Completed
|
||||
@ -685,7 +685,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Recipients {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=Amount to transfer
|
||||
portfolio.pending.step2_buyer.sellersAddress=Seller''s {0} address
|
||||
portfolio.pending.step2_buyer.buyerAccount=Your payment account to be used
|
||||
portfolio.pending.step2_buyer.paymentStarted=Payment started
|
||||
portfolio.pending.step2_buyer.paymentSent=Payment sent
|
||||
portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
|
||||
portfolio.pending.step2_buyer.openForDispute=You have not completed your payment yet\nThe max. period for the trade has elapsed, but you can still complete the payment.\n\
|
||||
Contact an arbitrator if you need assistance.
|
||||
@ -1083,6 +1083,7 @@ funds.tx.dustAttackTx.popup=This transaction is sending a very small XMR amount
|
||||
####################################################################
|
||||
|
||||
support.tab.mediation.support=Mediation
|
||||
support.tab.refund.support=Refund
|
||||
support.tab.arbitration.support=Arbitration
|
||||
support.tab.legacyArbitration.support=Legacy Arbitration
|
||||
support.tab.ArbitratorsSupportTickets={0}'s tickets
|
||||
@ -1143,8 +1144,8 @@ support.requested=Requested
|
||||
support.closed=Closed
|
||||
support.open=Open
|
||||
support.process=Process
|
||||
support.buyerOfferer=XMR buyer/Maker
|
||||
support.sellerOfferer=XMR seller/Maker
|
||||
support.buyerMaker=XMR buyer/Maker
|
||||
support.sellerMaker=XMR seller/Maker
|
||||
support.buyerTaker=XMR buyer/Taker
|
||||
support.sellerTaker=XMR seller/Taker
|
||||
|
||||
@ -1779,7 +1780,7 @@ displayUpdateDownloadWindow.download.openDir=Open download directory
|
||||
|
||||
disputeSummaryWindow.title=Summary
|
||||
disputeSummaryWindow.openDate=Ticket opening date
|
||||
disputeSummaryWindow.role=Trader's role
|
||||
disputeSummaryWindow.role=Opener's role
|
||||
disputeSummaryWindow.payout=Trade amount payout
|
||||
disputeSummaryWindow.payout.getsTradeAmount=BTC {0} gets trade amount payout
|
||||
disputeSummaryWindow.payout.getsAll=Max. payout to BTC {0}
|
||||
@ -1965,8 +1966,8 @@ tradeDetailsWindow.headline=Trade
|
||||
tradeDetailsWindow.disputedPayoutTxId=Disputed payout transaction ID:
|
||||
tradeDetailsWindow.tradeDate=Trade date
|
||||
tradeDetailsWindow.txFee=Mining fee
|
||||
tradeDetailsWindow.tradingPeersOnion=Trading peers onion address
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradePeersOnion=Trading peers onion address
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradeState=Trade state
|
||||
tradeDetailsWindow.tradePhase=Trade phase
|
||||
tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
|
||||
@ -2065,7 +2066,7 @@ popup.warning.startupFailed.twoInstances=Haveno is already running. You cannot r
|
||||
popup.warning.tradePeriod.halfReached=Your trade with ID {0} has reached the half of the max. allowed trading period and is still not completed.\n\nThe trade period ends on {1}\n\nPlease check your trade state at \"Portfolio/Open trades\" for further information.
|
||||
popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\n\
|
||||
The trade period ended on {1}\n\n\
|
||||
Please check your trade at \"Portfolio/Open trades\" for contacting the mediator.
|
||||
Please check your trade at \"Portfolio/Open trades\" for contacting the arbitrator.
|
||||
popup.warning.noTradingAccountSetup.headline=You have not setup a trading account
|
||||
popup.warning.noTradingAccountSetup.msg=You need to setup a national currency or cryptocurrency account before you can create an offer.\nDo you want to setup an account?
|
||||
popup.warning.noArbitratorsAvailable=There are no arbitrators available.
|
||||
@ -2213,7 +2214,7 @@ notification.ticket.headline=Support ticket for trade with ID {0}
|
||||
notification.trade.completed=The trade is now completed, and you can withdraw your funds.
|
||||
notification.trade.accepted=Your offer has been accepted by a XMR {0}.
|
||||
notification.trade.unlocked=Your trade has been confirmed.\nYou can start the payment now.
|
||||
notification.trade.paymentStarted=The XMR buyer has started the payment.
|
||||
notification.trade.paymentSent=The XMR buyer has sent the payment.
|
||||
notification.trade.selectTrade=Select trade
|
||||
notification.trade.peerOpenedDispute=Your trading peer has opened a {0}.
|
||||
notification.trade.disputeClosed=The {0} has been closed.
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=Došlo k problému s chybějící nebo neplatnou tra
|
||||
|
||||
portfolio.pending.step1.waitForConf=Počkejte na potvrzení na blockchainu
|
||||
portfolio.pending.step2_buyer.startPayment=Zahajte platbu
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=Počkejte, než začne platba
|
||||
portfolio.pending.step2_seller.waitPaymentSent=Počkejte, než začne platba
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=Počkejte, než dorazí platba
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=Potvrďte přijetí platby
|
||||
portfolio.pending.step5.completed=Hotovo
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Příjemci {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=Částka k převodu
|
||||
portfolio.pending.step2_buyer.sellersAddress={0} adresa prodejce
|
||||
portfolio.pending.step2_buyer.buyerAccount=Použijte svůj platební účet
|
||||
portfolio.pending.step2_buyer.paymentStarted=Platba zahájena
|
||||
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.paperReceipt.headline=Odeslali jste papírový doklad prodejci BTC?
|
||||
@ -948,8 +948,8 @@ support.chat=Chat
|
||||
support.closed=Zavřeno
|
||||
support.open=Otevřené
|
||||
support.process=Rozhodnout
|
||||
support.buyerOfferer=Kupující BTC/Tvůrce
|
||||
support.sellerOfferer=Prodejce BTC/Tvůrce
|
||||
support.buyerMaker=Kupující BTC/Tvůrce
|
||||
support.sellerMaker=Prodejce BTC/Tvůrce
|
||||
support.buyerTaker=Kupující BTC/Příjemce
|
||||
support.sellerTaker=Prodávající BTC/Příjemce
|
||||
|
||||
@ -1494,8 +1494,8 @@ tradeDetailsWindow.headline=Obchod
|
||||
tradeDetailsWindow.disputedPayoutTxId=ID sporné platební transakce:
|
||||
tradeDetailsWindow.tradeDate=Datum obchodu
|
||||
tradeDetailsWindow.txFee=Poplatek za těžbu
|
||||
tradeDetailsWindow.tradingPeersOnion=Onion adresa obchodního partnera
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Pubkey hash obchodních partnerů
|
||||
tradeDetailsWindow.tradePeersOnion=Onion adresa obchodního partnera
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Pubkey hash obchodních partnerů
|
||||
tradeDetailsWindow.tradeState=Stav obchodu
|
||||
tradeDetailsWindow.agentAddresses=Rozhodce/Mediátor
|
||||
tradeDetailsWindow.detailData=Detailní data
|
||||
@ -1684,7 +1684,7 @@ notification.ticket.headline=Úkol na 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 BTC {0}.
|
||||
notification.trade.unlocked=Váš obchod má alespoň jedno potvrzení blockchainu.\nPlatbu můžete začít hned teď.
|
||||
notification.trade.paymentStarted=Kupující BTC zahájil platbu.
|
||||
notification.trade.paymentSent=Kupující BTC zahájil platbu.
|
||||
notification.trade.selectTrade=Vyberte obchod
|
||||
notification.trade.peerOpenedDispute=Váš obchodní partner otevřel {0}.
|
||||
notification.trade.disputeClosed={0} byl uzavřen.
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=There is an issue with a missing or invalid transact
|
||||
|
||||
portfolio.pending.step1.waitForConf=Auf Blockchain-Bestätigung warten
|
||||
portfolio.pending.step2_buyer.startPayment=Zahlung beginnen
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=Auf Zahlungsbeginn warten
|
||||
portfolio.pending.step2_seller.waitPaymentSent=Auf Zahlungsbeginn warten
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=Auf Zahlungseingang warten
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=Zahlungseingang bestätigen
|
||||
portfolio.pending.step5.completed=Abgeschlossen
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Empfänger {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=Zu überweisender Betrag
|
||||
portfolio.pending.step2_buyer.sellersAddress={0}-Adresse des Verkäufers
|
||||
portfolio.pending.step2_buyer.buyerAccount=Ihr zu verwendendes Zahlungskonto
|
||||
portfolio.pending.step2_buyer.paymentStarted=Zahlung begonnen
|
||||
portfolio.pending.step2_buyer.paymentSent=Zahlung begonnen
|
||||
portfolio.pending.step2_buyer.warn=Sie haben Ihre {0} Zahlung noch nicht getätigt!\nBeachten Sie bitte, dass der Handel bis {1} abgeschlossen werden muss.
|
||||
portfolio.pending.step2_buyer.openForDispute=Sie haben Ihre Zahlung noch nicht abgeschlossen!\nDie maximale Frist für den Handel ist abgelaufen, bitte wenden Sie sich an den Vermittler, um Hilfe zu erhalten.
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=Haben Sie die Quittung an den BTC-Verkäufer gesendet?
|
||||
@ -948,8 +948,8 @@ support.chat=Chat
|
||||
support.closed=Geschlossen
|
||||
support.open=Offen
|
||||
support.process=Process
|
||||
support.buyerOfferer=BTC-Käufer/Ersteller
|
||||
support.sellerOfferer=BTC-Verkäufer/Ersteller
|
||||
support.buyerMaker=BTC-Käufer/Ersteller
|
||||
support.sellerMaker=BTC-Verkäufer/Ersteller
|
||||
support.buyerTaker=BTC-Käufer/Abnehmer
|
||||
support.sellerTaker=BTC-Verkäufer/Abnehmer
|
||||
|
||||
@ -1494,8 +1494,8 @@ tradeDetailsWindow.headline=Handel
|
||||
tradeDetailsWindow.disputedPayoutTxId=Transaktions-ID der strittigen Auszahlung:
|
||||
tradeDetailsWindow.tradeDate=Handelsdatum
|
||||
tradeDetailsWindow.txFee=Mining-Gebühr
|
||||
tradeDetailsWindow.tradingPeersOnion=Onion-Adresse des Handelspartners
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Trading Peers Pubkey Hash
|
||||
tradeDetailsWindow.tradePeersOnion=Onion-Adresse des Handelspartners
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Trading Peers Pubkey Hash
|
||||
tradeDetailsWindow.tradeState=Handelsstatus
|
||||
tradeDetailsWindow.agentAddresses=Vermittler/Mediator
|
||||
tradeDetailsWindow.detailData=Detaillierte Daten
|
||||
@ -1684,7 +1684,7 @@ notification.ticket.headline=Support-Ticket für den Handel mit der ID {0}
|
||||
notification.trade.completed=Ihr Handel ist jetzt abgeschlossen und Sie können Ihre Gelder abheben.
|
||||
notification.trade.accepted=Ihr Angebot wurde von einem BTC-{0} angenommen.
|
||||
notification.trade.unlocked=Ihr Handel hat wenigstens eine Blockchain-Bestätigung.\nSie können die Zahlung nun beginnen.
|
||||
notification.trade.paymentStarted=Der BTC-Käufer hat die Zahlung begonnen.
|
||||
notification.trade.paymentSent=Der BTC-Käufer hat die Zahlung begonnen.
|
||||
notification.trade.selectTrade=Handel wählen
|
||||
notification.trade.peerOpenedDispute=Ihr Handelspartner hat ein/einen {0} geöffnet.
|
||||
notification.trade.disputeClosed=Der/Das {0} wurde geschlossen.
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=Hay un problema con una transacción inválida o no
|
||||
|
||||
portfolio.pending.step1.waitForConf=Esperar a la confirmación en la cadena de bloques
|
||||
portfolio.pending.step2_buyer.startPayment=Comenzar pago
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=Esperar hasta que el pago se haya iniciado
|
||||
portfolio.pending.step2_seller.waitPaymentSent=Esperar hasta que el pago se haya iniciado
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=Esperar hasta que el pago haya llegado
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=Confirmar recepción de pago
|
||||
portfolio.pending.step5.completed=Completado
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Receptores {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=Cantidad a transferir
|
||||
portfolio.pending.step2_buyer.sellersAddress=Dirección {0} del vendedor
|
||||
portfolio.pending.step2_buyer.buyerAccount=Su cuenta de pago para ser usada
|
||||
portfolio.pending.step2_buyer.paymentStarted=Pago iniciado
|
||||
portfolio.pending.step2_buyer.paymentSent=Pago iniciado
|
||||
portfolio.pending.step2_buyer.warn=¡Todavía no ha realizado su pago {0}!\nPor favor, tenga en cuenta que el pago tiene que completarse antes de {1}.
|
||||
portfolio.pending.step2_buyer.openForDispute=¡No ha completado su pago!\nEl periodo máximo para el intercambio ha concluido. Por favor, contacte con el mediador para abrir una disputa.
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=¿Ha enviado el recibo a el vendedor de BTC?
|
||||
@ -948,8 +948,8 @@ support.chat=Chat
|
||||
support.closed=Cerrado
|
||||
support.open=Abierto
|
||||
support.process=Proceso
|
||||
support.buyerOfferer=comprador/creador BTC
|
||||
support.sellerOfferer=vendedor/creador BTC
|
||||
support.buyerMaker=comprador/creador BTC
|
||||
support.sellerMaker=vendedor/creador BTC
|
||||
support.buyerTaker=comprador/Tomador BTC
|
||||
support.sellerTaker=vendedor/Tomador BTC
|
||||
|
||||
@ -1494,8 +1494,8 @@ tradeDetailsWindow.headline=Intercambio
|
||||
tradeDetailsWindow.disputedPayoutTxId=ID transacción de pago en disputa:
|
||||
tradeDetailsWindow.tradeDate=Fecha de intercambio
|
||||
tradeDetailsWindow.txFee=Comisión de minado
|
||||
tradeDetailsWindow.tradingPeersOnion=Dirección onion de par de intercambio
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Hash de las llaves públicas de pares de intercambio
|
||||
tradeDetailsWindow.tradePeersOnion=Dirección onion de par de intercambio
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Hash de las llaves públicas de pares de intercambio
|
||||
tradeDetailsWindow.tradeState=Estado del intercambio
|
||||
tradeDetailsWindow.agentAddresses=Árbitro/Mediador
|
||||
tradeDetailsWindow.detailData=Detalle de datos
|
||||
@ -1684,7 +1684,7 @@ notification.ticket.headline=Ticket de soporte de intercambio con ID {0}
|
||||
notification.trade.completed=El intercambio se ha completado y puede retirar sus fondos.
|
||||
notification.trade.accepted=Su oferta ha sido aceptada por un {0} BTC
|
||||
notification.trade.unlocked=Su intercambio tiene al menos una confirmación en la cadena de bloques.\nPuede comenzar el pago ahora.
|
||||
notification.trade.paymentStarted=El comprador de BTC ha comenzado el pago.
|
||||
notification.trade.paymentSent=El comprador de BTC ha comenzado el pago.
|
||||
notification.trade.selectTrade=Seleccionar intercambio
|
||||
notification.trade.peerOpenedDispute=Su pareja de intercambio ha abierto un {0}.
|
||||
notification.trade.disputeClosed={0} se ha cerrado.
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=There is an issue with a missing or invalid transact
|
||||
|
||||
portfolio.pending.step1.waitForConf=برای تأییدیه بلاک چین منتظر باشید
|
||||
portfolio.pending.step2_buyer.startPayment=آغاز پرداخت
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=صبر کنید تا پرداخت شروع شود
|
||||
portfolio.pending.step2_seller.waitPaymentSent=صبر کنید تا پرداخت شروع شود
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=صبر کنید تا پرداخت حاصل شود
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=تأیید رسید پرداخت
|
||||
portfolio.pending.step5.completed=تکمیل شده
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Recipients {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=مبلغ انتقال
|
||||
portfolio.pending.step2_buyer.sellersAddress=آدرس {0} فروشنده
|
||||
portfolio.pending.step2_buyer.buyerAccount=حساب پرداخت مورد استفاده
|
||||
portfolio.pending.step2_buyer.paymentStarted=پرداخت آغاز شد
|
||||
portfolio.pending.step2_buyer.paymentSent=پرداخت آغاز شد
|
||||
portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
|
||||
portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.Please contact the mediator for assistance.
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=آیا کاغذ رسید را برای فروشندهی بیتکوین فرستادید؟
|
||||
@ -948,8 +948,8 @@ support.chat=Chat
|
||||
support.closed=بسته
|
||||
support.open=باز
|
||||
support.process=Process
|
||||
support.buyerOfferer=خریدار/سفارش گذار بیتکوین
|
||||
support.sellerOfferer=فروشنده/سفارش گذار بیتکوین
|
||||
support.buyerMaker=خریدار/سفارش گذار بیتکوین
|
||||
support.sellerMaker=فروشنده/سفارش گذار بیتکوین
|
||||
support.buyerTaker=خریدار/پذیرندهی بیتکوین
|
||||
support.sellerTaker=فروشنده/پذیرندهی بیتکوین
|
||||
|
||||
@ -1494,8 +1494,8 @@ tradeDetailsWindow.headline=معامله
|
||||
tradeDetailsWindow.disputedPayoutTxId=شناسه تراکنش پرداختی مورد مناقشه:
|
||||
tradeDetailsWindow.tradeDate=تاریخ معامله
|
||||
tradeDetailsWindow.txFee=کارمزد استخراج
|
||||
tradeDetailsWindow.tradingPeersOnion=آدرس Onion همتایان معامله:
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradePeersOnion=آدرس Onion همتایان معامله:
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradeState=وضعیت معامله
|
||||
tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
|
||||
tradeDetailsWindow.detailData=Detail data
|
||||
@ -1578,7 +1578,7 @@ popup.warning.wrongVersion=شما احتمالاً نسخه اشتباه Bisq ر
|
||||
popup.warning.incompatibleDB=We detected incompatible data base files!\n\nThose database file(s) are not compatible with our current code base:\n{0}\n\nWe made a backup of the corrupted file(s) and applied the default values to a new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application.
|
||||
popup.warning.startupFailed.twoInstances=Bisq در حال اجرا است. شما نمیتوانید دو نمونه از Bisq را اجرا کنید.
|
||||
popup.warning.tradePeriod.halfReached=معامله شما با شناسه {0} نیمی از حداکثر مجاز دوره زمانی معامله را به پایان رسانده و هنوز کامل نشده است. \n\nدوره معامله در {1} به پایان می رسد\n\n لطفا وضعیت معامله خود را در \"سبد سهام/معاملات باز\" برای اطلاعات بیشتر، بررسی کنید.
|
||||
popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
|
||||
popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the arbitrator.
|
||||
popup.warning.noTradingAccountSetup.headline=شما یک حساب معاملاتی را راه اندازی نکرده اید
|
||||
popup.warning.noTradingAccountSetup.msg=قبل از اینکه بتوانید یک پیشنهاد ایجاد کنید، باید یک ارز ملی یا حساب کاربری آلت کوین را تنظیم کنید. \nآیا می خواهید یک حساب کاربری را راه اندازی کنید؟
|
||||
popup.warning.noArbitratorsAvailable=هیچ داوری در دسترس نیست.
|
||||
@ -1684,7 +1684,7 @@ notification.ticket.headline=تیکت پشتیبانی برای معامله ب
|
||||
notification.trade.completed=معامله اکنون کامل شده است و می توانید وجوه خود را برداشت کنید.
|
||||
notification.trade.accepted=پیشنهاد شما توسط BTC {0} پذیرفته شده است.
|
||||
notification.trade.unlocked=معامله شما دارای حداقل یک تایید بلاک چین است.\n شما اکنون می توانید پرداخت را شروع کنید.
|
||||
notification.trade.paymentStarted=خریدار BTC پرداخت را آغاز کرده است.
|
||||
notification.trade.paymentSent=خریدار BTC پرداخت را آغاز کرده است.
|
||||
notification.trade.selectTrade=انتخاب معامله
|
||||
notification.trade.peerOpenedDispute=همتای معامله شما یک {0} را باز کرده است.
|
||||
notification.trade.disputeClosed={0} بسته شده است.
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=Il y'a un problème avec une transaction manquante o
|
||||
|
||||
portfolio.pending.step1.waitForConf=Attendre la confirmation de la blockchain
|
||||
portfolio.pending.step2_buyer.startPayment=Initier le paiement
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=Patientez jusqu'à ce que le paiement soit commencé.
|
||||
portfolio.pending.step2_seller.waitPaymentSent=Patientez jusqu'à ce que le paiement soit commencé.
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=Patientez jusqu'à la réception du paiement
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=Confirmation de paiement reçu
|
||||
portfolio.pending.step5.completed=Terminé
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Destinataires {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=Montant à transférer
|
||||
portfolio.pending.step2_buyer.sellersAddress=Adresse {0} du vendeur
|
||||
portfolio.pending.step2_buyer.buyerAccount=Votre compte de paiement à utiliser
|
||||
portfolio.pending.step2_buyer.paymentStarted=Paiement initié
|
||||
portfolio.pending.step2_buyer.paymentSent=Paiement initié
|
||||
portfolio.pending.step2_buyer.fillInBsqWallet=Payer depuis le portefeuille BSQ
|
||||
portfolio.pending.step2_buyer.warn=Vous n''avez toujours pas effectué votre {0} paiement !\nVeuillez noter que l''échange doit être achevé avant {1}.
|
||||
portfolio.pending.step2_buyer.openForDispute=Vous n'avez pas effectué votre paiement !\nLe délai maximal alloué pour l'échange est écoulé, veuillez contacter le médiateur pour obtenir de l'aide.
|
||||
@ -949,8 +949,8 @@ support.chat=Chat
|
||||
support.closed=Fermé
|
||||
support.open=Ouvert
|
||||
support.process=Processus
|
||||
support.buyerOfferer=Acheteur BTC/Maker
|
||||
support.sellerOfferer=Vendeur BTC/Maker
|
||||
support.buyerMaker=Acheteur BTC/Maker
|
||||
support.sellerMaker=Vendeur BTC/Maker
|
||||
support.buyerTaker=Acheteur BTC/Taker
|
||||
support.sellerTaker=Vendeur BTC/Taker
|
||||
|
||||
@ -1495,8 +1495,8 @@ tradeDetailsWindow.headline=Échange
|
||||
tradeDetailsWindow.disputedPayoutTxId=ID de la transaction de versement contestée :
|
||||
tradeDetailsWindow.tradeDate=Date de l'échange
|
||||
tradeDetailsWindow.txFee=Frais de minage
|
||||
tradeDetailsWindow.tradingPeersOnion=Adresse onion du pair de trading
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Valeur de hachage de la clé publique du partenaire commercial
|
||||
tradeDetailsWindow.tradePeersOnion=Adresse onion du pair de trading
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Valeur de hachage de la clé publique du partenaire commercial
|
||||
tradeDetailsWindow.tradeState=État du trade
|
||||
tradeDetailsWindow.agentAddresses=Arbitre/Médiateur
|
||||
tradeDetailsWindow.detailData=Données détaillées
|
||||
@ -1685,7 +1685,7 @@ notification.ticket.headline=Ticket de support pour l''échange avec l''ID {0}
|
||||
notification.trade.completed=La transaction est maintenant terminée et vous pouvez retirer vos fonds.
|
||||
notification.trade.accepted=Votre ordre a été accepté par un BTC {0}.
|
||||
notification.trade.unlocked=Votre échange avait au moins une confirmation sur la blockchain.\nVous pouvez effectuer le paiement maintenant.
|
||||
notification.trade.paymentStarted=L'acheteur de BTC a initié le paiement.
|
||||
notification.trade.paymentSent=L'acheteur de BTC a initié le paiement.
|
||||
notification.trade.selectTrade=Choisir un trade
|
||||
notification.trade.peerOpenedDispute=Votre pair de trading a ouvert un {0}.
|
||||
notification.trade.disputeClosed=Le {0} a été fermé
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=There is an issue with a missing or invalid transact
|
||||
|
||||
portfolio.pending.step1.waitForConf=Attendi la conferma della blockchain
|
||||
portfolio.pending.step2_buyer.startPayment=Inizia il pagamento
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=Attendi fino all'avvio del pagamento
|
||||
portfolio.pending.step2_seller.waitPaymentSent=Attendi fino all'avvio del pagamento
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=Attendi fino all'arrivo del pagamento
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=Conferma la ricezione del pagamento
|
||||
portfolio.pending.step5.completed=Completato
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Recipients {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=Importo da trasferire
|
||||
portfolio.pending.step2_buyer.sellersAddress=Indirizzo {0} del venditore
|
||||
portfolio.pending.step2_buyer.buyerAccount=Il tuo conto di pagamento da utilizzare
|
||||
portfolio.pending.step2_buyer.paymentStarted=Il pagamento è iniziato
|
||||
portfolio.pending.step2_buyer.paymentSent=Il pagamento è iniziato
|
||||
portfolio.pending.step2_buyer.warn=Non hai ancora effettuato il tuo pagamento {0}!\nSi prega di notare che lo scambio è stato completato da {1}.
|
||||
portfolio.pending.step2_buyer.openForDispute=Non hai completato il pagamento!\nÈ trascorso il massimo periodo di scambio. Si prega di contattare il mediatore per assistenza.
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=Hai inviato la ricevuta cartacea al venditore BTC?
|
||||
@ -948,8 +948,8 @@ support.chat=Chat
|
||||
support.closed=Chiuso
|
||||
support.open=Aperto
|
||||
support.process=Process
|
||||
support.buyerOfferer=Acquirente/Maker BTC
|
||||
support.sellerOfferer=Venditore/Maker BTC
|
||||
support.buyerMaker=Acquirente/Maker BTC
|
||||
support.sellerMaker=Venditore/Maker BTC
|
||||
support.buyerTaker=Acquirente/Taker BTC
|
||||
support.sellerTaker=Venditore/Taker BTC
|
||||
|
||||
@ -1494,8 +1494,8 @@ tradeDetailsWindow.headline=Scambio
|
||||
tradeDetailsWindow.disputedPayoutTxId=ID transazione di pagamento contestato:
|
||||
tradeDetailsWindow.tradeDate=Data di scambio
|
||||
tradeDetailsWindow.txFee=Commissione di mining
|
||||
tradeDetailsWindow.tradingPeersOnion=Indirizzi onion peer di trading
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradePeersOnion=Indirizzi onion peer di trading
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradeState=Stato di scambio
|
||||
tradeDetailsWindow.agentAddresses=Arbitro/Mediatore
|
||||
tradeDetailsWindow.detailData=Detail data
|
||||
@ -1684,7 +1684,7 @@ notification.ticket.headline=Biglietto di supporto per scambi con ID {0}
|
||||
notification.trade.completed=Il commercio è ora completato e puoi ritirare i tuoi fondi.
|
||||
notification.trade.accepted=La tua offerta è stata accettata da un BTC {0}.
|
||||
notification.trade.unlocked=Il tuo trade ha almeno una conferma blockchain.\nPuoi iniziare il pagamento ora.
|
||||
notification.trade.paymentStarted=L'acquirente BTC ha avviato il pagamento.
|
||||
notification.trade.paymentSent=L'acquirente BTC ha avviato il pagamento.
|
||||
notification.trade.selectTrade=Seleziona scambio
|
||||
notification.trade.peerOpenedDispute=Il tuo peer di trading ha aperto un {0}.
|
||||
notification.trade.disputeClosed={0} è stato chiuso.
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=There is an issue with a missing or invalid transact
|
||||
|
||||
portfolio.pending.step1.waitForConf=ブロックチェーンの承認をお待ち下さい
|
||||
portfolio.pending.step2_buyer.startPayment=支払い開始
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=支払いが始まるまでお待ち下さい
|
||||
portfolio.pending.step2_seller.waitPaymentSent=支払いが始まるまでお待ち下さい
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=支払いが到着するまでお待ち下さい
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=支払いを受領したことを確認して下さい
|
||||
portfolio.pending.step5.completed=完了
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=受領者 {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=振替金額
|
||||
portfolio.pending.step2_buyer.sellersAddress=売り手の{0}アドレス
|
||||
portfolio.pending.step2_buyer.buyerAccount=使用されるあなたの支払いアカウント
|
||||
portfolio.pending.step2_buyer.paymentStarted=支払いが開始されました
|
||||
portfolio.pending.step2_buyer.paymentSent=支払いが開始されました
|
||||
portfolio.pending.step2_buyer.warn={0}の支払いはまだ完了していません!\nトレードは{1}までに完了しなければなりません。
|
||||
portfolio.pending.step2_buyer.openForDispute=支払いを完了していません!\nトレードの最大期間が経過しました。助けを求めるには調停人に連絡してください。
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=領収書をBTCの売り手へ送付しましたか?
|
||||
@ -948,8 +948,8 @@ support.chat=Chat
|
||||
support.closed=クローズ
|
||||
support.open=オープン
|
||||
support.process=Process
|
||||
support.buyerOfferer=BTC 買い手/メイカー
|
||||
support.sellerOfferer=BTC 売り手/メイカー
|
||||
support.buyerMaker=BTC 買い手/メイカー
|
||||
support.sellerMaker=BTC 売り手/メイカー
|
||||
support.buyerTaker=BTC 買い手/テイカー
|
||||
support.sellerTaker=BTC 売り手/テイカー
|
||||
|
||||
@ -1494,8 +1494,8 @@ tradeDetailsWindow.headline=トレード
|
||||
tradeDetailsWindow.disputedPayoutTxId=係争中の支払い取引ID:
|
||||
tradeDetailsWindow.tradeDate=取引日
|
||||
tradeDetailsWindow.txFee=マイニング手数料
|
||||
tradeDetailsWindow.tradingPeersOnion=トレード相手のonionアドレス
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=トレードピアのパブリックキーハッシュ
|
||||
tradeDetailsWindow.tradePeersOnion=トレード相手のonionアドレス
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=トレードピアのパブリックキーハッシュ
|
||||
tradeDetailsWindow.tradeState=トレード状態
|
||||
tradeDetailsWindow.agentAddresses=仲裁者 / 調停人
|
||||
tradeDetailsWindow.detailData=詳細データ
|
||||
@ -1684,7 +1684,7 @@ notification.ticket.headline=ID {0}とのトレード用サポートチケット
|
||||
notification.trade.completed=これでトレードは完了し、資金を出金することができます。
|
||||
notification.trade.accepted=あなたのオファーはBTC {0}によって承認されました。
|
||||
notification.trade.unlocked=あなたのトレードには少なくとも1つのブロックチェーン承認があります。\nあなたは今、支払いを始めることができます。
|
||||
notification.trade.paymentStarted=BTCの買い手が支払いを開始しました。
|
||||
notification.trade.paymentSent=BTCの買い手が支払いを開始しました。
|
||||
notification.trade.selectTrade=取引を選択
|
||||
notification.trade.peerOpenedDispute=あなたの取引相手は{0}をオープンしました。
|
||||
notification.trade.disputeClosed={0}は閉じられました。
|
||||
|
@ -557,7 +557,7 @@ portfolio.pending.invalidTx=There is an issue with a missing or invalid transact
|
||||
|
||||
portfolio.pending.step1.waitForConf=Aguardar confirmação da blockchain
|
||||
portfolio.pending.step2_buyer.startPayment=Iniciar pagamento
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=Aguardar início do pagamento
|
||||
portfolio.pending.step2_seller.waitPaymentSent=Aguardar início do pagamento
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=Aguardar recebimento do pagamento
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=Confirmar recebimento do pagamento
|
||||
portfolio.pending.step5.completed=Concluído
|
||||
@ -627,7 +627,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Recipients {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=Quantia a ser transferida
|
||||
portfolio.pending.step2_buyer.sellersAddress=Endereço {0} do vendedor
|
||||
portfolio.pending.step2_buyer.buyerAccount=A sua conta de pagamento a ser usada
|
||||
portfolio.pending.step2_buyer.paymentStarted=Pagamento iniciado
|
||||
portfolio.pending.step2_buyer.paymentSent=Pagamento iniciado
|
||||
portfolio.pending.step2_buyer.warn=Você ainda não realizou seu pagamento de {0}!\nEssa negociação deve ser completada até {1}.
|
||||
portfolio.pending.step2_buyer.openForDispute=Você ainda não completou o seu pagamento!\nO período máximo para a negociação já passou. Entre em contato com o mediador para pedir assistência.
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=Você enviou o comprovante de depósito para o vendedor de BTC?
|
||||
@ -951,8 +951,8 @@ support.chat=Chat
|
||||
support.closed=Fechado
|
||||
support.open=Aberto
|
||||
support.process=Process
|
||||
support.buyerOfferer=Comprador de BTC / Ofetante
|
||||
support.sellerOfferer=Vendedor de BTC / Ofertante
|
||||
support.buyerMaker=Comprador de BTC / Ofetante
|
||||
support.sellerMaker=Vendedor de BTC / Ofertante
|
||||
support.buyerTaker=Comprador de BTC / Aceitador da oferta
|
||||
support.sellerTaker=Vendedor de BTC / Aceitador da oferta
|
||||
|
||||
@ -1499,8 +1499,8 @@ tradeDetailsWindow.headline=Negociação
|
||||
tradeDetailsWindow.disputedPayoutTxId=ID de transação do pagamento disputado:
|
||||
tradeDetailsWindow.tradeDate=Data da negociação
|
||||
tradeDetailsWindow.txFee=Taxa de mineração
|
||||
tradeDetailsWindow.tradingPeersOnion=Endereço onion dos parceiros de negociação
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradePeersOnion=Endereço onion dos parceiros de negociação
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradeState=Estado da negociação
|
||||
tradeDetailsWindow.agentAddresses=Árbitro/Mediador
|
||||
tradeDetailsWindow.detailData=Detail data
|
||||
@ -1692,7 +1692,7 @@ notification.ticket.headline=Ticket de suporte para a oferta com ID {0}
|
||||
notification.trade.completed=A negociação foi concluída e você já pode retirar seus fundos.
|
||||
notification.trade.accepted=Sua oferta foi aceita por um {0}.
|
||||
notification.trade.unlocked=Sua negociação tem pelo menos uma confirmação da blockchain.\nVocê já pode iniciar o pagamento.
|
||||
notification.trade.paymentStarted=O comprador BTC iniciou o pagamento
|
||||
notification.trade.paymentSent=O comprador BTC iniciou o pagamento
|
||||
notification.trade.selectTrade=Selecionar negociação
|
||||
notification.trade.peerOpenedDispute=Seu parceiro de negociação abriu um {0}.
|
||||
notification.trade.disputeClosed=A {0} foi fechada.
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=There is an issue with a missing or invalid transact
|
||||
|
||||
portfolio.pending.step1.waitForConf=Esperando confirmação da blockchain
|
||||
portfolio.pending.step2_buyer.startPayment=Iniciar pagamento
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=Aguardar até que o pagamento inicie
|
||||
portfolio.pending.step2_seller.waitPaymentSent=Aguardar até que o pagamento inicie
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=Aguardar até que o pagamento chegue
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=Confirmar pagamento recebido
|
||||
portfolio.pending.step5.completed=Concluído
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Recipients {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=Quantia a transferir
|
||||
portfolio.pending.step2_buyer.sellersAddress=Endereço {0} do vendedor
|
||||
portfolio.pending.step2_buyer.buyerAccount=A sua conta de pagamento a ser usada
|
||||
portfolio.pending.step2_buyer.paymentStarted=Pagamento iniciado
|
||||
portfolio.pending.step2_buyer.paymentSent=Pagamento iniciado
|
||||
portfolio.pending.step2_buyer.warn=Você ainda não fez o seu pagamento de {0}!\nSaiba que o negócio tem de ser concluído até {1}.
|
||||
portfolio.pending.step2_buyer.openForDispute=Você não completou o seu pagamento!\nO período máx. para o negócio acabou. Por favor entre em contacto com o mediador para assistência.
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=Você enviou o recibo de papel para o vendedor de BTC?
|
||||
@ -948,8 +948,8 @@ support.chat=Chat
|
||||
support.closed=Fechado
|
||||
support.open=Aberto
|
||||
support.process=Process
|
||||
support.buyerOfferer=Comprador de BTC/Ofertante
|
||||
support.sellerOfferer=Vendedor de BTC/Ofertante
|
||||
support.buyerMaker=Comprador de BTC/Ofertante
|
||||
support.sellerMaker=Vendedor de BTC/Ofertante
|
||||
support.buyerTaker=Comprador de BTC/Aceitador
|
||||
support.sellerTaker=Vendedor de BTC/Aceitador
|
||||
|
||||
@ -1492,8 +1492,8 @@ tradeDetailsWindow.headline=Negócio
|
||||
tradeDetailsWindow.disputedPayoutTxId=ID de transação do pagamento disputado:
|
||||
tradeDetailsWindow.tradeDate=Data de negócio
|
||||
tradeDetailsWindow.txFee=Taxa de mineração
|
||||
tradeDetailsWindow.tradingPeersOnion=Endereço onion dos parceiros de negociação
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradePeersOnion=Endereço onion dos parceiros de negociação
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradeState=Estado de negócio
|
||||
tradeDetailsWindow.agentAddresses=Árbitro/Mediador
|
||||
tradeDetailsWindow.detailData=Detail data
|
||||
@ -1682,7 +1682,7 @@ notification.ticket.headline=Bilhete de apoio para o negócio com ID {0}
|
||||
notification.trade.completed=O negócio completou e você já pode levantar seus fundos.
|
||||
notification.trade.accepted=Sua oferta foi aceite por um {0} de BTC.
|
||||
notification.trade.unlocked=Seu negócio tem pelo menos uma confirmação da blockchain.\nVocê pode começar o pagamento agora.
|
||||
notification.trade.paymentStarted=O comprador de BTC iniciou o pagamento
|
||||
notification.trade.paymentSent=O comprador de BTC iniciou o pagamento
|
||||
notification.trade.selectTrade=Selecionar negócio
|
||||
notification.trade.peerOpenedDispute=Seu par de negociação abriu um {0}.
|
||||
notification.trade.disputeClosed=A {0} foi fechada.
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=There is an issue with a missing or invalid transact
|
||||
|
||||
portfolio.pending.step1.waitForConf=Ожидание подтверждения в блокчейне
|
||||
portfolio.pending.step2_buyer.startPayment=Сделать платеж
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=Дождитесь начала платежа
|
||||
portfolio.pending.step2_seller.waitPaymentSent=Дождитесь начала платежа
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=Дождитесь получения платежа
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=Подтвердите получение платежа
|
||||
portfolio.pending.step5.completed=Завершено
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Recipients {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=Сумма для перевода
|
||||
portfolio.pending.step2_buyer.sellersAddress={0}-адрес продавца
|
||||
portfolio.pending.step2_buyer.buyerAccount=Используемый платёжный счет
|
||||
portfolio.pending.step2_buyer.paymentStarted=Платёж начат
|
||||
portfolio.pending.step2_buyer.paymentSent=Платёж начат
|
||||
portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
|
||||
portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.Please contact the mediator for assistance.
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=Вы отослали бумажную квитанцию продавцу ВТС?
|
||||
@ -948,8 +948,8 @@ support.chat=Chat
|
||||
support.closed=Закрыто
|
||||
support.open=Открыто
|
||||
support.process=Process
|
||||
support.buyerOfferer=Покупатель ВТС/мейкер
|
||||
support.sellerOfferer=Продавец ВТС/мейкер
|
||||
support.buyerMaker=Покупатель ВТС/мейкер
|
||||
support.sellerMaker=Продавец ВТС/мейкер
|
||||
support.buyerTaker=Покупатель ВТС/тейкер
|
||||
support.sellerTaker=Продавец BTC/тейкер
|
||||
|
||||
@ -1494,8 +1494,8 @@ tradeDetailsWindow.headline=Сделка
|
||||
tradeDetailsWindow.disputedPayoutTxId=Идент. оспоренной транзакции выплаты:
|
||||
tradeDetailsWindow.tradeDate=Дата сделки
|
||||
tradeDetailsWindow.txFee=Комиссия майнера
|
||||
tradeDetailsWindow.tradingPeersOnion=Оnion-адрес контрагента
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradePeersOnion=Оnion-адрес контрагента
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradeState=Статус сделки
|
||||
tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
|
||||
tradeDetailsWindow.detailData=Detail data
|
||||
@ -1578,7 +1578,7 @@ popup.warning.wrongVersion=Вероятно, у вас установлена н
|
||||
popup.warning.incompatibleDB=We detected incompatible data base files!\n\nThose database file(s) are not compatible with our current code base:\n{0}\n\nWe made a backup of the corrupted file(s) and applied the default values to a new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application.
|
||||
popup.warning.startupFailed.twoInstances=Bisq уже запущен. Нельзя запустить два экземпляра Bisq.
|
||||
popup.warning.tradePeriod.halfReached=Половина макс. допустимого срока сделки с идентификатором {0} истекла, однако она до сих пор не завершена.\n\nСрок сделки заканчивается {1}\n\nДополнительную информацию о состоянии сделки можно узнать в разделе \«Сделки/Текущие сделки\».
|
||||
popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
|
||||
popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the arbitrator.
|
||||
popup.warning.noTradingAccountSetup.headline=Вы не создали торговый счёт
|
||||
popup.warning.noTradingAccountSetup.msg=Перед созданием предложения необходимо создать счета в национальной валюте или альткойнах. \nСоздать счёт?
|
||||
popup.warning.noArbitratorsAvailable=Нет доступных арбитров.
|
||||
@ -1684,7 +1684,7 @@ notification.ticket.headline=Запрос в службу поддержки д
|
||||
notification.trade.completed=Сделка завершена, и вы можете вывести свои средства.
|
||||
notification.trade.accepted=Ваше предложение принял {0} ВТС.
|
||||
notification.trade.unlocked=Ваша сделка была подтверждена в блокчейне не менее одного раза.\nМожете начать оплату.
|
||||
notification.trade.paymentStarted=Покупатель ВТС начал оплату.
|
||||
notification.trade.paymentSent=Покупатель ВТС начал оплату.
|
||||
notification.trade.selectTrade=Выбрать сделку
|
||||
notification.trade.peerOpenedDispute=Ваш контрагент открыл {0}.
|
||||
notification.trade.disputeClosed={0} закрыт.
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=There is an issue with a missing or invalid transact
|
||||
|
||||
portfolio.pending.step1.waitForConf=รอการยืนยันของบล็อกเชน
|
||||
portfolio.pending.step2_buyer.startPayment=เริ่มการชำระเงิน
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=รอจนกว่าการชำระเงินจะเริ่มขึ้น
|
||||
portfolio.pending.step2_seller.waitPaymentSent=รอจนกว่าการชำระเงินจะเริ่มขึ้น
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=รอจนกว่าจะถึงการชำระเงิน
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=การยืนยันการชำระเงินที่ได้รับ
|
||||
portfolio.pending.step5.completed=เสร็จสิ้น
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Recipients {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=จำนวนเงินที่จะโอน
|
||||
portfolio.pending.step2_buyer.sellersAddress=ที่อยู่ของผู้ขาย {0}
|
||||
portfolio.pending.step2_buyer.buyerAccount=บัญชีการชำระเงินที่ต้องการใข้งาน
|
||||
portfolio.pending.step2_buyer.paymentStarted=การชำระเงินเริ่มต้นแล้ว
|
||||
portfolio.pending.step2_buyer.paymentSent=การชำระเงินเริ่มต้นแล้ว
|
||||
portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
|
||||
portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.Please contact the mediator for assistance.
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=คุณได้ส่งใบเสร็จรับเงินให้กับผู้ขาย BTC หรือไม่?
|
||||
@ -948,8 +948,8 @@ support.chat=Chat
|
||||
support.closed=ปิดแล้ว
|
||||
support.open=เปิด
|
||||
support.process=Process
|
||||
support.buyerOfferer=BTC ผู้ซื้อ / ผู้สร้าง
|
||||
support.sellerOfferer= BTC ผู้ขาย/ ผู้สร้าง
|
||||
support.buyerMaker=BTC ผู้ซื้อ / ผู้สร้าง
|
||||
support.sellerMaker= BTC ผู้ขาย/ ผู้สร้าง
|
||||
support.buyerTaker=BTC ผู้ซื้อ / ผู้รับ
|
||||
support.sellerTaker=BTC ผู้ขาย / ผู้รับ
|
||||
|
||||
@ -1494,8 +1494,8 @@ tradeDetailsWindow.headline=ซื้อขาย
|
||||
tradeDetailsWindow.disputedPayoutTxId=รหัส ID ธุรกรรมการจ่ายเงินที่พิพาท:
|
||||
tradeDetailsWindow.tradeDate=วันที่ซื้อขาย
|
||||
tradeDetailsWindow.txFee=ค่าธรรมเนียมการขุด
|
||||
tradeDetailsWindow.tradingPeersOnion=ที่อยู่ของ onion คู่ค้า
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradePeersOnion=ที่อยู่ของ onion คู่ค้า
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradeState=สถานะการค้า
|
||||
tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
|
||||
tradeDetailsWindow.detailData=Detail data
|
||||
@ -1578,7 +1578,7 @@ popup.warning.wrongVersion=คุณอาจมีเวอร์ชั่น B
|
||||
popup.warning.incompatibleDB=We detected incompatible data base files!\n\nThose database file(s) are not compatible with our current code base:\n{0}\n\nWe made a backup of the corrupted file(s) and applied the default values to a new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application.
|
||||
popup.warning.startupFailed.twoInstances=Bisq กำลังทำงานอยู่ คุณไม่สามารถเรียกใช้ Bisq พร้อมกันได้
|
||||
popup.warning.tradePeriod.halfReached=การซื้อขายของคุณที่มีรหัส ID {0} ได้ถึงครึ่งหนึ่งของจำนวนสูงสุดแล้ว อนุญาตให้ซื้อขายได้และยังไม่สมบูรณ์\n\nช่วงเวลาการซื้อขายสิ้นสุดวันที่ {1} \n\nโปรดตรวจสอบสถานะการค้าของคุณที่ \"Portfolio (แฟ้มผลงาน) / เปิดการซื้อขาย \" สำหรับข้อมูลเพิ่มเติม
|
||||
popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
|
||||
popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the arbitrator.
|
||||
popup.warning.noTradingAccountSetup.headline=คุณยังไม่ได้ตั้งค่าบัญชีการซื้อขาย
|
||||
popup.warning.noTradingAccountSetup.msg=คุณต้องตั้งค่าสกุลเงินประจำชาติหรือบัญชี altcoin (เหรียญทางเลือก) ก่อนจึงจะสามารถสร้างข้อเสนอได้\nคุณต้องการตั้งค่าบัญชีหรือไม่
|
||||
popup.warning.noArbitratorsAvailable=ไม่มีผู้ไกล่เกลี่ยสำหรับทำการ
|
||||
@ -1684,7 +1684,7 @@ notification.ticket.headline=ศูนย์ช่วยเหลือสนั
|
||||
notification.trade.completed=การค้าเสร็จสิ้นแล้วและคุณสามารถถอนเงินของคุณได้
|
||||
notification.trade.accepted=ข้อเสนอของคุณได้รับการยอมรับจาก BTC {0} แล้ว
|
||||
notification.trade.unlocked=การซื้อขายของคุณมีการยืนยัน blockchain อย่างน้อยหนึ่งรายการ\nคุณสามารถเริ่มการชำระเงินได้เลย
|
||||
notification.trade.paymentStarted=ผู้ซื้อ BTC ได้เริ่มการชำระเงินแล้ว
|
||||
notification.trade.paymentSent=ผู้ซื้อ BTC ได้เริ่มการชำระเงินแล้ว
|
||||
notification.trade.selectTrade=เลือกการซื้อขาย
|
||||
notification.trade.peerOpenedDispute=เครือข่ายทางการค้าของคุณได้เริ่มต้นเปิดที่ {0}
|
||||
notification.trade.disputeClosed={0} ถูกปิดแล้ว
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=There is an issue with a missing or invalid transact
|
||||
|
||||
portfolio.pending.step1.waitForConf=Đợi xác nhận blockchain
|
||||
portfolio.pending.step2_buyer.startPayment=Bắt đầu thanh toán
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=Đợi đến khi bắt đầu thanh toán
|
||||
portfolio.pending.step2_seller.waitPaymentSent=Đợi đến khi bắt đầu thanh toán
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=Đợi đến khi khoản thanh toán đến
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=Xác nhận đã nhận được thanh toán
|
||||
portfolio.pending.step5.completed=Hoàn thành
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=Recipients {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=Số tiền chuyển
|
||||
portfolio.pending.step2_buyer.sellersAddress=Địa chỉ của người bán {0}
|
||||
portfolio.pending.step2_buyer.buyerAccount=Tài khoản thanh toán sẽ sử dụng
|
||||
portfolio.pending.step2_buyer.paymentStarted=Bắt đầu thanh toán
|
||||
portfolio.pending.step2_buyer.paymentSent=Bắt đầu thanh toán
|
||||
portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed by {1}.
|
||||
portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.Please contact the mediator for assistance.
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=Bạn đã gửi giấy biên nhận cho người bán BTC chưa?
|
||||
@ -950,8 +950,8 @@ support.chat=Chat
|
||||
support.closed=Đóng
|
||||
support.open=Mở
|
||||
support.process=Process
|
||||
support.buyerOfferer=Người mua BTC/Người tạo
|
||||
support.sellerOfferer=Người bán BTC/Người tạo
|
||||
support.buyerMaker=Người mua BTC/Người tạo
|
||||
support.sellerMaker=Người bán BTC/Người tạo
|
||||
support.buyerTaker=Người mua BTC/Người nhận
|
||||
support.sellerTaker=Người bán BTC/Người nhận
|
||||
|
||||
@ -1496,8 +1496,8 @@ tradeDetailsWindow.headline=giao dịch
|
||||
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.tradingPeersOnion=Địa chỉ onion Đối tác giao dịch
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradePeersOnion=Địa chỉ onion Đối tác giao dịch
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=Trading peers pubkey hash
|
||||
tradeDetailsWindow.tradeState=Trạng thái giao dịch
|
||||
tradeDetailsWindow.agentAddresses=Arbitrator/Mediator
|
||||
tradeDetailsWindow.detailData=Detail data
|
||||
@ -1580,7 +1580,7 @@ popup.warning.wrongVersion=Có thể máy tính của bạn có phiên bản Bis
|
||||
popup.warning.incompatibleDB=We detected incompatible data base files!\n\nThose database file(s) are not compatible with our current code base:\n{0}\n\nWe made a backup of the corrupted file(s) and applied the default values to a new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application.
|
||||
popup.warning.startupFailed.twoInstances=Bisq đã chạy. Bạn không thể chạy hai chương trình Bisq.
|
||||
popup.warning.tradePeriod.halfReached=giao dịch của bạn với ID {0} đã qua một nửa thời gian giao dịch cho phép tối đa và vẫn chưa hoàn thành.\n\nThời gian giao dịch kết thúc vào {1}\n\nVui lòng kiểm tra trạng thái giao dịch của bạn tại \"Portfolio/Các giao dịch mở\" để biết thêm thông tin.
|
||||
popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the mediator.
|
||||
popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the arbitrator.
|
||||
popup.warning.noTradingAccountSetup.headline=Bạn chưa thiết lập tài khoản giao dịch
|
||||
popup.warning.noTradingAccountSetup.msg=Bạn cần thiết lập tiền tệ quốc gia hoặc tài khoản altcoin trước khi tạo Báo giá.\nDBạn có muốn thiết lập tài khoản?
|
||||
popup.warning.noArbitratorsAvailable=Hiện không có trọng tài nào
|
||||
@ -1686,7 +1686,7 @@ notification.ticket.headline=Vé hỗ trợ cho giao dịch có ID {0}
|
||||
notification.trade.completed=giao dịch đã hoàn thành và bạn có thể rút tiền.
|
||||
notification.trade.accepted=Chào giá của bạn đã được chấp thuận bởi BTC {0}.
|
||||
notification.trade.unlocked=giao dịch của bạn có ít nhất một xác nhận blockchain.\nBạn có thể bắt đầu thanh toán bây giờ.
|
||||
notification.trade.paymentStarted=Người mua BTC đã bắt đầu thanh toán.
|
||||
notification.trade.paymentSent=Người mua BTC đã bắt đầu thanh toán.
|
||||
notification.trade.selectTrade=Lựa chọn giao dịch
|
||||
notification.trade.peerOpenedDispute=Đối tác giao dịch của bạn đã mở một {0}.
|
||||
notification.trade.disputeClosed={0} đã đóng.
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=There is an issue with a missing or invalid transact
|
||||
|
||||
portfolio.pending.step1.waitForConf=等待区块链确认
|
||||
portfolio.pending.step2_buyer.startPayment=开始付款
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=等待直到付款
|
||||
portfolio.pending.step2_seller.waitPaymentSent=等待直到付款
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=等待直到付款到达
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=确定收到付款
|
||||
portfolio.pending.step5.completed=完成
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=接受 {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=划转数量
|
||||
portfolio.pending.step2_buyer.sellersAddress=卖家的 {0} 地址
|
||||
portfolio.pending.step2_buyer.buyerAccount=您的付款帐户将被使用
|
||||
portfolio.pending.step2_buyer.paymentStarted=付款开始
|
||||
portfolio.pending.step2_buyer.paymentSent=付款开始
|
||||
portfolio.pending.step2_buyer.warn=你还没有完成你的 {0} 付款!\n请注意,交易必须在 {1} 之前完成。
|
||||
portfolio.pending.step2_buyer.openForDispute=您还没有完成您的付款!\n最大交易期限已过。请联系调解员寻求帮助。
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=您是否将纸质收据发送给 BTC 卖家?
|
||||
@ -948,8 +948,8 @@ support.chat=Chat
|
||||
support.closed=关闭
|
||||
support.open=打开
|
||||
support.process=Process
|
||||
support.buyerOfferer=BTC 买家/挂单者
|
||||
support.sellerOfferer=BTC 卖家/挂单者
|
||||
support.buyerMaker=BTC 买家/挂单者
|
||||
support.sellerMaker=BTC 卖家/挂单者
|
||||
support.buyerTaker=BTC 买家/买单者
|
||||
support.sellerTaker=BTC 卖家/买单者
|
||||
|
||||
@ -1495,8 +1495,8 @@ tradeDetailsWindow.headline=交易
|
||||
tradeDetailsWindow.disputedPayoutTxId=纠纷支付交易 ID:
|
||||
tradeDetailsWindow.tradeDate=交易时间
|
||||
tradeDetailsWindow.txFee=矿工手续费
|
||||
tradeDetailsWindow.tradingPeersOnion=交易伙伴匿名地址
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=交易伙伴公钥哈希值
|
||||
tradeDetailsWindow.tradePeersOnion=交易伙伴匿名地址
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=交易伙伴公钥哈希值
|
||||
tradeDetailsWindow.tradeState=交易状态
|
||||
tradeDetailsWindow.agentAddresses=仲裁员/调解员
|
||||
tradeDetailsWindow.detailData=详情数据
|
||||
@ -1688,7 +1688,7 @@ notification.ticket.headline=交易 ID {0} 的帮助话题
|
||||
notification.trade.completed=交易现在完成,您可以提取资金。
|
||||
notification.trade.accepted=您 BTC {0} 的报价被接受。
|
||||
notification.trade.unlocked=您的交易至少有一个区块链确认。\n您现在可以开始付款。
|
||||
notification.trade.paymentStarted=BTC 买家已经开始付款。
|
||||
notification.trade.paymentSent=BTC 买家已经开始付款。
|
||||
notification.trade.selectTrade=选择交易
|
||||
notification.trade.peerOpenedDispute=您的交易对象创建了一个 {0}。
|
||||
notification.trade.disputeClosed=这个 {0} 被关闭。
|
||||
|
@ -554,7 +554,7 @@ portfolio.pending.invalidTx=There is an issue with a missing or invalid transact
|
||||
|
||||
portfolio.pending.step1.waitForConf=等待區塊鏈確認
|
||||
portfolio.pending.step2_buyer.startPayment=開始付款
|
||||
portfolio.pending.step2_seller.waitPaymentStarted=等待直到付款
|
||||
portfolio.pending.step2_seller.waitPaymentSent=等待直到付款
|
||||
portfolio.pending.step3_buyer.waitPaymentArrived=等待直到付款到達
|
||||
portfolio.pending.step3_seller.confirmPaymentReceived=確定收到付款
|
||||
portfolio.pending.step5.completed=完成
|
||||
@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.recipientsAccountData=接受 {0}
|
||||
portfolio.pending.step2_buyer.amountToTransfer=劃轉數量
|
||||
portfolio.pending.step2_buyer.sellersAddress=賣家的 {0} 地址
|
||||
portfolio.pending.step2_buyer.buyerAccount=您的付款帳户將被使用
|
||||
portfolio.pending.step2_buyer.paymentStarted=付款開始
|
||||
portfolio.pending.step2_buyer.paymentSent=付款開始
|
||||
portfolio.pending.step2_buyer.warn=你還沒有完成你的 {0} 付款!\n請注意,交易必須在 {1} 之前完成。
|
||||
portfolio.pending.step2_buyer.openForDispute=您還沒有完成您的付款!\n最大交易期限已過。請聯繫調解員尋求幫助。
|
||||
portfolio.pending.step2_buyer.paperReceipt.headline=您是否將紙質收據發送給 BTC 賣家?
|
||||
@ -948,8 +948,8 @@ support.chat=Chat
|
||||
support.closed=關閉
|
||||
support.open=打開
|
||||
support.process=Process
|
||||
support.buyerOfferer=BTC 買家/掛單者
|
||||
support.sellerOfferer=BTC 賣家/掛單者
|
||||
support.buyerMaker=BTC 買家/掛單者
|
||||
support.sellerMaker=BTC 賣家/掛單者
|
||||
support.buyerTaker=BTC 買家/買單者
|
||||
support.sellerTaker=BTC 賣家/買單者
|
||||
|
||||
@ -1495,8 +1495,8 @@ tradeDetailsWindow.headline=交易
|
||||
tradeDetailsWindow.disputedPayoutTxId=糾紛支付交易 ID:
|
||||
tradeDetailsWindow.tradeDate=交易時間
|
||||
tradeDetailsWindow.txFee=礦工手續費
|
||||
tradeDetailsWindow.tradingPeersOnion=交易夥伴匿名地址
|
||||
tradeDetailsWindow.tradingPeersPubKeyHash=交易夥伴公鑰哈希值
|
||||
tradeDetailsWindow.tradePeersOnion=交易夥伴匿名地址
|
||||
tradeDetailsWindow.tradePeersPubKeyHash=交易夥伴公鑰哈希值
|
||||
tradeDetailsWindow.tradeState=交易狀態
|
||||
tradeDetailsWindow.agentAddresses=仲裁員/調解員
|
||||
tradeDetailsWindow.detailData=Detail data
|
||||
@ -1684,7 +1684,7 @@ notification.ticket.headline=交易 ID {0} 的幫助話題
|
||||
notification.trade.completed=交易現在完成,您可以提取資金。
|
||||
notification.trade.accepted=您 BTC {0} 的報價被接受。
|
||||
notification.trade.unlocked=您的交易至少有一個區塊鏈確認。\n您現在可以開始付款。
|
||||
notification.trade.paymentStarted=BTC 買家已經開始付款。
|
||||
notification.trade.paymentSent=BTC 買家已經開始付款。
|
||||
notification.trade.selectTrade=選擇交易
|
||||
notification.trade.peerOpenedDispute=您的交易對象創建了一個 {0}。
|
||||
notification.trade.disputeClosed=這個 {0} 被關閉。
|
||||
|
@ -23,8 +23,8 @@ import bisq.core.trade.Trade;
|
||||
|
||||
import bisq.proto.grpc.ConfirmPaymentReceivedReply;
|
||||
import bisq.proto.grpc.ConfirmPaymentReceivedRequest;
|
||||
import bisq.proto.grpc.ConfirmPaymentStartedReply;
|
||||
import bisq.proto.grpc.ConfirmPaymentStartedRequest;
|
||||
import bisq.proto.grpc.ConfirmPaymentSentReply;
|
||||
import bisq.proto.grpc.ConfirmPaymentSentRequest;
|
||||
import bisq.proto.grpc.GetChatMessagesReply;
|
||||
import bisq.proto.grpc.GetChatMessagesRequest;
|
||||
import bisq.proto.grpc.GetTradeReply;
|
||||
@ -138,13 +138,13 @@ class GrpcTradesService extends TradesImplBase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void confirmPaymentStarted(ConfirmPaymentStartedRequest req,
|
||||
StreamObserver<ConfirmPaymentStartedReply> responseObserver) {
|
||||
GrpcErrorMessageHandler errorMessageHandler = new GrpcErrorMessageHandler(getConfirmPaymentStartedMethod().getFullMethodName(), responseObserver, exceptionHandler, log);
|
||||
public void confirmPaymentSent(ConfirmPaymentSentRequest req,
|
||||
StreamObserver<ConfirmPaymentSentReply> responseObserver) {
|
||||
GrpcErrorMessageHandler errorMessageHandler = new GrpcErrorMessageHandler(getConfirmPaymentSentMethod().getFullMethodName(), responseObserver, exceptionHandler, log);
|
||||
try {
|
||||
coreApi.confirmPaymentStarted(req.getTradeId(),
|
||||
coreApi.confirmPaymentSent(req.getTradeId(),
|
||||
() -> {
|
||||
var reply = ConfirmPaymentStartedReply.newBuilder().build();
|
||||
var reply = ConfirmPaymentSentReply.newBuilder().build();
|
||||
responseObserver.onNext(reply);
|
||||
responseObserver.onCompleted();
|
||||
},
|
||||
@ -248,7 +248,7 @@ class GrpcTradesService extends TradesImplBase {
|
||||
put(getGetTradeMethod().getFullMethodName(), new GrpcCallRateMeter(30, SECONDS));
|
||||
put(getGetTradesMethod().getFullMethodName(), new GrpcCallRateMeter(10, SECONDS));
|
||||
put(getTakeOfferMethod().getFullMethodName(), new GrpcCallRateMeter(20, SECONDS));
|
||||
put(getConfirmPaymentStartedMethod().getFullMethodName(), new GrpcCallRateMeter(10, SECONDS));
|
||||
put(getConfirmPaymentSentMethod().getFullMethodName(), new GrpcCallRateMeter(10, SECONDS));
|
||||
put(getConfirmPaymentReceivedMethod().getFullMethodName(), new GrpcCallRateMeter(10, SECONDS));
|
||||
put(getCompleteTradeMethod().getFullMethodName(), new GrpcCallRateMeter(10, SECONDS));
|
||||
put(getWithdrawFundsMethod().getFullMethodName(), new GrpcCallRateMeter(1, MINUTES));
|
||||
|
@ -603,9 +603,9 @@ abstract class OfferBookViewModel extends ActivatableViewModel {
|
||||
return closedTradableManager.getTradableList().stream()
|
||||
.filter(e -> e instanceof Trade) // weed out canceled offers
|
||||
.filter(e -> {
|
||||
final Optional<NodeAddress> tradingPeerNodeAddress = e.getOptionalTradingPeerNodeAddress();
|
||||
return tradingPeerNodeAddress.isPresent() &&
|
||||
tradingPeerNodeAddress.get().getFullAddress().equals(offer.getMakerNodeAddress().getFullAddress());
|
||||
final Optional<NodeAddress> tradePeerNodeAddress = e.getOptionalTradePeerNodeAddress();
|
||||
return tradePeerNodeAddress.isPresent() &&
|
||||
tradePeerNodeAddress.get().getFullAddress().equals(offer.getMakerNodeAddress().getFullAddress());
|
||||
})
|
||||
.collect(Collectors.toSet())
|
||||
.size();
|
||||
|
@ -251,7 +251,7 @@ public class PeerInfoWithTagEditor extends Overlay<PeerInfoWithTagEditor> {
|
||||
UserThread.runAfter(() -> {
|
||||
PubKeyRing peersPubKeyRing = null;
|
||||
if (trade != null) {
|
||||
peersPubKeyRing = trade.getTradingPeer().getPubKeyRing();
|
||||
peersPubKeyRing = trade.getTradePeer().getPubKeyRing();
|
||||
} else if (offer != null) {
|
||||
peersPubKeyRing = offer.getPubKeyRing();
|
||||
}
|
||||
|
@ -22,11 +22,15 @@ import bisq.desktop.main.MainView;
|
||||
import bisq.desktop.main.portfolio.PortfolioView;
|
||||
import bisq.desktop.main.portfolio.pendingtrades.PendingTradesView;
|
||||
import bisq.desktop.main.support.SupportView;
|
||||
import bisq.desktop.main.support.dispute.client.DisputeClientView;
|
||||
import bisq.desktop.main.support.dispute.DisputeView;
|
||||
import bisq.desktop.main.support.dispute.agent.arbitration.ArbitratorView;
|
||||
import bisq.desktop.main.support.dispute.client.arbitration.ArbitrationClientView;
|
||||
import bisq.desktop.main.support.dispute.client.mediation.MediationClientView;
|
||||
import bisq.desktop.main.support.dispute.client.refund.RefundClientView;
|
||||
|
||||
import bisq.core.locale.Res;
|
||||
import bisq.core.support.dispute.Dispute;
|
||||
import bisq.core.support.dispute.arbitration.ArbitrationManager;
|
||||
import bisq.core.support.dispute.mediation.MediationManager;
|
||||
import bisq.core.support.dispute.refund.RefundManager;
|
||||
import bisq.core.trade.BuyerTrade;
|
||||
@ -81,6 +85,7 @@ public class NotificationCenter {
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
private final TradeManager tradeManager;
|
||||
private final ArbitrationManager arbitrationManager;
|
||||
private final MediationManager mediationManager;
|
||||
private final RefundManager refundManager;
|
||||
private final Navigation navigation;
|
||||
@ -96,11 +101,13 @@ public class NotificationCenter {
|
||||
|
||||
@Inject
|
||||
public NotificationCenter(TradeManager tradeManager,
|
||||
ArbitrationManager arbitrationManager,
|
||||
MediationManager mediationManager,
|
||||
RefundManager refundManager,
|
||||
Preferences preferences,
|
||||
Navigation navigation) {
|
||||
this.tradeManager = tradeManager;
|
||||
this.arbitrationManager = arbitrationManager;
|
||||
this.mediationManager = mediationManager;
|
||||
this.refundManager = refundManager;
|
||||
this.navigation = navigation;
|
||||
@ -195,7 +202,7 @@ public class NotificationCenter {
|
||||
if (trade instanceof BuyerTrade && phase.ordinal() == Trade.Phase.DEPOSITS_UNLOCKED.ordinal())
|
||||
message = Res.get("notification.trade.unlocked");
|
||||
else if (trade instanceof SellerTrade && phase.ordinal() == Trade.Phase.PAYMENT_SENT.ordinal())
|
||||
message = Res.get("notification.trade.paymentStarted");
|
||||
message = Res.get("notification.trade.paymentSent");
|
||||
}
|
||||
|
||||
if (message != null) {
|
||||
@ -228,7 +235,29 @@ public class NotificationCenter {
|
||||
|
||||
private void onDisputeStateChanged(Trade trade, Trade.DisputeState disputeState) {
|
||||
String message = null;
|
||||
if (refundManager.findDispute(trade.getId()).isPresent()) {
|
||||
if (arbitrationManager.findDispute(trade.getId()).isPresent()) {
|
||||
Dispute dispute = arbitrationManager.findDispute(trade.getId()).get();
|
||||
String disputeOrTicket = dispute.isSupportTicket() ?
|
||||
Res.get("shared.supportTicket") :
|
||||
Res.get("shared.dispute");
|
||||
switch (disputeState) {
|
||||
case NO_DISPUTE:
|
||||
break;
|
||||
case DISPUTE_OPENED:
|
||||
// notify if arbitrator or dispute opener (arbitrator's disputes are in context of each trader, so isOpener() doesn't apply)
|
||||
if (trade.isArbitrator() || !dispute.isOpener()) message = Res.get("notification.trade.peerOpenedDispute", disputeOrTicket);
|
||||
break;
|
||||
case DISPUTE_CLOSED:
|
||||
// skip notifying arbitrator
|
||||
if (!trade.isArbitrator()) message = Res.get("notification.trade.disputeClosed", disputeOrTicket);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (message != null) {
|
||||
goToSupport(trade, message, trade.isArbitrator() ? ArbitratorView.class : ArbitrationClientView.class);
|
||||
}
|
||||
}else if (refundManager.findDispute(trade.getId()).isPresent()) {
|
||||
String disputeOrTicket = refundManager.findDispute(trade.getId()).get().isSupportTicket() ?
|
||||
Res.get("shared.supportTicket") :
|
||||
Res.get("shared.dispute");
|
||||
@ -251,7 +280,7 @@ public class NotificationCenter {
|
||||
break;
|
||||
}
|
||||
if (message != null) {
|
||||
goToSupport(trade, message, false);
|
||||
goToSupport(trade, message, RefundClientView.class);
|
||||
}
|
||||
} else if (mediationManager.findDispute(trade.getId()).isPresent()) {
|
||||
String disputeOrTicket = mediationManager.findDispute(trade.getId()).get().isSupportTicket() ?
|
||||
@ -275,16 +304,13 @@ public class NotificationCenter {
|
||||
break;
|
||||
}
|
||||
if (message != null) {
|
||||
goToSupport(trade, message, true);
|
||||
goToSupport(trade, message, MediationClientView.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void goToSupport(Trade trade, String message, boolean isMediation) {
|
||||
private void goToSupport(Trade trade, String message, Class<? extends DisputeView> viewClass) {
|
||||
Notification notification = new Notification().disputeHeadLine(trade.getShortId()).message(message);
|
||||
Class<? extends DisputeClientView> viewClass = isMediation ?
|
||||
MediationClientView.class :
|
||||
RefundClientView.class;
|
||||
if (navigation.getCurrentPath() != null && !navigation.getCurrentPath().contains(viewClass)) {
|
||||
notification.actionButtonTextWithGoTo("navigation.support")
|
||||
.onAction(() -> navigation.navigateTo(MainView.class, SupportView.class, viewClass))
|
||||
|
@ -267,9 +267,9 @@ public class DisputeSummaryWindow extends Overlay<DisputeSummaryWindow> {
|
||||
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("disputeSummaryWindow.openDate"), DisplayUtils.formatDateTime(dispute.getOpeningDate()));
|
||||
if (dispute.isDisputeOpenerIsMaker()) {
|
||||
if (dispute.isDisputeOpenerIsBuyer())
|
||||
role = Res.get("support.buyerOfferer");
|
||||
role = Res.get("support.buyerMaker");
|
||||
else
|
||||
role = Res.get("support.sellerOfferer");
|
||||
role = Res.get("support.sellerMaker");
|
||||
} else {
|
||||
if (dispute.isDisputeOpenerIsBuyer())
|
||||
role = Res.get("support.buyerTaker");
|
||||
@ -283,6 +283,14 @@ public class DisputeSummaryWindow extends Overlay<DisputeSummaryWindow> {
|
||||
FormattingUtils.formatPrice(contract.getPrice()));
|
||||
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.tradeVolume"),
|
||||
VolumeUtil.formatVolumeWithCode(contract.getTradeVolume()));
|
||||
String tradeFee = Res.getWithColAndCap("shared.buyer") +
|
||||
" " +
|
||||
formatter.formatCoinWithCode(trade.getBuyer() == trade.getMaker() ? trade.getMakerFee() : trade.getTakerFee()) +
|
||||
" / " +
|
||||
Res.getWithColAndCap("shared.seller") +
|
||||
" " +
|
||||
formatter.formatCoinWithCode(trade.getSeller() == trade.getMaker() ? trade.getMakerFee() : trade.getTakerFee());
|
||||
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.tradeFee"), tradeFee);
|
||||
String securityDeposit = Res.getWithColAndCap("shared.buyer") +
|
||||
" " +
|
||||
formatter.formatCoinWithCode(trade.getBuyerSecurityDeposit()) +
|
||||
|
@ -204,7 +204,7 @@ public class TradeDetailsWindow extends Overlay<TradeDetailsWindow> {
|
||||
rows++;
|
||||
if (trade.hasFailed())
|
||||
rows += 2;
|
||||
if (trade.getTradingPeerNodeAddress() != null)
|
||||
if (trade.getTradePeerNodeAddress() != null)
|
||||
rows++;
|
||||
if (showXmrProofResult)
|
||||
rows++;
|
||||
@ -235,12 +235,12 @@ public class TradeDetailsWindow extends Overlay<TradeDetailsWindow> {
|
||||
arbitratorNodeAddress.getFullAddress());
|
||||
}
|
||||
|
||||
if (trade.getTradingPeerNodeAddress() != null)
|
||||
addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("tradeDetailsWindow.tradingPeersOnion"),
|
||||
trade.getTradingPeerNodeAddress().getFullAddress());
|
||||
if (trade.getTradePeerNodeAddress() != null)
|
||||
addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("tradeDetailsWindow.tradePeersOnion"),
|
||||
trade.getTradePeerNodeAddress().getFullAddress());
|
||||
|
||||
if (showXmrProofResult) {
|
||||
// As the window is already overloaded we replace the tradingPeersPubKeyHash field with the auto-conf state
|
||||
// As the window is already overloaded we replace the tradePeersPubKeyHash field with the auto-conf state
|
||||
// if XMR is the currency
|
||||
addConfirmationLabelTextField(gridPane, ++rowIndex,
|
||||
Res.get("portfolio.pending.step3_seller.autoConf.status.label"),
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user