mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-06-28 00:27:23 -04:00
take offer runs on trade thread
This commit is contained in:
parent
295c91760c
commit
5bff265cca
1 changed files with 62 additions and 61 deletions
|
@ -868,69 +868,70 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
|
||||||
boolean isTakerApiUser,
|
boolean isTakerApiUser,
|
||||||
TradeResultHandler tradeResultHandler,
|
TradeResultHandler tradeResultHandler,
|
||||||
ErrorMessageHandler errorMessageHandler) {
|
ErrorMessageHandler errorMessageHandler) {
|
||||||
|
ThreadUtils.execute(() -> {
|
||||||
|
checkArgument(!wasOfferAlreadyUsedInTrade(offer.getId()));
|
||||||
|
|
||||||
checkArgument(!wasOfferAlreadyUsedInTrade(offer.getId()));
|
// validate inputs
|
||||||
|
if (amount.compareTo(offer.getAmount()) > 0) throw new RuntimeException("Trade amount exceeds offer amount");
|
||||||
// validate inputs
|
if (amount.compareTo(offer.getMinAmount()) < 0) throw new RuntimeException("Trade amount is less than minimum offer amount");
|
||||||
if (amount.compareTo(offer.getAmount()) > 0) throw new RuntimeException("Trade amount exceeds offer amount");
|
|
||||||
if (amount.compareTo(offer.getMinAmount()) < 0) throw new RuntimeException("Trade amount is less than minimum offer amount");
|
// ensure trade is not already open
|
||||||
|
Optional<Trade> tradeOptional = getOpenTrade(offer.getId());
|
||||||
// ensure trade is not already open
|
if (tradeOptional.isPresent()) throw new RuntimeException("Cannot create trade protocol because trade with ID " + offer.getId() + " is already open");
|
||||||
Optional<Trade> tradeOptional = getOpenTrade(offer.getId());
|
|
||||||
if (tradeOptional.isPresent()) throw new RuntimeException("Cannot create trade protocol because trade with ID " + offer.getId() + " is already open");
|
// create trade
|
||||||
|
Trade trade;
|
||||||
// create trade
|
if (offer.isBuyOffer()) {
|
||||||
Trade trade;
|
trade = new SellerAsTakerTrade(offer,
|
||||||
if (offer.isBuyOffer()) {
|
amount,
|
||||||
trade = new SellerAsTakerTrade(offer,
|
offer.getPrice().getValue(),
|
||||||
amount,
|
xmrWalletService,
|
||||||
offer.getPrice().getValue(),
|
getNewProcessModel(offer),
|
||||||
xmrWalletService,
|
UUID.randomUUID().toString(),
|
||||||
getNewProcessModel(offer),
|
offer.getMakerNodeAddress(),
|
||||||
UUID.randomUUID().toString(),
|
P2PService.getMyNodeAddress(),
|
||||||
offer.getMakerNodeAddress(),
|
null,
|
||||||
P2PService.getMyNodeAddress(),
|
offer.getChallenge());
|
||||||
null,
|
} else {
|
||||||
offer.getChallenge());
|
trade = new BuyerAsTakerTrade(offer,
|
||||||
} else {
|
amount,
|
||||||
trade = new BuyerAsTakerTrade(offer,
|
offer.getPrice().getValue(),
|
||||||
amount,
|
xmrWalletService,
|
||||||
offer.getPrice().getValue(),
|
getNewProcessModel(offer),
|
||||||
xmrWalletService,
|
UUID.randomUUID().toString(),
|
||||||
getNewProcessModel(offer),
|
offer.getMakerNodeAddress(),
|
||||||
UUID.randomUUID().toString(),
|
P2PService.getMyNodeAddress(),
|
||||||
offer.getMakerNodeAddress(),
|
null,
|
||||||
P2PService.getMyNodeAddress(),
|
offer.getChallenge());
|
||||||
null,
|
}
|
||||||
offer.getChallenge());
|
trade.getProcessModel().setUseSavingsWallet(useSavingsWallet);
|
||||||
}
|
trade.getProcessModel().setFundsNeededForTrade(fundsNeededForTrade.longValueExact());
|
||||||
trade.getProcessModel().setUseSavingsWallet(useSavingsWallet);
|
trade.getMaker().setPaymentAccountId(offer.getOfferPayload().getMakerPaymentAccountId());
|
||||||
trade.getProcessModel().setFundsNeededForTrade(fundsNeededForTrade.longValueExact());
|
trade.getMaker().setPubKeyRing(offer.getPubKeyRing());
|
||||||
trade.getMaker().setPaymentAccountId(offer.getOfferPayload().getMakerPaymentAccountId());
|
trade.getSelf().setPubKeyRing(keyRing.getPubKeyRing());
|
||||||
trade.getMaker().setPubKeyRing(offer.getPubKeyRing());
|
trade.getSelf().setPaymentAccountId(paymentAccountId);
|
||||||
trade.getSelf().setPubKeyRing(keyRing.getPubKeyRing());
|
trade.getSelf().setPaymentMethodId(user.getPaymentAccount(paymentAccountId).getPaymentAccountPayload().getPaymentMethodId());
|
||||||
trade.getSelf().setPaymentAccountId(paymentAccountId);
|
|
||||||
trade.getSelf().setPaymentMethodId(user.getPaymentAccount(paymentAccountId).getPaymentAccountPayload().getPaymentMethodId());
|
// initialize trade protocol
|
||||||
|
TradeProtocol tradeProtocol = createTradeProtocol(trade);
|
||||||
// initialize trade protocol
|
addTrade(trade);
|
||||||
TradeProtocol tradeProtocol = createTradeProtocol(trade);
|
|
||||||
addTrade(trade);
|
initTradeAndProtocol(trade, tradeProtocol);
|
||||||
|
trade.addInitProgressStep();
|
||||||
initTradeAndProtocol(trade, tradeProtocol);
|
|
||||||
trade.addInitProgressStep();
|
// process with protocol
|
||||||
|
((TakerProtocol) tradeProtocol).onTakeOffer(result -> {
|
||||||
// process with protocol
|
tradeResultHandler.handleResult(trade);
|
||||||
((TakerProtocol) tradeProtocol).onTakeOffer(result -> {
|
requestPersistence();
|
||||||
tradeResultHandler.handleResult(trade);
|
}, errorMessage -> {
|
||||||
|
log.warn("Taker error during trade initialization: " + errorMessage);
|
||||||
|
trade.onProtocolError();
|
||||||
|
xmrWalletService.resetAddressEntriesForOpenOffer(trade.getId()); // TODO: move this into protocol error handling
|
||||||
|
errorMessageHandler.handleErrorMessage(errorMessage);
|
||||||
|
});
|
||||||
|
|
||||||
requestPersistence();
|
requestPersistence();
|
||||||
}, errorMessage -> {
|
}, offer.getId());
|
||||||
log.warn("Taker error during trade initialization: " + errorMessage);
|
|
||||||
trade.onProtocolError();
|
|
||||||
xmrWalletService.resetAddressEntriesForOpenOffer(trade.getId()); // TODO: move this into protocol error handling
|
|
||||||
errorMessageHandler.handleErrorMessage(errorMessage);
|
|
||||||
});
|
|
||||||
|
|
||||||
requestPersistence();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ProcessModel getNewProcessModel(Offer offer) {
|
private ProcessModel getNewProcessModel(Offer offer) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue