diff --git a/core/src/main/java/haveno/core/trade/Trade.java b/core/src/main/java/haveno/core/trade/Trade.java index fe1d9728a4..e9fec58f79 100644 --- a/core/src/main/java/haveno/core/trade/Trade.java +++ b/core/src/main/java/haveno/core/trade/Trade.java @@ -699,7 +699,9 @@ public abstract class Trade implements Tradable, Model { public MoneroWallet createWallet() { synchronized (walletLock) { if (walletExists()) throw new RuntimeException("Cannot create trade wallet because it already exists"); + long time = System.currentTimeMillis(); wallet = xmrWalletService.createWallet(getWalletName()); + log.info("{} {} created multisig wallet in {} ms", getClass().getSimpleName(), getId(), System.currentTimeMillis() - time); return wallet; } } diff --git a/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java b/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java index a07e8aa268..720d5aa3e8 100644 --- a/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java +++ b/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java @@ -287,8 +287,16 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D public void handleInitMultisigRequest(InitMultisigRequest request, NodeAddress sender) { System.out.println(getClass().getSimpleName() + ".handleInitMultisigRequest()"); synchronized (trade) { - latchTrade(); + + // check trade + if (trade.hasFailed()) { + log.warn("{} {} ignoring {} from {} because trade failed with previous error: {}", trade.getClass().getSimpleName(), trade.getId(), request.getClass().getSimpleName(), sender, trade.getErrorMessage()); + return; + } Validator.checkTradeId(processModel.getOfferId(), request); + + // proocess message + latchTrade(); processModel.setTradeMessage(request); expect(anyPhase(Trade.Phase.INIT) .with(request) @@ -313,7 +321,15 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D public void handleSignContractRequest(SignContractRequest message, NodeAddress sender) { System.out.println(getClass().getSimpleName() + ".handleSignContractRequest() " + trade.getId()); synchronized (trade) { + + // check trade + if (trade.hasFailed()) { + log.warn("{} {} ignoring {} from {} because trade failed with previous error: {}", trade.getClass().getSimpleName(), trade.getId(), message.getClass().getSimpleName(), sender, trade.getErrorMessage()); + return; + } Validator.checkTradeId(processModel.getOfferId(), message); + + // process message if (trade.getState() == Trade.State.MULTISIG_COMPLETED || trade.getState() == Trade.State.CONTRACT_SIGNATURE_REQUESTED) { latchTrade(); Validator.checkTradeId(processModel.getOfferId(), message); @@ -347,7 +363,15 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D public void handleSignContractResponse(SignContractResponse message, NodeAddress sender) { System.out.println(getClass().getSimpleName() + ".handleSignContractResponse() " + trade.getId()); synchronized (trade) { + + // check trade + if (trade.hasFailed()) { + log.warn("{} {} ignoring {} from {} because trade failed with previous error: {}", trade.getClass().getSimpleName(), trade.getId(), message.getClass().getSimpleName(), sender, trade.getErrorMessage()); + return; + } Validator.checkTradeId(processModel.getOfferId(), message); + + // process message if (trade.getState() == Trade.State.CONTRACT_SIGNED) { latchTrade(); Validator.checkTradeId(processModel.getOfferId(), message); @@ -381,8 +405,16 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D public void handleDepositResponse(DepositResponse response, NodeAddress sender) { System.out.println(getClass().getSimpleName() + ".handleDepositResponse()"); synchronized (trade) { - latchTrade(); + + // check trade + if (trade.hasFailed()) { + log.warn("{} {} ignoring {} from {} because trade failed with previous error: {}", trade.getClass().getSimpleName(), trade.getId(), response.getClass().getSimpleName(), sender, trade.getErrorMessage()); + return; + } Validator.checkTradeId(processModel.getOfferId(), response); + + // process message + latchTrade(); processModel.setTradeMessage(response); expect(anyState(Trade.State.SENT_PUBLISH_DEPOSIT_TX_REQUEST, Trade.State.SAW_ARRIVED_PUBLISH_DEPOSIT_TX_REQUEST, Trade.State.ARBITRATOR_PUBLISHED_DEPOSIT_TXS, Trade.State.DEPOSIT_TXS_SEEN_IN_NETWORK) .with(response) diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorSendInitTradeOrMultisigRequests.java b/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorSendInitTradeOrMultisigRequests.java index 704e1aca79..412cb6ac45 100644 --- a/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorSendInitTradeOrMultisigRequests.java +++ b/core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorSendInitTradeOrMultisigRequests.java @@ -111,7 +111,7 @@ public class ArbitratorSendInitTradeOrMultisigRequests extends TradeTask { } private void sendInitMultisigRequests() { - + // ensure arbitrator has maker's reserve tx if (processModel.getMaker().getReserveTxHash() == null) { throw new RuntimeException("Arbitrator does not have maker's reserve tx after initializing trade"); diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessInitMultisigRequest.java b/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessInitMultisigRequest.java index 065ef8b3c2..669b7d303e 100644 --- a/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessInitMultisigRequest.java +++ b/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessInitMultisigRequest.java @@ -77,7 +77,7 @@ public class ProcessInitMultisigRequest extends TradeTask { // prepare multisig if applicable boolean updateParticipants = false; if (trade.getSelf().getPreparedMultisigHex() == null) { - log.info("Preparing multisig wallet for trade {}", trade.getId()); + log.info("Preparing multisig wallet for {} {}", trade.getClass().getSimpleName(), trade.getId()); multisigWallet = trade.createWallet(); trade.getSelf().setPreparedMultisigHex(multisigWallet.prepareMultisig()); trade.setStateIfValidTransitionTo(Trade.State.MULTISIG_PREPARED); @@ -89,7 +89,7 @@ public class ProcessInitMultisigRequest extends TradeTask { // make multisig if applicable TradePeer[] peers = getMultisigPeers(); 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.getClass().getSimpleName(), trade.getId()); String multisigHex = multisigWallet.makeMultisig(Arrays.asList(peers[0].getPreparedMultisigHex(), peers[1].getPreparedMultisigHex()), 2, xmrWalletService.getWalletPassword()); // TODO (woodser): xmrWalletService.makeMultisig(tradeId, multisigHexes, threshold)? trade.getSelf().setMadeMultisigHex(multisigHex); trade.setStateIfValidTransitionTo(Trade.State.MULTISIG_MADE); @@ -98,7 +98,7 @@ public class ProcessInitMultisigRequest extends TradeTask { // import made multisig keys if applicable if (trade.getSelf().getExchangedMultisigHex() == null && peers[0].getMadeMultisigHex() != null && peers[1].getMadeMultisigHex() != null) { - log.info("Importing made multisig hex for trade {}", trade.getId()); + log.info("Importing made multisig hex for {} {}", trade.getClass().getSimpleName(), trade.getId()); MoneroMultisigInitResult result = multisigWallet.exchangeMultisigKeys(Arrays.asList(peers[0].getMadeMultisigHex(), peers[1].getMadeMultisigHex()), xmrWalletService.getWalletPassword()); trade.getSelf().setExchangedMultisigHex(result.getMultisigHex()); trade.setStateIfValidTransitionTo(Trade.State.MULTISIG_EXCHANGED); @@ -144,6 +144,8 @@ public class ProcessInitMultisigRequest extends TradeTask { if (peer2Address == null) throw new RuntimeException("Peer2 address is null"); if (peer2PubKeyRing == null) throw new RuntimeException("Peer2 pub key ring null"); + log.info("{} {} sending InitMultisigRequests", trade.getClass().getSimpleName(), trade.getId()); + // send to peer 1 sendInitMultisigRequest(peer1Address, peer1PubKeyRing, new SendDirectMessageListener() { @Override diff --git a/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessInitTradeRequest.java b/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessInitTradeRequest.java index ffdc79ccf5..001b61f1de 100644 --- a/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessInitTradeRequest.java +++ b/core/src/main/java/haveno/core/trade/protocol/tasks/ProcessInitTradeRequest.java @@ -34,7 +34,6 @@ import static com.google.common.base.Preconditions.checkNotNull; import static haveno.core.util.Validator.checkTradeId; import static haveno.core.util.Validator.nonEmptyStringOf; -import java.math.BigInteger; import java.util.Date; @Slf4j diff --git a/core/src/main/java/haveno/core/xmr/wallet/XmrWalletService.java b/core/src/main/java/haveno/core/xmr/wallet/XmrWalletService.java index 6399adc9b8..4ed912cf0b 100644 --- a/core/src/main/java/haveno/core/xmr/wallet/XmrWalletService.java +++ b/core/src/main/java/haveno/core/xmr/wallet/XmrWalletService.java @@ -574,7 +574,7 @@ public class XmrWalletService { private MoneroWalletRpc createWallet(MoneroWalletConfig config, Integer port, boolean sync) { // start monero-wallet-rpc instance - MoneroWalletRpc walletRpc = startWalletRpcInstance(port, sync); + MoneroWalletRpc walletRpc = startWalletRpcInstance(port, false); // must be connected to daemon MoneroRpcConnection connection = connectionsService.getConnection();