take offer runs on trade thread

This commit is contained in:
woodser 2025-04-10 11:46:57 -04:00 committed by woodser
parent 295c91760c
commit 5bff265cca

View file

@ -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) {