Add requestPersistence calls

We relied on the shutdwon routine to be called reliably but it seems that is not the case as some bug reports show.
So we call requestPersistence at every write access of the trade object
This commit is contained in:
chimp1984 2020-11-17 22:35:51 -05:00
parent 6fc36d48db
commit fa0c28adf6
No known key found for this signature in database
GPG key ID: 9801B4EC591F90E3
46 changed files with 123 additions and 10 deletions

View file

@ -247,6 +247,7 @@ public class WalletAppSetup {
String finalDetails = details;
UserThread.runAfter(() -> {
trade.setErrorMessage(newValue.getMessage());
tradeManager.requestPersistence();
if (rejectedTxErrorMessageHandler != null) {
rejectedTxErrorMessageHandler.accept(Res.get("popup.warning.trade.txRejected",
finalDetails, trade.getShortId(), txId));

View file

@ -395,6 +395,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
if (!storedDisputeOptional.isPresent()) {
disputeList.add(dispute);
trade.setDisputeState(getDisputeStateStartedByPeer());
tradeManager.requestPersistence();
errorMessage = null;
} else {
// valid case if both have opened a dispute and agent was not online.

View file

@ -207,6 +207,7 @@ public final class MediationManager extends DisputeManager<MediationDisputeList>
tradeManager.requestPersistence();
trade.setDisputeState(Trade.DisputeState.MEDIATION_CLOSED);
tradeManager.requestPersistence();
}
} else {
Optional<OpenOffer> openOfferOptional = openOfferManager.getOpenOfferById(tradeId);
@ -243,6 +244,7 @@ public final class MediationManager extends DisputeManager<MediationDisputeList>
DisputeProtocol tradeProtocol = (DisputeProtocol) tradeManager.getTradeProtocol(trade);
trade.setMediationResultState(MediationResultState.MEDIATION_RESULT_ACCEPTED);
tradeManager.requestPersistence();
// 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.
@ -265,5 +267,6 @@ public final class MediationManager extends DisputeManager<MediationDisputeList>
public void rejectMediationResult(Trade trade) {
trade.setMediationResultState(MediationResultState.MEDIATION_RESULT_REJECTED);
tradeManager.requestPersistence();
}
}

View file

@ -205,6 +205,7 @@ public final class RefundManager extends DisputeManager<RefundDisputeList> {
if (trade.getDisputeState() == Trade.DisputeState.REFUND_REQUESTED ||
trade.getDisputeState() == Trade.DisputeState.REFUND_REQUEST_STARTED_BY_PEER) {
trade.setDisputeState(Trade.DisputeState.REFUND_REQUEST_CLOSED);
tradeManager.requestPersistence();
}
} else {
Optional<OpenOffer> openOfferOptional = openOfferManager.getOpenOfferById(tradeId);

View file

@ -164,5 +164,7 @@ public class TraderChatManager extends SupportManager {
trade.getDate().getTime());
chatMessage.setSystemMessage(true);
trade.getChatMessages().add(chatMessage);
requestPersistence();
}
}

View file

@ -700,10 +700,6 @@ public abstract class Trade implements Tradable, Model {
}
}
public void appendErrorMessage(String msg) {
errorMessage = errorMessage == null ? msg : errorMessage + "\n" + msg;
}
public boolean mediationResultAppliedPenaltyToSeller() {
// If mediated payout is same or more then normal payout we enable otherwise a penalty was applied
// by mediators and we keep the confirm disabled to avoid that the seller can complete the trade
@ -1099,6 +1095,9 @@ public abstract class Trade implements Tradable, Model {
private void setConfirmedState() {
// we only apply the state if we are not already further in the process
if (!isDepositConfirmed()) {
// As setState is called here from the trade itself we cannot trigger a requestPersistence call.
// But as we get setupConfidenceListener called at startup anyway there is no issue if it would not be
// persisted in case the shutdown routine did not persist the trade.
setState(State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN);
}
}

View file

@ -342,11 +342,13 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
private void initPersistedTrade(Trade trade) {
initTradeAndProtocol(trade, getTradeProtocol(trade));
trade.updateDepositTxFromWallet();
requestPersistence();
}
private void initTradeAndProtocol(Trade trade, TradeProtocol tradeProtocol) {
tradeProtocol.initialize(processModelServiceProvider, this, trade.getOffer());
trade.initialize(processModelServiceProvider);
requestPersistence();
}
public void requestPersistence() {
@ -544,10 +546,13 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
Date halfTradePeriodDate = trade.getHalfTradePeriodDate();
if (maxTradePeriodDate != null && halfTradePeriodDate != null) {
Date now = new Date();
if (now.after(maxTradePeriodDate))
if (now.after(maxTradePeriodDate)) {
trade.setTradePeriodState(Trade.TradePeriodState.TRADE_PERIOD_OVER);
else if (now.after(halfTradePeriodDate))
requestPersistence();
} else if (now.after(halfTradePeriodDate)) {
trade.setTradePeriodState(Trade.TradePeriodState.SECOND_HALF);
requestPersistence();
}
}
}
});

View file

@ -147,7 +147,10 @@ public abstract class BuyerProtocol extends DisputeProtocol {
errorMessageHandler.handleErrorMessage(errorMessage);
handleTaskRunnerFault(event, errorMessage);
})))
.run(() -> trade.setState(Trade.State.BUYER_CONFIRMED_IN_UI_FIAT_PAYMENT_INITIATED))
.run(() -> {
trade.setState(Trade.State.BUYER_CONFIRMED_IN_UI_FIAT_PAYMENT_INITIATED);
processModel.getTradeManager().requestPersistence();
})
.executeTasks();
}

View file

@ -141,7 +141,10 @@ public abstract class SellerProtocol extends DisputeProtocol {
errorMessageHandler.handleErrorMessage(errorMessage);
handleTaskRunnerFault(event, errorMessage);
})))
.run(() -> trade.setState(Trade.State.SELLER_CONFIRMED_IN_UI_FIAT_PAYMENT_RECEIPT))
.run(() -> {
trade.setState(Trade.State.SELLER_CONFIRMED_IN_UI_FIAT_PAYMENT_RECEIPT);
processModel.getTradeManager().requestPersistence();
})
.executeTasks();
}

View file

@ -297,6 +297,8 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
log.error("Timeout reached. TradeID={}, state={}, timeoutSec={}",
trade.getId(), trade.stateProperty().get(), timeoutSec);
trade.setErrorMessage("Timeout reached. Protocol did not complete in " + timeoutSec + " sec.");
processModel.getTradeManager().requestPersistence();
cleanup();
}, timeoutSec);
}

View file

@ -52,6 +52,8 @@ public class ProcessPeerPublishedDelayedPayoutTxMessage extends TradeTask {
Transaction delayedPayoutTx = checkNotNull(trade.getDelayedPayoutTx());
WalletService.maybeAddSelfTxToWallet(delayedPayoutTx, processModel.getBtcWalletService().getWallet());
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -91,6 +91,7 @@ public abstract class SetupPayoutTxListener extends TradeTask {
if (trade.getPayoutTx() == null) {
Transaction walletTx = processModel.getTradeWalletService().getWalletTx(confidence.getTransactionHash());
trade.setPayoutTx(walletTx);
processModel.getTradeManager().requestPersistence();
BtcWalletService.printTx("payoutTx received from network", walletTx);
setState();
} else {

View file

@ -40,6 +40,8 @@ public abstract class TradeTask extends Task<Trade> {
@Override
protected void failed() {
trade.setErrorMessage(errorMessage);
processModel.getTradeManager().requestPersistence();
super.failed();
}
@ -47,6 +49,8 @@ public abstract class TradeTask extends Task<Trade> {
protected void failed(String message) {
appendToErrorMessage(message);
trade.setErrorMessage(errorMessage);
processModel.getTradeManager().requestPersistence();
super.failed();
}
@ -55,6 +59,8 @@ public abstract class TradeTask extends Task<Trade> {
t.printStackTrace();
appendExceptionToErrorMessage(t);
trade.setErrorMessage(errorMessage);
processModel.getTradeManager().requestPersistence();
super.failed();
}
}

View file

@ -54,6 +54,8 @@ public class BuyerProcessDelayedPayoutTxSignatureRequest extends TradeTask {
trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -73,6 +73,8 @@ public class BuyerProcessDepositTxAndDelayedPayoutTxMessage extends TradeTask {
processModel.getBtcWalletService().swapTradeEntryToAvailableEntry(trade.getId(),
AddressEntry.Context.RESERVED_FOR_TRADE);
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -73,6 +73,8 @@ public class BuyerProcessPayoutTxPublishedMessage extends TradeTask {
processModel.getAccountAgeWitnessService().publishOwnSignedWitness(signedWitness);
}
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -83,11 +83,15 @@ public class BuyerSendCounterCurrencyTransferStartedMessage extends SendMailboxM
@Override
protected void setStateSent() {
trade.setStateIfValidTransitionTo(Trade.State.BUYER_SENT_FIAT_PAYMENT_INITIATED_MSG);
processModel.getTradeManager().requestPersistence();
}
@Override
protected void setStateArrived() {
trade.setStateIfValidTransitionTo(Trade.State.BUYER_SAW_ARRIVED_FIAT_PAYMENT_INITIATED_MSG);
processModel.getTradeManager().requestPersistence();
cleanup();
// Complete is called in base class
}
@ -104,6 +108,7 @@ public class BuyerSendCounterCurrencyTransferStartedMessage extends SendMailboxM
if (!trade.isPayoutPublished()) {
tryToSendAgainLater();
}
processModel.getTradeManager().requestPersistence();
}
// We override the default behaviour for onFault and do not call appendToErrorMessage and failed
@ -118,6 +123,7 @@ public class BuyerSendCounterCurrencyTransferStartedMessage extends SendMailboxM
if (!trade.isPayoutPublished()) {
tryToSendAgainLater();
}
processModel.getTradeManager().requestPersistence();
}
@Override
@ -173,6 +179,9 @@ public class BuyerSendCounterCurrencyTransferStartedMessage extends SendMailboxM
if (newValue == MessageState.ACKNOWLEDGED) {
// We treat a ACK like BUYER_SAW_ARRIVED_FIAT_PAYMENT_INITIATED_MSG
trade.setStateIfValidTransitionTo(Trade.State.BUYER_SAW_ARRIVED_FIAT_PAYMENT_INITIATED_MSG);
processModel.getTradeManager().requestPersistence();
cleanup();
complete();
}

View file

@ -100,6 +100,8 @@ public class BuyerSetupDepositTxListener extends TradeTask {
// We don't want to trigger the tradeStateSubscription when setting the state, so we unsubscribe before
unSubscribeAndRemoveListener();
trade.setState(Trade.State.BUYER_SAW_DEPOSIT_TX_IN_NETWORK);
processModel.getTradeManager().requestPersistence();
} else {
unSubscribeAndRemoveListener();
}

View file

@ -45,5 +45,7 @@ public class BuyerSetupPayoutTxListener extends SetupPayoutTxListener {
@Override
protected void setState() {
trade.setStateIfValidTransitionTo(Trade.State.BUYER_SAW_PAYOUT_TX_IN_NETWORK);
processModel.getTradeManager().requestPersistence();
}
}

View file

@ -88,6 +88,8 @@ public class BuyerAsTakerSignsDepositTx extends TradeTask {
sellerMultiSigPubKey);
processModel.setDepositTx(depositTx);
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -95,6 +95,8 @@ public class MakerCreateAndSignContract extends TradeTask {
processModel.setMyMultiSigPubKey(makerMultiSigPubKey);
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -89,7 +89,7 @@ public abstract class MakerSendsInputsForDepositTxResponse extends TradeTask {
trade.getLockTime());
trade.setState(Trade.State.MAKER_SENT_PUBLISH_DEPOSIT_TX_REQUEST);
processModel.getTradeManager().requestPersistence();
NodeAddress peersNodeAddress = trade.getTradingPeerNodeAddress();
log.info("Send {} to peer {}. tradeId={}, uid={}",
message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
@ -103,6 +103,7 @@ public abstract class MakerSendsInputsForDepositTxResponse extends TradeTask {
log.info("{} arrived at peer {}. tradeId={}, uid={}",
message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
trade.setState(Trade.State.MAKER_SAW_ARRIVED_PUBLISH_DEPOSIT_TX_REQUEST);
processModel.getTradeManager().requestPersistence();
complete();
}
@ -112,6 +113,7 @@ public abstract class MakerSendsInputsForDepositTxResponse extends TradeTask {
message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid(), errorMessage);
trade.setState(Trade.State.MAKER_SEND_FAILED_PUBLISH_DEPOSIT_TX_REQUEST);
appendToErrorMessage("Sending message failed: message=" + message + "\nerrorMessage=" + errorMessage);
processModel.getTradeManager().requestPersistence();
failed(errorMessage);
}
}

View file

@ -47,6 +47,8 @@ public class MakerSetsLockTime extends TradeTask {
log.info("lockTime={}, delay={}", lockTime, delay);
trade.setLockTime(lockTime);
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -45,5 +45,6 @@ public class BroadcastMediatedPayoutTx extends BroadcastPayoutTx {
@Override
protected void setState() {
trade.setMediationResultState(MediationResultState.PAYOUT_TX_PUBLISHED);
processModel.getTradeManager().requestPersistence();
}
}

View file

@ -108,6 +108,8 @@ public class FinalizeMediatedPayoutTx extends TradeTask {
trade.setPayoutTx(transaction);
processModel.getTradeManager().requestPersistence();
walletService.swapTradeEntryToAvailableEntry(tradeId, AddressEntry.Context.MULTI_SIG);
complete();

View file

@ -51,6 +51,8 @@ public class ProcessMediatedPayoutSignatureMessage extends TradeTask {
trade.setMediationResultState(MediationResultState.RECEIVED_SIG_MSG);
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -74,6 +74,9 @@ public class ProcessMediatedPayoutTxPublishedMessage extends TradeTask {
} else {
log.info("We got the payout tx already set from BuyerSetupPayoutTxListener and do nothing here. trade ID={}", trade.getId());
}
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -60,6 +60,7 @@ public class SendMediatedPayoutSignatureMessage extends TradeTask {
message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
trade.setMediationResultState(MediationResultState.SIG_MSG_SENT);
processModel.getTradeManager().requestPersistence();
p2PService.sendEncryptedMailboxMessage(peersNodeAddress,
peersPubKeyRing,
message,
@ -70,6 +71,7 @@ public class SendMediatedPayoutSignatureMessage extends TradeTask {
message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
trade.setMediationResultState(MediationResultState.SIG_MSG_ARRIVED);
processModel.getTradeManager().requestPersistence();
complete();
}
@ -79,6 +81,7 @@ public class SendMediatedPayoutSignatureMessage extends TradeTask {
message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid());
trade.setMediationResultState(MediationResultState.SIG_MSG_IN_MAILBOX);
processModel.getTradeManager().requestPersistence();
complete();
}
@ -88,6 +91,7 @@ public class SendMediatedPayoutSignatureMessage extends TradeTask {
message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid(), errorMessage);
trade.setMediationResultState(MediationResultState.SIG_MSG_SEND_FAILED);
appendToErrorMessage("Sending message failed: message=" + message + "\nerrorMessage=" + errorMessage);
processModel.getTradeManager().requestPersistence();
failed(errorMessage);
}
}

View file

@ -54,21 +54,25 @@ public class SendMediatedPayoutTxPublishedMessage extends SendMailboxMessageTask
@Override
protected void setStateSent() {
trade.setMediationResultState(MediationResultState.PAYOUT_TX_PUBLISHED_MSG_SENT);
processModel.getTradeManager().requestPersistence();
}
@Override
protected void setStateArrived() {
trade.setMediationResultState(MediationResultState.PAYOUT_TX_PUBLISHED_MSG_ARRIVED);
processModel.getTradeManager().requestPersistence();
}
@Override
protected void setStateStoredInMailbox() {
trade.setMediationResultState(MediationResultState.PAYOUT_TX_PUBLISHED_MSG_IN_MAILBOX);
processModel.getTradeManager().requestPersistence();
}
@Override
protected void setStateFault() {
trade.setMediationResultState(MediationResultState.PAYOUT_TX_PUBLISHED_MSG_SEND_FAILED);
processModel.getTradeManager().requestPersistence();
}
@Override

View file

@ -49,5 +49,6 @@ public class SetupMediatedPayoutTxListener extends SetupPayoutTxListener {
if (trade.getPayoutTx() != null) {
processModel.getTradeManager().closeDisputedTrade(trade.getId(), Trade.DisputeState.MEDIATION_CLOSED);
}
processModel.getTradeManager().requestPersistence();
}
}

View file

@ -44,5 +44,6 @@ public class SellerBroadcastPayoutTx extends BroadcastPayoutTx {
@Override
protected void setState() {
trade.setState(Trade.State.SELLER_PUBLISHED_PAYOUT_TX);
processModel.getTradeManager().requestPersistence();
}
}

View file

@ -68,6 +68,8 @@ public class SellerFinalizesDelayedPayoutTx extends TradeTask {
trade.applyDelayedPayoutTx(signedDelayedPayoutTx);
log.info("DelayedPayoutTxBytes = {}", Utilities.bytesAsHexString(trade.getDelayedPayoutTxBytes()));
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -61,6 +61,8 @@ public class SellerProcessCounterCurrencyTransferStartedMessage extends TradeTas
trade.setState(Trade.State.SELLER_RECEIVED_FIAT_PAYMENT_INITIATED_MSG);
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -47,6 +47,8 @@ public class SellerProcessDelayedPayoutTxSignatureResponse extends TradeTask {
// update to the latest peer address of our peer if the message is correct
trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -54,6 +54,8 @@ public class SellerPublishesDepositTx extends TradeTask {
processModel.getBtcWalletService().swapTradeEntryToAvailableEntry(processModel.getOffer().getId(),
AddressEntry.Context.RESERVED_FOR_TRADE);
processModel.getTradeManager().requestPersistence();
complete();
} else {
log.warn("We got the onSuccess callback called after the timeout has been triggered a complete().");

View file

@ -65,6 +65,7 @@ public class SellerSendPayoutTxPublishedMessage extends SendMailboxMessageTask {
trade.setState(Trade.State.SELLER_SENT_PAYOUT_TX_PUBLISHED_MSG);
log.info("Sent PayoutTxPublishedMessage: tradeId={} at peer {} SignedWitness {}",
trade.getId(), trade.getTradingPeerNodeAddress(), signedWitness);
processModel.getTradeManager().requestPersistence();
}
@Override
@ -72,6 +73,7 @@ public class SellerSendPayoutTxPublishedMessage extends SendMailboxMessageTask {
trade.setState(Trade.State.SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG);
log.info("PayoutTxPublishedMessage arrived: tradeId={} at peer {} SignedWitness {}",
trade.getId(), trade.getTradingPeerNodeAddress(), signedWitness);
processModel.getTradeManager().requestPersistence();
}
@Override
@ -79,6 +81,7 @@ public class SellerSendPayoutTxPublishedMessage extends SendMailboxMessageTask {
trade.setState(Trade.State.SELLER_STORED_IN_MAILBOX_PAYOUT_TX_PUBLISHED_MSG);
log.info("PayoutTxPublishedMessage storedInMailbox: tradeId={} at peer {} SignedWitness {}",
trade.getId(), trade.getTradingPeerNodeAddress(), signedWitness);
processModel.getTradeManager().requestPersistence();
}
@Override
@ -86,6 +89,7 @@ public class SellerSendPayoutTxPublishedMessage extends SendMailboxMessageTask {
trade.setState(Trade.State.SELLER_SEND_FAILED_PAYOUT_TX_PUBLISHED_MSG);
log.error("PayoutTxPublishedMessage failed: tradeId={} at peer {} SignedWitness {}",
trade.getId(), trade.getTradingPeerNodeAddress(), signedWitness);
processModel.getTradeManager().requestPersistence();
}
@Override

View file

@ -76,11 +76,15 @@ public class SellerSendsDepositTxAndDelayedPayoutTxMessage extends SendMailboxMe
@Override
protected void setStateSent() {
trade.setStateIfValidTransitionTo(Trade.State.SELLER_SENT_DEPOSIT_TX_PUBLISHED_MSG);
processModel.getTradeManager().requestPersistence();
}
@Override
protected void setStateArrived() {
trade.setStateIfValidTransitionTo(Trade.State.SELLER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG);
processModel.getTradeManager().requestPersistence();
cleanup();
// Complete is called in base class
}
@ -94,6 +98,8 @@ public class SellerSendsDepositTxAndDelayedPayoutTxMessage extends SendMailboxMe
@Override
protected void setStateStoredInMailbox() {
trade.setStateIfValidTransitionTo(Trade.State.SELLER_STORED_IN_MAILBOX_DEPOSIT_TX_PUBLISHED_MSG);
processModel.getTradeManager().requestPersistence();
// The DepositTxAndDelayedPayoutTxMessage is a mailbox message as earlier we use only the deposit tx which can
// be also received from the network once published.
// Now we send the delayed payout tx as well and with that this message is mandatory for continuing the protocol.
@ -119,6 +125,8 @@ public class SellerSendsDepositTxAndDelayedPayoutTxMessage extends SendMailboxMe
if (!trade.isDepositConfirmed()) {
tryToSendAgainLater();
}
processModel.getTradeManager().requestPersistence();
}
@Override
@ -173,6 +181,8 @@ public class SellerSendsDepositTxAndDelayedPayoutTxMessage extends SendMailboxMe
if (newValue == MessageState.ACKNOWLEDGED) {
// We treat a ACK like SELLER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG
trade.setStateIfValidTransitionTo(Trade.State.SELLER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG);
processModel.getTradeManager().requestPersistence();
cleanup();
complete();
}

View file

@ -100,6 +100,8 @@ public class SellerSignAndFinalizePayoutTx extends TradeTask {
trade.setPayoutTx(transaction);
processModel.getTradeManager().requestPersistence();
walletService.swapTradeEntryToAvailableEntry(id, AddressEntry.Context.MULTI_SIG);
complete();

View file

@ -103,6 +103,8 @@ public class SellerAsMakerCreatesUnsignedDepositTx extends TradeTask {
processModel.setPreparedDepositTx(result.depositTransaction);
processModel.setRawTransactionInputs(result.rawMakerInputs);
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -51,6 +51,8 @@ public class SellerAsMakerProcessDepositTxMessage extends TradeTask {
// but that cannot be changed due backward compatibility issues. It is a left over from the old trade protocol.
trade.setTakerFeeTxId(processModel.getTakeOfferFeeTxId());
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -83,6 +83,8 @@ public class TakerProcessesInputsForDepositTxResponse extends TradeTask {
// update to the latest peer address of our peer if the message is correct
trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
processModel.getTradeManager().requestPersistence();
complete();
} catch (Throwable t) {
failed(t);

View file

@ -110,6 +110,9 @@ public class TakerPublishFeeTx extends TradeTask {
if (transaction != null) {
trade.setTakerFeeTxId(transaction.getTxId().toString());
trade.setState(Trade.State.TAKER_PUBLISHED_TAKER_FEE_TX);
processModel.getTradeManager().requestPersistence();
complete();
}
} else {

View file

@ -114,6 +114,8 @@ public class TakerVerifyAndSignContract extends TradeTask {
trade.setContractHash(contractHash);
trade.setTakerContractSignature(signature);
processModel.getTradeManager().requestPersistence();
try {
checkNotNull(maker.getPubKeyRing(), "maker.getPubKeyRing() must nto be null");
Sig.verify(maker.getPubKeyRing().getSignaturePubKey(),

View file

@ -555,6 +555,7 @@ public class PendingTradesDataModel extends ActivatableDataModel {
trade.setDisputeState(Trade.DisputeState.MEDIATION_REQUESTED);
sendOpenDisputeMessage(disputeManager, resultHandler, dispute);
tradeManager.requestPersistence();
} else if (useRefundAgent) {
resultHandler = () -> navigation.navigateTo(MainView.class, SupportView.class, RefundClientView.class);
@ -630,7 +631,6 @@ public class PendingTradesDataModel extends ActivatableDataModel {
sendOpenDisputeMessage(disputeManager, resultHandler, dispute);
},
errorMessage -> new Popup().error(errorMessage).show());
} else {
log.warn("Invalid dispute state {}", disputeState.name());
}

View file

@ -471,6 +471,7 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
trade.stateProperty().removeListener(tradeStateListener);
trade.disputeStateProperty().addListener(disputeStateListener);
trade.mediationResultStateProperty().addListener(mediationResultStateListener);
traderChatManager.requestPersistence();
});
Scene scene = new Scene(pane);

View file

@ -472,6 +472,8 @@ public class BuyerStep2View extends TradeStepView {
trade.setCounterCurrencyExtraData(txKey);
trade.setCounterCurrencyTxId(txHash);
model.dataModel.getTradeManager().requestPersistence();
showConfirmPaymentStartedPopup();
})
.closeButtonText(Res.get("shared.cancel"))
@ -519,6 +521,7 @@ public class BuyerStep2View extends TradeStepView {
//TODO seems this was a hack to enable repeated confirm???
if (trade.isFiatSent()) {
trade.setState(Trade.State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN);
model.dataModel.getTradeManager().requestPersistence();
}
model.dataModel.onPaymentStarted(() -> {