mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-07-26 08:25:23 -04:00
Cleanup state handling in domain
This commit is contained in:
parent
77bf67e465
commit
9936dca851
30 changed files with 314 additions and 228 deletions
|
@ -211,8 +211,8 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
||||||
takerTrade.processStateProperty().addListener((ov, oldValue, newValue) -> {
|
takerTrade.processStateProperty().addListener((ov, oldValue, newValue) -> {
|
||||||
log.debug("takerTrade state = " + newValue);
|
log.debug("takerTrade state = " + newValue);
|
||||||
String msg = "";
|
String msg = "";
|
||||||
if (newValue.getErrorMessage() != null)
|
if (takerTrade.getErrorMessage() != null)
|
||||||
msg = "\nError message: " + newValue.getErrorMessage();
|
msg = "\nError message: " + takerTrade.getErrorMessage();
|
||||||
|
|
||||||
switch (newValue) {
|
switch (newValue) {
|
||||||
case TAKE_OFFER_FEE_TX_CREATED:
|
case TAKE_OFFER_FEE_TX_CREATED:
|
||||||
|
@ -235,7 +235,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
||||||
break;
|
break;
|
||||||
case PAYOUT_PUBLISHED:
|
case PAYOUT_PUBLISHED:
|
||||||
break;
|
break;
|
||||||
case UNSPECIFIC_FAULT:
|
case EXCEPTION:
|
||||||
errorMessage.set(msg);
|
errorMessage.set(msg);
|
||||||
takeOfferRequested = false;
|
takeOfferRequested = false;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -58,20 +58,13 @@ public class OffererTrade extends Trade implements Serializable {
|
||||||
public enum OffererProcessState implements ProcessState {
|
public enum OffererProcessState implements ProcessState {
|
||||||
DEPOSIT_PUBLISHED,
|
DEPOSIT_PUBLISHED,
|
||||||
DEPOSIT_CONFIRMED,
|
DEPOSIT_CONFIRMED,
|
||||||
|
|
||||||
FIAT_PAYMENT_STARTED,
|
FIAT_PAYMENT_STARTED,
|
||||||
|
|
||||||
PAYOUT_PUBLISHED,
|
PAYOUT_PUBLISHED,
|
||||||
|
|
||||||
MESSAGE_SENDING_FAILED,
|
MESSAGE_SENDING_FAILED,
|
||||||
UNSPECIFIC_FAULT;
|
UNSPECIFIC_FAULT
|
||||||
|
|
||||||
protected String errorMessage;
|
|
||||||
|
|
||||||
public void setErrorMessage(String errorMessage) {
|
|
||||||
this.errorMessage = errorMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getErrorMessage() {
|
|
||||||
return errorMessage;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected OffererProcessState processState;
|
protected OffererProcessState processState;
|
||||||
|
|
|
@ -58,25 +58,17 @@ public class TakerTrade extends Trade implements Serializable {
|
||||||
TAKE_OFFER_FEE_TX_CREATED,
|
TAKE_OFFER_FEE_TX_CREATED,
|
||||||
TAKE_OFFER_FEE_PUBLISHED,
|
TAKE_OFFER_FEE_PUBLISHED,
|
||||||
TAKE_OFFER_FEE_PUBLISH_FAILED,
|
TAKE_OFFER_FEE_PUBLISH_FAILED,
|
||||||
|
|
||||||
DEPOSIT_PUBLISHED,
|
DEPOSIT_PUBLISHED,
|
||||||
DEPOSIT_CONFIRMED,
|
DEPOSIT_CONFIRMED,
|
||||||
|
|
||||||
FIAT_PAYMENT_STARTED,
|
FIAT_PAYMENT_STARTED,
|
||||||
|
|
||||||
FIAT_PAYMENT_RECEIVED,
|
FIAT_PAYMENT_RECEIVED,
|
||||||
PAYOUT_PUBLISHED,
|
PAYOUT_PUBLISHED,
|
||||||
|
|
||||||
MESSAGE_SENDING_FAILED,
|
MESSAGE_SENDING_FAILED,
|
||||||
UNSPECIFIC_FAULT;
|
EXCEPTION
|
||||||
|
|
||||||
protected String errorMessage;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setErrorMessage(String errorMessage) {
|
|
||||||
this.errorMessage = errorMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getErrorMessage() {
|
|
||||||
return errorMessage;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected TakerProcessState processState;
|
protected TakerProcessState processState;
|
||||||
|
@ -111,26 +103,32 @@ public class TakerTrade extends Trade implements Serializable {
|
||||||
// Setters
|
// Setters
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
public void setProcessState(TakerProcessState processState) {
|
|
||||||
this.processState = processState;
|
|
||||||
processStateProperty.set(processState);
|
|
||||||
|
|
||||||
if (processState == TakerProcessState.UNSPECIFIC_FAULT) {
|
|
||||||
setLifeCycleState(TakerLifeCycleState.FAILED);
|
|
||||||
disposeProtocol();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLifeCycleState(TakerLifeCycleState lifeCycleState) {
|
public void setLifeCycleState(TakerLifeCycleState lifeCycleState) {
|
||||||
this.lifeCycleState = lifeCycleState;
|
this.lifeCycleState = lifeCycleState;
|
||||||
lifeCycleStateProperty.set(lifeCycleState);
|
lifeCycleStateProperty.set(lifeCycleState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setProcessState(TakerProcessState processState) {
|
||||||
|
this.processState = processState;
|
||||||
|
processStateProperty.set(processState);
|
||||||
|
|
||||||
|
if (processState == TakerProcessState.EXCEPTION) {
|
||||||
|
setLifeCycleState(TakerLifeCycleState.FAILED);
|
||||||
|
disposeProtocol();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void setDepositTx(Transaction tx) {
|
public void setDepositTx(Transaction tx) {
|
||||||
this.depositTx = tx;
|
this.depositTx = tx;
|
||||||
setConfidenceListener();
|
setConfidenceListener();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setThrowable(Throwable throwable) {
|
||||||
|
super.setThrowable(throwable);
|
||||||
|
setProcessState(TakerTrade.TakerProcessState.EXCEPTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Getters
|
// Getters
|
||||||
|
|
|
@ -44,9 +44,8 @@ abstract public class Trade implements Serializable {
|
||||||
|
|
||||||
transient protected static final Logger log = LoggerFactory.getLogger(Trade.class);
|
transient protected static final Logger log = LoggerFactory.getLogger(Trade.class);
|
||||||
|
|
||||||
|
|
||||||
public interface ProcessState {
|
public interface ProcessState {
|
||||||
void setErrorMessage(String errorMessage);
|
|
||||||
String getErrorMessage();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface LifeCycleState {
|
public interface LifeCycleState {
|
||||||
|
@ -68,6 +67,8 @@ abstract public class Trade implements Serializable {
|
||||||
protected Peer tradingPeer;
|
protected Peer tradingPeer;
|
||||||
protected int depthInBlocks = 0;
|
protected int depthInBlocks = 0;
|
||||||
|
|
||||||
|
transient protected String errorMessage;
|
||||||
|
transient protected Throwable throwable;
|
||||||
transient protected ObjectProperty<Coin> tradeAmountProperty = new SimpleObjectProperty<>(tradeAmount);
|
transient protected ObjectProperty<Coin> tradeAmountProperty = new SimpleObjectProperty<>(tradeAmount);
|
||||||
transient protected ObjectProperty<Fiat> tradeVolumeProperty = new SimpleObjectProperty<>(getTradeVolume());
|
transient protected ObjectProperty<Fiat> tradeVolumeProperty = new SimpleObjectProperty<>(getTradeVolume());
|
||||||
|
|
||||||
|
@ -159,6 +160,14 @@ abstract public class Trade implements Serializable {
|
||||||
this.payoutTx = tx;
|
this.payoutTx = tx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setErrorMessage(String errorMessage) {
|
||||||
|
this.errorMessage = errorMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setThrowable(Throwable throwable) {
|
||||||
|
this.throwable = throwable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Getters
|
// Getters
|
||||||
|
@ -216,6 +225,14 @@ abstract public class Trade implements Serializable {
|
||||||
return tradeVolumeProperty;
|
return tradeVolumeProperty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getErrorMessage() {
|
||||||
|
return errorMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Throwable getThrowable() {
|
||||||
|
return throwable;
|
||||||
|
}
|
||||||
|
|
||||||
abstract public ReadOnlyObjectProperty<? extends ProcessState> processStateProperty();
|
abstract public ReadOnlyObjectProperty<? extends ProcessState> processStateProperty();
|
||||||
|
|
||||||
abstract public ReadOnlyObjectProperty<? extends LifeCycleState> lifeCycleStateProperty();
|
abstract public ReadOnlyObjectProperty<? extends LifeCycleState> lifeCycleStateProperty();
|
||||||
|
|
|
@ -57,8 +57,9 @@ public class CreateAndSignPayoutTx extends Task<OffererAsBuyerModel> {
|
||||||
model.taker.payoutAmount = takerPayoutAmount;
|
model.taker.payoutAmount = takerPayoutAmount;
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
} catch (Exception e) {
|
} catch (Throwable t) {
|
||||||
failed(e);
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,8 +46,9 @@ public class CreateOffererDepositTxInputs extends Task<OffererAsBuyerModel> {
|
||||||
model.offerer.outputs = result.getOutputs();
|
model.offerer.outputs = result.getOutputs();
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable t) {
|
||||||
failed(e);
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ public class ProcessPayoutTxPublishedMessage extends Task<OffererAsBuyerModel> {
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
failed(t);
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,7 @@ public class ProcessRequestDepositTxInputsMessage extends Task<OffererAsBuyerMod
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
failed(t);
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,7 @@ public class ProcessRequestOffererPublishDepositTxMessage extends Task<OffererAs
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
failed(t);
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||||
import io.bitsquare.common.taskrunner.Task;
|
import io.bitsquare.common.taskrunner.Task;
|
||||||
import io.bitsquare.common.taskrunner.TaskRunner;
|
import io.bitsquare.common.taskrunner.TaskRunner;
|
||||||
import io.bitsquare.p2p.listener.SendMessageListener;
|
import io.bitsquare.p2p.listener.SendMessageListener;
|
||||||
|
import io.bitsquare.trade.OffererTrade;
|
||||||
import io.bitsquare.trade.protocol.trade.messages.RequestTakerDepositPaymentMessage;
|
import io.bitsquare.trade.protocol.trade.messages.RequestTakerDepositPaymentMessage;
|
||||||
import io.bitsquare.trade.protocol.trade.offerer.models.OffererAsBuyerModel;
|
import io.bitsquare.trade.protocol.trade.offerer.models.OffererAsBuyerModel;
|
||||||
|
|
||||||
|
@ -35,6 +36,7 @@ public class RequestTakerDepositPayment extends Task<OffererAsBuyerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doRun() {
|
protected void doRun() {
|
||||||
|
try {
|
||||||
RequestTakerDepositPaymentMessage tradeMessage = new RequestTakerDepositPaymentMessage(
|
RequestTakerDepositPaymentMessage tradeMessage = new RequestTakerDepositPaymentMessage(
|
||||||
model.id,
|
model.id,
|
||||||
model.offerer.connectedOutputsForAllInputs,
|
model.offerer.connectedOutputsForAllInputs,
|
||||||
|
@ -54,8 +56,15 @@ public class RequestTakerDepositPayment extends Task<OffererAsBuyerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleFault() {
|
public void handleFault() {
|
||||||
|
appendToErrorMessage("Sending RequestTakerDepositPaymentMessage failed");
|
||||||
|
model.trade.setErrorMessage(errorMessage);
|
||||||
|
model.trade.setProcessState(OffererTrade.OffererProcessState.MESSAGE_SENDING_FAILED);
|
||||||
failed();
|
failed();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,20 +49,22 @@ public class SendBankTransferStartedMessage extends Task<OffererAsBuyerModel> {
|
||||||
new SendMessageListener() {
|
new SendMessageListener() {
|
||||||
@Override
|
@Override
|
||||||
public void handleResult() {
|
public void handleResult() {
|
||||||
log.trace("Sending BankTransferInitedMessage succeeded.");
|
log.trace("Sending FiatTransferStartedMessage succeeded.");
|
||||||
model.trade.setProcessState(OffererTrade.OffererProcessState.FIAT_PAYMENT_STARTED);
|
model.trade.setProcessState(OffererTrade.OffererProcessState.FIAT_PAYMENT_STARTED);
|
||||||
complete();
|
complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleFault() {
|
public void handleFault() {
|
||||||
failed("Sending BankTransferInitedMessage failed.");
|
appendToErrorMessage("Sending FiatTransferStartedMessage failed");
|
||||||
model.trade.setProcessState(OffererTrade.OffererProcessState.UNSPECIFIC_FAULT);
|
model.trade.setErrorMessage(errorMessage);
|
||||||
|
model.trade.setProcessState(OffererTrade.OffererProcessState.MESSAGE_SENDING_FAILED);
|
||||||
|
failed();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
failed("Sending BankTransferInitedMessage failed.");
|
model.trade.setThrowable(t);
|
||||||
model.trade.setProcessState(OffererTrade.OffererProcessState.UNSPECIFIC_FAULT);
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||||
import io.bitsquare.common.taskrunner.Task;
|
import io.bitsquare.common.taskrunner.Task;
|
||||||
import io.bitsquare.common.taskrunner.TaskRunner;
|
import io.bitsquare.common.taskrunner.TaskRunner;
|
||||||
import io.bitsquare.p2p.listener.SendMessageListener;
|
import io.bitsquare.p2p.listener.SendMessageListener;
|
||||||
|
import io.bitsquare.trade.OffererTrade;
|
||||||
import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage;
|
import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage;
|
||||||
import io.bitsquare.trade.protocol.trade.offerer.models.OffererAsBuyerModel;
|
import io.bitsquare.trade.protocol.trade.offerer.models.OffererAsBuyerModel;
|
||||||
|
|
||||||
|
@ -35,6 +36,7 @@ public class SendDepositTxToTaker extends Task<OffererAsBuyerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doRun() {
|
protected void doRun() {
|
||||||
|
try {
|
||||||
DepositTxPublishedMessage tradeMessage = new DepositTxPublishedMessage(model.id, model.trade.getDepositTx());
|
DepositTxPublishedMessage tradeMessage = new DepositTxPublishedMessage(model.id, model.trade.getDepositTx());
|
||||||
|
|
||||||
model.messageService.sendMessage(model.trade.getTradingPeer(), tradeMessage, new SendMessageListener() {
|
model.messageService.sendMessage(model.trade.getTradingPeer(), tradeMessage, new SendMessageListener() {
|
||||||
|
@ -46,8 +48,15 @@ public class SendDepositTxToTaker extends Task<OffererAsBuyerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleFault() {
|
public void handleFault() {
|
||||||
failed("Sending DepositTxPublishedMessage failed.");
|
appendToErrorMessage("Sending DepositTxPublishedMessage failed");
|
||||||
|
model.trade.setErrorMessage(errorMessage);
|
||||||
|
model.trade.setProcessState(OffererTrade.OffererProcessState.MESSAGE_SENDING_FAILED);
|
||||||
|
failed();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,11 +66,13 @@ public class SignAndPublishDepositTx extends Task<OffererAsBuyerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(@NotNull Throwable t) {
|
public void onFailure(@NotNull Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
failed(t);
|
failed(t);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (Exception e) {
|
} catch (Throwable t) {
|
||||||
failed(e);
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ public class VerifyAndSignContract extends Task<OffererAsBuyerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doRun() {
|
protected void doRun() {
|
||||||
|
try {
|
||||||
Trade trade = model.trade;
|
Trade trade = model.trade;
|
||||||
|
|
||||||
Contract contract = new Contract(
|
Contract contract = new Contract(
|
||||||
|
@ -57,5 +58,9 @@ public class VerifyAndSignContract extends Task<OffererAsBuyerModel> {
|
||||||
trade.setTakerContractSignature(model.taker.contractSignature);
|
trade.setTakerContractSignature(model.taker.contractSignature);
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ public class VerifyTakeOfferFeePayment extends Task<OffererAsBuyerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doRun() {
|
protected void doRun() {
|
||||||
|
try {
|
||||||
//TODO mocked yet, need a confidence listeners
|
//TODO mocked yet, need a confidence listeners
|
||||||
int numOfPeersSeenTx = model.walletService.getNumOfPeersSeenTx(model.getTakeOfferFeeTxId());
|
int numOfPeersSeenTx = model.walletService.getNumOfPeersSeenTx(model.getTakeOfferFeeTxId());
|
||||||
/* if (numOfPeersSeenTx > 2) {
|
/* if (numOfPeersSeenTx > 2) {
|
||||||
|
@ -40,5 +41,9 @@ public class VerifyTakeOfferFeePayment extends Task<OffererAsBuyerModel> {
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ public class VerifyTakerAccount extends Task<OffererAsBuyerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doRun() {
|
protected void doRun() {
|
||||||
|
try {
|
||||||
//TODO mocked yet
|
//TODO mocked yet
|
||||||
if (model.blockChainService.verifyAccountRegistration()) {
|
if (model.blockChainService.verifyAccountRegistration()) {
|
||||||
if (model.blockChainService.isAccountBlackListed(model.taker.accountId, model.taker.fiatAccount)) {
|
if (model.blockChainService.isAccountBlackListed(model.taker.accountId, model.taker.fiatAccount)) {
|
||||||
|
@ -46,5 +47,10 @@ public class VerifyTakerAccount extends Task<OffererAsBuyerModel> {
|
||||||
else {
|
else {
|
||||||
failed("Account registration validation for peer failed.");
|
failed("Account registration validation for peer failed.");
|
||||||
}
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,18 +54,16 @@ public class BroadcastTakeOfferFeeTx extends Task<TakerAsSellerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(@NotNull Throwable t) {
|
public void onFailure(@NotNull Throwable t) {
|
||||||
|
appendToErrorMessage("Take offer fee payment failed. Maybe your network connection was lost. Please try again.");
|
||||||
|
model.trade.setErrorMessage(errorMessage);
|
||||||
model.trade.setProcessState(TakerTrade.TakerProcessState.TAKE_OFFER_FEE_PUBLISH_FAILED);
|
model.trade.setProcessState(TakerTrade.TakerProcessState.TAKE_OFFER_FEE_PUBLISH_FAILED);
|
||||||
|
|
||||||
failed(t);
|
failed(t);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (Exception e) {
|
} catch (Throwable t) {
|
||||||
appendToErrorMessage("Take offer fee payment failed. Maybe your network connection was lost. Please try again.");
|
model.trade.setThrowable(t);
|
||||||
appendToErrorMessage(e.getMessage());
|
failed(t);
|
||||||
|
|
||||||
model.trade.setProcessState(TakerTrade.TakerProcessState.UNSPECIFIC_FAULT);
|
|
||||||
|
|
||||||
failed(e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ public class CreateAndSignContract extends Task<TakerAsSellerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doRun() {
|
protected void doRun() {
|
||||||
|
try {
|
||||||
Trade trade = model.trade;
|
Trade trade = model.trade;
|
||||||
Contract contract = new Contract(
|
Contract contract = new Contract(
|
||||||
model.offer,
|
model.offer,
|
||||||
|
@ -55,5 +56,9 @@ public class CreateAndSignContract extends Task<TakerAsSellerModel> {
|
||||||
trade.setTakerContractSignature(signature);
|
trade.setTakerContractSignature(signature);
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,12 +43,9 @@ public class CreateTakeOfferFeeTx extends Task<TakerAsSellerModel> {
|
||||||
model.trade.setProcessState(TakerTrade.TakerProcessState.TAKE_OFFER_FEE_TX_CREATED);
|
model.trade.setProcessState(TakerTrade.TakerProcessState.TAKE_OFFER_FEE_TX_CREATED);
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
} catch (Exception e) {
|
} catch (Throwable t) {
|
||||||
appendToErrorMessage(e.getMessage());
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
model.trade.setProcessState(TakerTrade.TakerProcessState.UNSPECIFIC_FAULT);
|
|
||||||
|
|
||||||
failed(e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ public class ProcessDepositTxPublishedMessage extends Task<TakerAsSellerModel> {
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
failed(t);
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ public class ProcessFiatTransferStartedMessage extends Task<TakerAsSellerModel>
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
model.trade.setProcessState(TakerTrade.TakerProcessState.UNSPECIFIC_FAULT);
|
model.trade.setThrowable(t);
|
||||||
failed(t);
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,7 @@ public class ProcessRequestTakerDepositPaymentMessage extends Task<TakerAsSeller
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
failed(t);
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||||
import io.bitsquare.common.taskrunner.Task;
|
import io.bitsquare.common.taskrunner.Task;
|
||||||
import io.bitsquare.common.taskrunner.TaskRunner;
|
import io.bitsquare.common.taskrunner.TaskRunner;
|
||||||
import io.bitsquare.p2p.listener.SendMessageListener;
|
import io.bitsquare.p2p.listener.SendMessageListener;
|
||||||
|
import io.bitsquare.trade.TakerTrade;
|
||||||
import io.bitsquare.trade.protocol.trade.messages.PayoutTxPublishedMessage;
|
import io.bitsquare.trade.protocol.trade.messages.PayoutTxPublishedMessage;
|
||||||
import io.bitsquare.trade.protocol.trade.taker.models.TakerAsSellerModel;
|
import io.bitsquare.trade.protocol.trade.taker.models.TakerAsSellerModel;
|
||||||
|
|
||||||
|
@ -35,6 +36,7 @@ public class SendPayoutTxToOfferer extends Task<TakerAsSellerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doRun() {
|
protected void doRun() {
|
||||||
|
try {
|
||||||
PayoutTxPublishedMessage tradeMessage = new PayoutTxPublishedMessage(model.id, model.getPayoutTx());
|
PayoutTxPublishedMessage tradeMessage = new PayoutTxPublishedMessage(model.id, model.getPayoutTx());
|
||||||
model.messageService.sendMessage(model.trade.getTradingPeer(),
|
model.messageService.sendMessage(model.trade.getTradingPeer(),
|
||||||
tradeMessage,
|
tradeMessage,
|
||||||
|
@ -49,8 +51,15 @@ public class SendPayoutTxToOfferer extends Task<TakerAsSellerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleFault() {
|
public void handleFault() {
|
||||||
failed("Sending PayoutTxPublishedMessage failed.");
|
appendToErrorMessage("Sending PayoutTxPublishedMessage failed");
|
||||||
|
model.trade.setErrorMessage(errorMessage);
|
||||||
|
model.trade.setProcessState(TakerTrade.TakerProcessState.MESSAGE_SENDING_FAILED);
|
||||||
|
failed();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,12 +40,12 @@ public class SendRequestDepositTxInputsMessage extends Task<TakerAsSellerModel>
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doRun() {
|
protected void doRun() {
|
||||||
|
try {
|
||||||
RequestDepositTxInputsMessage msg = new RequestDepositTxInputsMessage(
|
RequestDepositTxInputsMessage msg = new RequestDepositTxInputsMessage(
|
||||||
model.id,
|
model.id,
|
||||||
model.getTakeOfferFeeTx().getHashAsString(),
|
model.getTakeOfferFeeTx().getHashAsString(),
|
||||||
model.trade.getTradeAmount(),
|
model.trade.getTradeAmount(),
|
||||||
model.taker.tradeWalletPubKey
|
model.taker.tradeWalletPubKey);
|
||||||
);
|
|
||||||
|
|
||||||
model.messageService.sendMessage(model.trade.getTradingPeer(), msg, new SendMessageListener() {
|
model.messageService.sendMessage(model.trade.getTradingPeer(), msg, new SendMessageListener() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -56,6 +56,7 @@ public class SendRequestDepositTxInputsMessage extends Task<TakerAsSellerModel>
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleFault() {
|
public void handleFault() {
|
||||||
|
log.warn("Sending TakeOfferFeePayedMessage failed. We try a second time.");
|
||||||
// Take offer fee is already paid, so we need to try to get that trade to succeed.
|
// Take offer fee is already paid, so we need to try to get that trade to succeed.
|
||||||
// We try to repeat once and if that fails as well we persist the state for a later retry.
|
// We try to repeat once and if that fails as well we persist the state for a later retry.
|
||||||
if (retryCounter == 0) {
|
if (retryCounter == 0) {
|
||||||
|
@ -63,15 +64,20 @@ public class SendRequestDepositTxInputsMessage extends Task<TakerAsSellerModel>
|
||||||
Platform.runLater(SendRequestDepositTxInputsMessage.this::doRun);
|
Platform.runLater(SendRequestDepositTxInputsMessage.this::doRun);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
appendToErrorMessage("Sending TakeOfferFeePayedMessage to offerer failed. Maybe the network connection was lost or the offerer lost his " +
|
appendToErrorMessage("Sending TakeOfferFeePayedMessage to offerer failed. Maybe the network connection was " +
|
||||||
"connection. " +
|
"lost or the offerer lost his connection. We persisted the state of the trade, please try again later " +
|
||||||
"We persisted the state of the trade, please try again later or cancel that trade.");
|
"or cancel that trade.");
|
||||||
|
|
||||||
|
model.trade.setErrorMessage(errorMessage);
|
||||||
model.trade.setProcessState(TakerTrade.TakerProcessState.MESSAGE_SENDING_FAILED);
|
model.trade.setProcessState(TakerTrade.TakerProcessState.MESSAGE_SENDING_FAILED);
|
||||||
|
|
||||||
failed();
|
failed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -20,6 +20,7 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||||
import io.bitsquare.common.taskrunner.Task;
|
import io.bitsquare.common.taskrunner.Task;
|
||||||
import io.bitsquare.common.taskrunner.TaskRunner;
|
import io.bitsquare.common.taskrunner.TaskRunner;
|
||||||
import io.bitsquare.p2p.listener.SendMessageListener;
|
import io.bitsquare.p2p.listener.SendMessageListener;
|
||||||
|
import io.bitsquare.trade.TakerTrade;
|
||||||
import io.bitsquare.trade.protocol.trade.messages.RequestOffererPublishDepositTxMessage;
|
import io.bitsquare.trade.protocol.trade.messages.RequestOffererPublishDepositTxMessage;
|
||||||
import io.bitsquare.trade.protocol.trade.taker.models.TakerAsSellerModel;
|
import io.bitsquare.trade.protocol.trade.taker.models.TakerAsSellerModel;
|
||||||
|
|
||||||
|
@ -35,6 +36,7 @@ public class SendSignedTakerDepositTx extends Task<TakerAsSellerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doRun() {
|
protected void doRun() {
|
||||||
|
try {
|
||||||
RequestOffererPublishDepositTxMessage tradeMessage = new RequestOffererPublishDepositTxMessage(
|
RequestOffererPublishDepositTxMessage tradeMessage = new RequestOffererPublishDepositTxMessage(
|
||||||
model.id,
|
model.id,
|
||||||
model.taker.fiatAccount,
|
model.taker.fiatAccount,
|
||||||
|
@ -57,8 +59,16 @@ public class SendSignedTakerDepositTx extends Task<TakerAsSellerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleFault() {
|
public void handleFault() {
|
||||||
failed("Sending RequestOffererDepositPublicationMessage failed");
|
appendToErrorMessage("Sending RequestOffererDepositPublicationMessage failed");
|
||||||
|
model.trade.setErrorMessage(errorMessage);
|
||||||
|
model.trade.setProcessState(TakerTrade.TakerProcessState.MESSAGE_SENDING_FAILED);
|
||||||
|
|
||||||
|
failed();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,11 +62,13 @@ public class SignAndPublishPayoutTx extends Task<TakerAsSellerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(@NotNull Throwable t) {
|
public void onFailure(@NotNull Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
failed(t);
|
failed(t);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (Throwable e) {
|
} catch (Throwable t) {
|
||||||
failed(e);
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ import io.bitsquare.common.taskrunner.TaskRunner;
|
||||||
import io.bitsquare.trade.protocol.trade.taker.models.TakerAsSellerModel;
|
import io.bitsquare.trade.protocol.trade.taker.models.TakerAsSellerModel;
|
||||||
|
|
||||||
import org.bitcoinj.core.Transaction;
|
import org.bitcoinj.core.Transaction;
|
||||||
import org.bitcoinj.core.VerificationException;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -43,7 +42,8 @@ public class TakerCommitDepositTx extends Task<TakerAsSellerModel> {
|
||||||
model.trade.setDepositTx(depositTx);
|
model.trade.setDepositTx(depositTx);
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
} catch (VerificationException t) {
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
failed(t);
|
failed(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,6 @@ import io.bitsquare.btc.FeePolicy;
|
||||||
import io.bitsquare.btc.TradeWalletService;
|
import io.bitsquare.btc.TradeWalletService;
|
||||||
import io.bitsquare.common.taskrunner.Task;
|
import io.bitsquare.common.taskrunner.Task;
|
||||||
import io.bitsquare.common.taskrunner.TaskRunner;
|
import io.bitsquare.common.taskrunner.TaskRunner;
|
||||||
import io.bitsquare.trade.TakerTrade;
|
|
||||||
import io.bitsquare.trade.protocol.trade.taker.models.TakerAsSellerModel;
|
import io.bitsquare.trade.protocol.trade.taker.models.TakerAsSellerModel;
|
||||||
|
|
||||||
import org.bitcoinj.core.Coin;
|
import org.bitcoinj.core.Coin;
|
||||||
|
@ -58,12 +57,9 @@ public class TakerCreatesAndSignsDepositTx extends Task<TakerAsSellerModel> {
|
||||||
model.taker.preparedDepositTx = result.getDepositTx();
|
model.taker.preparedDepositTx = result.getDepositTx();
|
||||||
|
|
||||||
complete();
|
complete();
|
||||||
} catch (Exception e) {
|
} catch (Throwable t) {
|
||||||
TakerTrade.TakerProcessState processState = TakerTrade.TakerProcessState.UNSPECIFIC_FAULT;
|
model.trade.setThrowable(t);
|
||||||
processState.setErrorMessage(errorMessage);
|
failed(t);
|
||||||
model.trade.setProcessState(processState);
|
|
||||||
|
|
||||||
failed(e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,11 +33,16 @@ public class VerifyOfferFeePayment extends Task<TakerAsSellerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doRun() {
|
protected void doRun() {
|
||||||
|
try {
|
||||||
//TODO impl. missing
|
//TODO impl. missing
|
||||||
int numOfPeersSeenTx = model.walletService.getNumOfPeersSeenTx(model.getTakeOfferFeeTx().getHashAsString());
|
int numOfPeersSeenTx = model.walletService.getNumOfPeersSeenTx(model.getTakeOfferFeeTx().getHashAsString());
|
||||||
/* if (numOfPeersSeenTx > 2) {
|
/* if (numOfPeersSeenTx > 2) {
|
||||||
resultHandler.handleResult();
|
resultHandler.handleResult();
|
||||||
}*/
|
}*/
|
||||||
complete();
|
complete();
|
||||||
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ public class VerifyOffererAccount extends Task<TakerAsSellerModel> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doRun() {
|
protected void doRun() {
|
||||||
|
try {
|
||||||
if (model.blockChainService.verifyAccountRegistration()) {
|
if (model.blockChainService.verifyAccountRegistration()) {
|
||||||
if (model.blockChainService.isAccountBlackListed(model.offerer.accountId, model.offerer.fiatAccount)) {
|
if (model.blockChainService.isAccountBlackListed(model.offerer.accountId, model.offerer.fiatAccount)) {
|
||||||
failed("Taker is blacklisted.");
|
failed("Taker is blacklisted.");
|
||||||
|
@ -44,5 +45,9 @@ public class VerifyOffererAccount extends Task<TakerAsSellerModel> {
|
||||||
else {
|
else {
|
||||||
failed("Account registration validation for peer faultHandler.onFault.");
|
failed("Account registration validation for peer faultHandler.onFault.");
|
||||||
}
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
model.trade.setThrowable(t);
|
||||||
|
failed(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue