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