mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-07-26 08:25:23 -04:00
Support changed peeraddress after reconnect
This commit is contained in:
parent
973aa73c76
commit
bea3dbc445
8 changed files with 95 additions and 58 deletions
|
@ -24,6 +24,7 @@ import io.bitsquare.btc.WalletService;
|
||||||
import io.bitsquare.common.taskrunner.Model;
|
import io.bitsquare.common.taskrunner.Model;
|
||||||
import io.bitsquare.crypto.SignatureService;
|
import io.bitsquare.crypto.SignatureService;
|
||||||
import io.bitsquare.offer.Offer;
|
import io.bitsquare.offer.Offer;
|
||||||
|
import io.bitsquare.p2p.AddressService;
|
||||||
import io.bitsquare.p2p.MailboxMessage;
|
import io.bitsquare.p2p.MailboxMessage;
|
||||||
import io.bitsquare.p2p.MessageService;
|
import io.bitsquare.p2p.MessageService;
|
||||||
import io.bitsquare.p2p.Peer;
|
import io.bitsquare.p2p.Peer;
|
||||||
|
@ -152,6 +153,7 @@ abstract public class Trade implements Model, Serializable {
|
||||||
|
|
||||||
public void init(MessageService messageService,
|
public void init(MessageService messageService,
|
||||||
WalletService walletService,
|
WalletService walletService,
|
||||||
|
AddressService addressService,
|
||||||
TradeWalletService tradeWalletService,
|
TradeWalletService tradeWalletService,
|
||||||
BlockChainService blockChainService,
|
BlockChainService blockChainService,
|
||||||
SignatureService signatureService,
|
SignatureService signatureService,
|
||||||
|
@ -160,6 +162,7 @@ abstract public class Trade implements Model, Serializable {
|
||||||
|
|
||||||
processModel.onAllServicesInitialized(offer,
|
processModel.onAllServicesInitialized(offer,
|
||||||
messageService,
|
messageService,
|
||||||
|
addressService,
|
||||||
walletService,
|
walletService,
|
||||||
tradeWalletService,
|
tradeWalletService,
|
||||||
blockChainService,
|
blockChainService,
|
||||||
|
|
|
@ -484,6 +484,7 @@ public class TradeManager {
|
||||||
private void initTrade(Trade trade) {
|
private void initTrade(Trade trade) {
|
||||||
trade.init(messageService,
|
trade.init(messageService,
|
||||||
walletService,
|
walletService,
|
||||||
|
addressService,
|
||||||
tradeWalletService,
|
tradeWalletService,
|
||||||
blockChainService,
|
blockChainService,
|
||||||
signatureService,
|
signatureService,
|
||||||
|
|
|
@ -76,17 +76,20 @@ public class BuyerAsOffererProtocol extends TradeProtocol implements BuyerProtoc
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
|
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
|
||||||
if (trade == null)
|
|
||||||
this.trade = trade;
|
this.trade = trade;
|
||||||
|
|
||||||
log.debug("setMailboxMessage " + mailboxMessage);
|
log.debug("setMailboxMessage " + mailboxMessage);
|
||||||
// Might be called twice, so check that its only processed once
|
|
||||||
if (!processModel.isMailboxMessageProcessed()) {
|
// Find first the actual peer address, as it might have changed in the meantime
|
||||||
processModel.mailboxMessageProcessed();
|
findPeerAddress(processModel.tradingPeer.getP2pSigPubKey(),
|
||||||
|
() -> {
|
||||||
if (mailboxMessage instanceof RequestFinalizePayoutTxMessage) {
|
if (mailboxMessage instanceof RequestFinalizePayoutTxMessage) {
|
||||||
handle((RequestFinalizePayoutTxMessage) mailboxMessage);
|
handle((RequestFinalizePayoutTxMessage) mailboxMessage);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
(errorMessage -> {
|
||||||
|
log.error(errorMessage);
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -74,17 +74,20 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
|
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
|
||||||
if (trade == null)
|
|
||||||
this.trade = trade;
|
this.trade = trade;
|
||||||
|
|
||||||
log.debug("setMailboxMessage " + mailboxMessage);
|
log.debug("setMailboxMessage " + mailboxMessage);
|
||||||
// Might be called twice, so check that its only processed once
|
|
||||||
if (!processModel.isMailboxMessageProcessed()) {
|
// Find first the actual peer address, as it might have changed in the meantime
|
||||||
processModel.mailboxMessageProcessed();
|
findPeerAddress(trade.getOffer().getP2pSigPubKey(),
|
||||||
|
() -> {
|
||||||
if (mailboxMessage instanceof RequestFinalizePayoutTxMessage) {
|
if (mailboxMessage instanceof RequestFinalizePayoutTxMessage) {
|
||||||
handle((RequestFinalizePayoutTxMessage) mailboxMessage);
|
handle((RequestFinalizePayoutTxMessage) mailboxMessage);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
(errorMessage -> {
|
||||||
|
log.error(errorMessage);
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -26,6 +26,7 @@ import io.bitsquare.common.taskrunner.Model;
|
||||||
import io.bitsquare.crypto.SignatureService;
|
import io.bitsquare.crypto.SignatureService;
|
||||||
import io.bitsquare.fiat.FiatAccount;
|
import io.bitsquare.fiat.FiatAccount;
|
||||||
import io.bitsquare.offer.Offer;
|
import io.bitsquare.offer.Offer;
|
||||||
|
import io.bitsquare.p2p.AddressService;
|
||||||
import io.bitsquare.p2p.MessageService;
|
import io.bitsquare.p2p.MessageService;
|
||||||
import io.bitsquare.trade.protocol.trade.messages.TradeMessage;
|
import io.bitsquare.trade.protocol.trade.messages.TradeMessage;
|
||||||
import io.bitsquare.user.User;
|
import io.bitsquare.user.User;
|
||||||
|
@ -55,6 +56,7 @@ public class ProcessModel implements Model, Serializable {
|
||||||
|
|
||||||
// Transient/Immutable
|
// Transient/Immutable
|
||||||
transient private MessageService messageService;
|
transient private MessageService messageService;
|
||||||
|
transient private AddressService addressService;
|
||||||
transient private WalletService walletService;
|
transient private WalletService walletService;
|
||||||
transient private TradeWalletService tradeWalletService;
|
transient private TradeWalletService tradeWalletService;
|
||||||
transient private BlockChainService blockChainService;
|
transient private BlockChainService blockChainService;
|
||||||
|
@ -65,7 +67,6 @@ public class ProcessModel implements Model, Serializable {
|
||||||
|
|
||||||
// Mutable
|
// Mutable
|
||||||
public final TradingPeer tradingPeer;
|
public final TradingPeer tradingPeer;
|
||||||
transient private boolean mailboxMessageProcessed;
|
|
||||||
transient private TradeMessage tradeMessage;
|
transient private TradeMessage tradeMessage;
|
||||||
private String takeOfferFeeTxId;
|
private String takeOfferFeeTxId;
|
||||||
private List<TransactionOutput> connectedOutputsForAllInputs;
|
private List<TransactionOutput> connectedOutputsForAllInputs;
|
||||||
|
@ -88,6 +89,7 @@ public class ProcessModel implements Model, Serializable {
|
||||||
|
|
||||||
public void onAllServicesInitialized(Offer offer,
|
public void onAllServicesInitialized(Offer offer,
|
||||||
MessageService messageService,
|
MessageService messageService,
|
||||||
|
AddressService addressService,
|
||||||
WalletService walletService,
|
WalletService walletService,
|
||||||
TradeWalletService tradeWalletService,
|
TradeWalletService tradeWalletService,
|
||||||
BlockChainService blockChainService,
|
BlockChainService blockChainService,
|
||||||
|
@ -96,6 +98,7 @@ public class ProcessModel implements Model, Serializable {
|
||||||
User user) {
|
User user) {
|
||||||
this.offer = offer;
|
this.offer = offer;
|
||||||
this.messageService = messageService;
|
this.messageService = messageService;
|
||||||
|
this.addressService = addressService;
|
||||||
this.walletService = walletService;
|
this.walletService = walletService;
|
||||||
this.tradeWalletService = tradeWalletService;
|
this.tradeWalletService = tradeWalletService;
|
||||||
this.blockChainService = blockChainService;
|
this.blockChainService = blockChainService;
|
||||||
|
@ -155,15 +158,6 @@ public class ProcessModel implements Model, Serializable {
|
||||||
return tradeMessage;
|
return tradeMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mailboxMessageProcessed() {
|
|
||||||
this.mailboxMessageProcessed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public boolean isMailboxMessageProcessed() {
|
|
||||||
return mailboxMessageProcessed;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public Transaction getTakeOfferFeeTx() {
|
public Transaction getTakeOfferFeeTx() {
|
||||||
return takeOfferFeeTx;
|
return takeOfferFeeTx;
|
||||||
|
@ -265,4 +259,8 @@ public class ProcessModel implements Model, Serializable {
|
||||||
@Override
|
@Override
|
||||||
public void onComplete() {
|
public void onComplete() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AddressService getAddressService() {
|
||||||
|
return addressService;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,20 +77,22 @@ public class SellerAsOffererProtocol extends TradeProtocol implements SellerProt
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
|
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
|
||||||
if (trade == null)
|
|
||||||
this.trade = trade;
|
this.trade = trade;
|
||||||
|
|
||||||
log.debug("setMailboxMessage " + mailboxMessage);
|
log.debug("setMailboxMessage " + mailboxMessage);
|
||||||
// Might be called twice, so check that its only processed once
|
// Find first the actual peer address, as it might have changed in the meantime
|
||||||
if (!processModel.isMailboxMessageProcessed()) {
|
findPeerAddress(processModel.tradingPeer.getP2pSigPubKey(),
|
||||||
processModel.mailboxMessageProcessed();
|
() -> {
|
||||||
if (mailboxMessage instanceof FiatTransferStartedMessage) {
|
if (mailboxMessage instanceof FiatTransferStartedMessage) {
|
||||||
handle((FiatTransferStartedMessage) mailboxMessage);
|
handle((FiatTransferStartedMessage) mailboxMessage);
|
||||||
}
|
}
|
||||||
else if (mailboxMessage instanceof DepositTxPublishedMessage) {
|
else if (mailboxMessage instanceof DepositTxPublishedMessage) {
|
||||||
handle((DepositTxPublishedMessage) mailboxMessage);
|
handle((DepositTxPublishedMessage) mailboxMessage);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
(errorMessage -> {
|
||||||
|
log.error(errorMessage);
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -76,13 +76,13 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
|
public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade) {
|
||||||
if (trade == null)
|
|
||||||
this.trade = trade;
|
this.trade = trade;
|
||||||
|
|
||||||
log.debug("setMailboxMessage " + mailboxMessage);
|
log.debug("setMailboxMessage " + mailboxMessage);
|
||||||
// Might be called twice, so check that its only processed once
|
|
||||||
if (!processModel.isMailboxMessageProcessed()) {
|
// Find first the actual peer address, as it might have changed in the meantime
|
||||||
processModel.mailboxMessageProcessed();
|
findPeerAddress(trade.getOffer().getP2pSigPubKey(),
|
||||||
|
() -> {
|
||||||
if (mailboxMessage instanceof FiatTransferStartedMessage) {
|
if (mailboxMessage instanceof FiatTransferStartedMessage) {
|
||||||
handle((FiatTransferStartedMessage) mailboxMessage);
|
handle((FiatTransferStartedMessage) mailboxMessage);
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,10 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc
|
||||||
else if (mailboxMessage instanceof PayoutTxFinalizedMessage) {
|
else if (mailboxMessage instanceof PayoutTxFinalizedMessage) {
|
||||||
handle((PayoutTxFinalizedMessage) mailboxMessage);
|
handle((PayoutTxFinalizedMessage) mailboxMessage);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
(errorMessage -> {
|
||||||
|
log.error(errorMessage);
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -17,8 +17,12 @@
|
||||||
|
|
||||||
package io.bitsquare.trade.protocol.trade;
|
package io.bitsquare.trade.protocol.trade;
|
||||||
|
|
||||||
|
import io.bitsquare.common.handlers.ErrorMessageHandler;
|
||||||
|
import io.bitsquare.common.handlers.ResultHandler;
|
||||||
import io.bitsquare.p2p.MailboxMessage;
|
import io.bitsquare.p2p.MailboxMessage;
|
||||||
import io.bitsquare.p2p.MessageHandler;
|
import io.bitsquare.p2p.MessageHandler;
|
||||||
|
import io.bitsquare.p2p.Peer;
|
||||||
|
import io.bitsquare.p2p.listener.GetPeerAddressListener;
|
||||||
import io.bitsquare.trade.OffererTrade;
|
import io.bitsquare.trade.OffererTrade;
|
||||||
import io.bitsquare.trade.TakerTrade;
|
import io.bitsquare.trade.TakerTrade;
|
||||||
import io.bitsquare.trade.Trade;
|
import io.bitsquare.trade.Trade;
|
||||||
|
@ -28,6 +32,8 @@ import io.bitsquare.trade.states.TakerTradeState;
|
||||||
|
|
||||||
import org.bitcoinj.utils.Threading;
|
import org.bitcoinj.utils.Threading;
|
||||||
|
|
||||||
|
import java.security.PublicKey;
|
||||||
|
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
@ -55,8 +61,26 @@ public abstract class TradeProtocol {
|
||||||
|
|
||||||
abstract public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade);
|
abstract public void applyMailboxMessage(MailboxMessage mailboxMessage, Trade trade);
|
||||||
|
|
||||||
|
protected void findPeerAddress(PublicKey p2pSigPubKey, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||||
|
try {
|
||||||
|
processModel.getAddressService().findPeerAddress(p2pSigPubKey, new GetPeerAddressListener() {
|
||||||
|
@Override
|
||||||
|
public void onResult(Peer peer) {
|
||||||
|
trade.setTradingPeer(peer);
|
||||||
|
resultHandler.handleResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailed() {
|
||||||
|
errorMessageHandler.handleErrorMessage("findPeerAddress failed");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable t) {
|
||||||
|
errorMessageHandler.handleErrorMessage("findPeerAddress failed with error: " + t.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void checkPayoutTxTimeLock(Trade trade) {
|
public void checkPayoutTxTimeLock(Trade trade) {
|
||||||
if (trade == null)
|
|
||||||
this.trade = trade;
|
this.trade = trade;
|
||||||
|
|
||||||
boolean needPayoutTxBroadcast = false;
|
boolean needPayoutTxBroadcast = false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue