mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-08-13 17:05:40 -04:00
UI cleanup, can confirm payment sent and received after dispute opened
show buyer and seller trade fee in dispute summary window remove "Error polling trade wallet warning" if disconnected show notification when dispute opened or closed in legacy app resolve disputes under Support > Arbitration, hide other views show "support ticket opened" when dispute request is acked rename all variations of TradingPeer to TradePeer rename "payment started" to "payment sent" for consistency
This commit is contained in:
parent
a50e151c98
commit
aafb47e2ce
112 changed files with 527 additions and 567 deletions
|
@ -34,7 +34,7 @@ import bisq.core.support.dispute.DisputeResult;
|
|||
import bisq.core.support.dispute.arbitration.TraderDataItem;
|
||||
import bisq.core.trade.ArbitratorTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.core.user.User;
|
||||
|
||||
import bisq.network.p2p.BootstrapListener;
|
||||
|
@ -308,12 +308,12 @@ public class AccountAgeWitnessService {
|
|||
|
||||
private Optional<AccountAgeWitness> findTradePeerWitness(Trade trade) {
|
||||
if (trade instanceof ArbitratorTrade) return Optional.empty(); // TODO (woodser): arbitrator trade has two peers
|
||||
TradingPeer tradingPeer = trade.getTradingPeer();
|
||||
return (tradingPeer == null ||
|
||||
tradingPeer.getPaymentAccountPayload() == null ||
|
||||
tradingPeer.getPubKeyRing() == null) ?
|
||||
TradePeer tradePeer = trade.getTradePeer();
|
||||
return (tradePeer == null ||
|
||||
tradePeer.getPaymentAccountPayload() == null ||
|
||||
tradePeer.getPubKeyRing() == null) ?
|
||||
Optional.empty() :
|
||||
findWitness(tradingPeer.getPaymentAccountPayload(), tradingPeer.getPubKeyRing());
|
||||
findWitness(tradePeer.getPaymentAccountPayload(), tradePeer.getPubKeyRing());
|
||||
}
|
||||
|
||||
private Optional<AccountAgeWitness> getWitnessByHash(byte[] hash) {
|
||||
|
@ -732,8 +732,8 @@ public class AccountAgeWitnessService {
|
|||
public Optional<SignedWitness> traderSignAndPublishPeersAccountAgeWitness(Trade trade) {
|
||||
AccountAgeWitness peersWitness = findTradePeerWitness(trade).orElse(null);
|
||||
Coin tradeAmount = trade.getAmount();
|
||||
checkNotNull(trade.getTradingPeer().getPubKeyRing(), "Peer must have a keyring");
|
||||
PublicKey peersPubKey = trade.getTradingPeer().getPubKeyRing().getSignaturePubKey();
|
||||
checkNotNull(trade.getTradePeer().getPubKeyRing(), "Peer must have a keyring");
|
||||
PublicKey peersPubKey = trade.getTradePeer().getPubKeyRing().getSignaturePubKey();
|
||||
checkNotNull(peersWitness, "Not able to find peers witness, unable to sign for trade {}",
|
||||
trade.toString());
|
||||
checkNotNull(tradeAmount, "Trade amount must not be null");
|
||||
|
|
|
@ -541,10 +541,10 @@ public class CoreApi {
|
|||
coreTradesService.takeOffer(offer, paymentAccountId, resultHandler, errorMessageHandler);
|
||||
}
|
||||
|
||||
public void confirmPaymentStarted(String tradeId,
|
||||
public void confirmPaymentSent(String tradeId,
|
||||
ResultHandler resultHandler,
|
||||
ErrorMessageHandler errorMessageHandler) {
|
||||
coreTradesService.confirmPaymentStarted(tradeId, resultHandler, errorMessageHandler);
|
||||
coreTradesService.confirmPaymentSent(tradeId, resultHandler, errorMessageHandler);
|
||||
}
|
||||
|
||||
public void confirmPaymentReceived(String tradeId,
|
||||
|
|
|
@ -151,7 +151,7 @@ public class CoreDisputesService {
|
|||
Trade trade = tradeManager.getTrade(tradeId);
|
||||
var winningDisputeOptional = arbitrationManager.getDisputesAsObservableList().stream() // TODO (woodser): use getDispute()
|
||||
.filter(d -> tradeId.equals(d.getTradeId()))
|
||||
.filter(d -> trade.getTradingPeer(d.getTraderPubKeyRing()) == (winner == DisputeResult.Winner.BUYER ? trade.getBuyer() : trade.getSeller()))
|
||||
.filter(d -> trade.getTradePeer(d.getTraderPubKeyRing()) == (winner == DisputeResult.Winner.BUYER ? trade.getBuyer() : trade.getSeller()))
|
||||
.findFirst();
|
||||
if (winningDisputeOptional.isPresent()) winningDispute = winningDisputeOptional.get();
|
||||
else throw new IllegalStateException(format("dispute for tradeId '%s' not found", tradeId));
|
||||
|
|
|
@ -129,13 +129,13 @@ class CoreTradesService {
|
|||
}
|
||||
}
|
||||
|
||||
void confirmPaymentStarted(String tradeId,
|
||||
void confirmPaymentSent(String tradeId,
|
||||
ResultHandler resultHandler,
|
||||
ErrorMessageHandler errorMessageHandler) {
|
||||
var trade = getTrade(tradeId);
|
||||
if (isFollowingBuyerProtocol(trade)) {
|
||||
var tradeProtocol = tradeManager.getTradeProtocol(trade);
|
||||
((BuyerProtocol) tradeProtocol).onPaymentStarted(resultHandler, errorMessageHandler);
|
||||
((BuyerProtocol) tradeProtocol).onPaymentSent(resultHandler, errorMessageHandler);
|
||||
} else {
|
||||
throw new IllegalStateException("you are the seller and not sending payment");
|
||||
}
|
||||
|
|
|
@ -41,9 +41,9 @@ public class TradeInfo implements Payload {
|
|||
// view and interact with trades.
|
||||
|
||||
private static final Function<Trade, String> toPeerNodeAddress = (trade) ->
|
||||
trade.getTradingPeerNodeAddress() == null
|
||||
trade.getTradePeerNodeAddress() == null
|
||||
? ""
|
||||
: trade.getTradingPeerNodeAddress().getFullAddress();
|
||||
: trade.getTradePeerNodeAddress().getFullAddress();
|
||||
|
||||
private static final Function<Trade, String> toArbitratorNodeAddress = (trade) ->
|
||||
trade.getArbitratorNodeAddress() == null
|
||||
|
@ -76,7 +76,7 @@ public class TradeInfo implements Payload {
|
|||
private final String price;
|
||||
private final String volume;
|
||||
private final String arbitratorNodeAddress;
|
||||
private final String tradingPeerNodeAddress;
|
||||
private final String tradePeerNodeAddress;
|
||||
private final String state;
|
||||
private final String phase;
|
||||
private final String periodState;
|
||||
|
@ -111,7 +111,7 @@ public class TradeInfo implements Payload {
|
|||
this.price = builder.getPrice();
|
||||
this.volume = builder.getVolume();
|
||||
this.arbitratorNodeAddress = builder.getArbitratorNodeAddress();
|
||||
this.tradingPeerNodeAddress = builder.getTradingPeerNodeAddress();
|
||||
this.tradePeerNodeAddress = builder.getTradePeerNodeAddress();
|
||||
this.state = builder.getState();
|
||||
this.phase = builder.getPhase();
|
||||
this.periodState = builder.getPeriodState();
|
||||
|
@ -169,7 +169,7 @@ public class TradeInfo implements Payload {
|
|||
.withPrice(toPreciseTradePrice.apply(trade))
|
||||
.withVolume(toRoundedVolume.apply(trade))
|
||||
.withArbitratorNodeAddress(toArbitratorNodeAddress.apply(trade))
|
||||
.withTradingPeerNodeAddress(toPeerNodeAddress.apply(trade))
|
||||
.withTradePeerNodeAddress(toPeerNodeAddress.apply(trade))
|
||||
.withState(trade.getState().name())
|
||||
.withPhase(trade.getPhase().name())
|
||||
.withPeriodState(trade.getPeriodState().name())
|
||||
|
@ -213,7 +213,7 @@ public class TradeInfo implements Payload {
|
|||
.setPrice(price)
|
||||
.setTradeVolume(volume)
|
||||
.setArbitratorNodeAddress(arbitratorNodeAddress)
|
||||
.setTradingPeerNodeAddress(tradingPeerNodeAddress)
|
||||
.setTradePeerNodeAddress(tradePeerNodeAddress)
|
||||
.setState(state)
|
||||
.setPhase(phase)
|
||||
.setPeriodState(periodState)
|
||||
|
@ -256,7 +256,7 @@ public class TradeInfo implements Payload {
|
|||
.withState(proto.getState())
|
||||
.withPhase(proto.getPhase())
|
||||
.withArbitratorNodeAddress(proto.getArbitratorNodeAddress())
|
||||
.withTradingPeerNodeAddress(proto.getTradingPeerNodeAddress())
|
||||
.withTradePeerNodeAddress(proto.getTradePeerNodeAddress())
|
||||
.withIsDepositsPublished(proto.getIsDepositsPublished())
|
||||
.withIsDepositsConfirmed(proto.getIsDepositsConfirmed())
|
||||
.withIsDepositsUnlocked(proto.getIsDepositsUnlocked())
|
||||
|
@ -288,7 +288,7 @@ public class TradeInfo implements Payload {
|
|||
", sellerSecurityDeposit='" + sellerSecurityDeposit + '\'' + "\n" +
|
||||
", price='" + price + '\'' + "\n" +
|
||||
", arbitratorNodeAddress='" + arbitratorNodeAddress + '\'' + "\n" +
|
||||
", tradingPeerNodeAddress='" + tradingPeerNodeAddress + '\'' + "\n" +
|
||||
", tradePeerNodeAddress='" + tradePeerNodeAddress + '\'' + "\n" +
|
||||
", state='" + state + '\'' + "\n" +
|
||||
", phase='" + phase + '\'' + "\n" +
|
||||
", periodState='" + periodState + '\'' + "\n" +
|
||||
|
|
|
@ -49,7 +49,7 @@ public final class TradeInfoV1Builder {
|
|||
private String price;
|
||||
private String volume;
|
||||
private String arbitratorNodeAddress;
|
||||
private String tradingPeerNodeAddress;
|
||||
private String tradePeerNodeAddress;
|
||||
private String state;
|
||||
private String phase;
|
||||
private String periodState;
|
||||
|
@ -178,8 +178,8 @@ public final class TradeInfoV1Builder {
|
|||
return this;
|
||||
}
|
||||
|
||||
public TradeInfoV1Builder withTradingPeerNodeAddress(String tradingPeerNodeAddress) {
|
||||
this.tradingPeerNodeAddress = tradingPeerNodeAddress;
|
||||
public TradeInfoV1Builder withTradePeerNodeAddress(String tradePeerNodeAddress) {
|
||||
this.tradePeerNodeAddress = tradePeerNodeAddress;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,6 @@ package bisq.core.app;
|
|||
|
||||
import bisq.core.api.AccountServiceListener;
|
||||
import bisq.core.api.CoreAccountService;
|
||||
import bisq.core.api.CoreMoneroConnectionsService;
|
||||
import bisq.core.btc.setup.WalletsSetup;
|
||||
import bisq.core.btc.wallet.BtcWalletService;
|
||||
import bisq.core.btc.wallet.XmrWalletService;
|
||||
|
@ -317,11 +316,11 @@ public abstract class HavenoExecutable implements GracefulShutDownHandler, Haven
|
|||
injector.getInstance(XmrTxProofService.class).shutDown();
|
||||
injector.getInstance(AvoidStandbyModeService.class).shutDown();
|
||||
injector.getInstance(TradeManager.class).shutDown();
|
||||
injector.getInstance(XmrWalletService.class).shutDown(!isReadOnly); // TODO: why not shut down BtcWalletService, etc? shutdown CoreMoneroConnectionsService
|
||||
log.info("OpenOfferManager shutdown started");
|
||||
injector.getInstance(OpenOfferManager.class).shutDown(() -> {
|
||||
log.info("OpenOfferManager shutdown completed");
|
||||
|
||||
injector.getInstance(XmrWalletService.class).shutDown(!isReadOnly);
|
||||
injector.getInstance(BtcWalletService.class).shutDown();
|
||||
|
||||
// We need to shutdown BitcoinJ before the P2PService as it uses Tor.
|
||||
|
|
|
@ -97,7 +97,7 @@ public abstract class ExecutableForAppWithP2p extends HavenoExecutable {
|
|||
});
|
||||
});
|
||||
injector.getInstance(WalletsSetup.class).shutDown();
|
||||
injector.getInstance(XmrWalletService.class).shutDown(true); // TODO (woodser): this is not actually called, perhaps because WalletsSetup.class completes too quick so its listener calls System.exit(0)
|
||||
injector.getInstance(XmrWalletService.class).shutDown(true);
|
||||
injector.getInstance(BtcWalletService.class).shutDown();
|
||||
}));
|
||||
// we wait max 5 sec.
|
||||
|
|
|
@ -196,7 +196,7 @@ public abstract class SupportManager {
|
|||
for (Dispute dispute : trade.getDisputes()) {
|
||||
for (ChatMessage chatMessage : dispute.getChatMessages()) {
|
||||
if (chatMessage.getUid().equals(ackMessage.getSourceUid())) {
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.DISPUTE_OPENED);
|
||||
trade.advanceDisputeState(Trade.DisputeState.DISPUTE_OPENED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -451,9 +451,9 @@ public final class Dispute implements NetworkPayload, PersistablePayload {
|
|||
public String getRoleString() {
|
||||
if (disputeOpenerIsMaker) {
|
||||
if (disputeOpenerIsBuyer)
|
||||
return Res.get("support.buyerOfferer");
|
||||
return Res.get("support.buyerMaker");
|
||||
else
|
||||
return Res.get("support.sellerOfferer");
|
||||
return Res.get("support.sellerMaker");
|
||||
} else {
|
||||
if (disputeOpenerIsBuyer)
|
||||
return Res.get("support.buyerTaker");
|
||||
|
|
|
@ -42,7 +42,7 @@ import bisq.core.trade.HavenoUtils;
|
|||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.TradeDataValidation;
|
||||
import bisq.core.trade.TradeManager;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.network.p2p.BootstrapListener;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
import bisq.network.p2p.P2PService;
|
||||
|
@ -387,7 +387,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||
// We use the chatMessage wrapped inside the openNewDisputeMessage for
|
||||
// the state, as that is displayed to the user and we only persist that msg
|
||||
chatMessage.setArrived(true);
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.DISPUTE_REQUESTED);
|
||||
trade.advanceDisputeState(Trade.DisputeState.DISPUTE_REQUESTED);
|
||||
requestPersistence();
|
||||
resultHandler.handleResult();
|
||||
}
|
||||
|
@ -403,7 +403,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||
// We use the chatMessage wrapped inside the openNewDisputeMessage for
|
||||
// the state, as that is displayed to the user and we only persist that msg
|
||||
chatMessage.setStoredInMailbox(true);
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.DISPUTE_REQUESTED);
|
||||
trade.advanceDisputeState(Trade.DisputeState.DISPUTE_REQUESTED);
|
||||
requestPersistence();
|
||||
resultHandler.handleResult();
|
||||
}
|
||||
|
@ -478,7 +478,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||
|
||||
// get sender
|
||||
senderPubKeyRing = trade.isArbitrator() ? (dispute.isDisputeOpenerIsBuyer() ? contract.getBuyerPubKeyRing() : contract.getSellerPubKeyRing()) : trade.getArbitrator().getPubKeyRing();
|
||||
TradingPeer sender = trade.getTradingPeer(senderPubKeyRing);
|
||||
TradePeer sender = trade.getTradePeer(senderPubKeyRing);
|
||||
if (sender == null) throw new RuntimeException("Pub key ring is not from arbitrator, buyer, or seller");
|
||||
|
||||
// message to trader is expected from arbitrator
|
||||
|
@ -490,7 +490,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||
if (trade.isArbitrator() && message.getPaymentSentMessage() != null) {
|
||||
HavenoUtils.verifyPaymentSentMessage(trade, message.getPaymentSentMessage());
|
||||
trade.getBuyer().setUpdatedMultisigHex(message.getPaymentSentMessage().getUpdatedMultisigHex());
|
||||
trade.setStateIfProgress(sender == trade.getBuyer() ? Trade.State.BUYER_SENT_PAYMENT_SENT_MSG : Trade.State.SELLER_RECEIVED_PAYMENT_SENT_MSG);
|
||||
trade.advanceState(sender == trade.getBuyer() ? Trade.State.BUYER_SENT_PAYMENT_SENT_MSG : Trade.State.SELLER_RECEIVED_PAYMENT_SENT_MSG);
|
||||
}
|
||||
|
||||
// update multisig hex
|
||||
|
@ -509,7 +509,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||
Optional<Dispute> storedDisputeOptional = findDispute(dispute);
|
||||
if (!storedDisputeOptional.isPresent()) {
|
||||
disputeList.add(dispute);
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.DISPUTE_OPENED);
|
||||
trade.advanceDisputeState(Trade.DisputeState.DISPUTE_OPENED);
|
||||
|
||||
// send dispute opened message to peer if arbitrator
|
||||
if (trade.isArbitrator()) sendDisputeOpenedMessageToPeer(dispute, contract, dispute.isDisputeOpenerIsBuyer() ? contract.getSellerPubKeyRing() : contract.getBuyerPubKeyRing(), trade.getSelf().getUpdatedMultisigHex());
|
||||
|
@ -724,9 +724,9 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||
}
|
||||
|
||||
// create dispute closed message
|
||||
TradingPeer receiver = trade.getTradingPeer(dispute.getTraderPubKeyRing());
|
||||
TradePeer receiver = trade.getTradePeer(dispute.getTraderPubKeyRing());
|
||||
String unsignedPayoutTxHex = payoutTx == null ? null : payoutTx.getTxSet().getMultisigTxHex();
|
||||
TradingPeer receiverPeer = receiver == trade.getBuyer() ? trade.getSeller() : trade.getBuyer();
|
||||
TradePeer receiverPeer = receiver == trade.getBuyer() ? trade.getSeller() : trade.getBuyer();
|
||||
boolean deferPublishPayout = !resending && unsignedPayoutTxHex != null && receiverPeer.getUpdatedMultisigHex() != null && trade.getDisputeState().ordinal() >= Trade.DisputeState.ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG.ordinal() ;
|
||||
DisputeClosedMessage disputeClosedMessage = new DisputeClosedMessage(disputeResult,
|
||||
p2PService.getAddress(),
|
||||
|
@ -756,7 +756,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||
// We use the chatMessage wrapped inside the DisputeClosedMessage for
|
||||
// the state, as that is displayed to the user and we only persist that msg
|
||||
disputeResult.getChatMessage().setArrived(true);
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG);
|
||||
trade.advanceDisputeState(Trade.DisputeState.ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG);
|
||||
trade.syncWalletNormallyForMs(30000);
|
||||
requestPersistence();
|
||||
resultHandler.handleResult();
|
||||
|
@ -774,7 +774,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||
// the state, as that is displayed to the user and we only persist that msg
|
||||
disputeResult.getChatMessage().setStoredInMailbox(true);
|
||||
Trade trade = tradeManager.getTrade(dispute.getTradeId());
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG);
|
||||
trade.advanceDisputeState(Trade.DisputeState.ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG);
|
||||
requestPersistence();
|
||||
resultHandler.handleResult();
|
||||
}
|
||||
|
@ -790,7 +790,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||
// We use the chatMessage wrapped inside the DisputeClosedMessage for
|
||||
// the state, as that is displayed to the user and we only persist that msg
|
||||
disputeResult.getChatMessage().setSendMessageError(errorMessage);
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG);
|
||||
trade.advanceDisputeState(Trade.DisputeState.ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG);
|
||||
requestPersistence();
|
||||
faultHandler.handleFault(errorMessage, new RuntimeException(errorMessage));
|
||||
}
|
||||
|
@ -802,7 +802,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||
trade.setPayoutTx(payoutTx);
|
||||
trade.setPayoutTxHex(payoutTx.getTxSet().getMultisigTxHex());
|
||||
}
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.ARBITRATOR_SENT_DISPUTE_CLOSED_MSG);
|
||||
trade.advanceDisputeState(Trade.DisputeState.ARBITRATOR_SENT_DISPUTE_CLOSED_MSG);
|
||||
requestPersistence();
|
||||
} catch (Exception e) {
|
||||
faultHandler.handleFault(e.getMessage(), e);
|
||||
|
@ -820,7 +820,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||
trade.saveWallet();
|
||||
|
||||
// create unsigned dispute payout tx if not already published and arbitrator has trader's updated multisig info
|
||||
TradingPeer receiver = trade.getTradingPeer(dispute.getTraderPubKeyRing());
|
||||
TradePeer receiver = trade.getTradePeer(dispute.getTraderPubKeyRing());
|
||||
if (!trade.isPayoutPublished() && receiver.getUpdatedMultisigHex() != null) {
|
||||
MoneroWallet multisigWallet = trade.getWallet();
|
||||
|
||||
|
|
|
@ -260,7 +260,7 @@ public final class ArbitrationManager extends DisputeManager<ArbitrationDisputeL
|
|||
|
||||
// import multisig hex
|
||||
List<String> updatedMultisigHexes = new ArrayList<String>();
|
||||
if (trade.getTradingPeer().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getTradingPeer().getUpdatedMultisigHex());
|
||||
if (trade.getTradePeer().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getTradePeer().getUpdatedMultisigHex());
|
||||
if (trade.getArbitrator().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getArbitrator().getUpdatedMultisigHex());
|
||||
if (!updatedMultisigHexes.isEmpty()) trade.getWallet().importMultisigHex(updatedMultisigHexes.toArray(new String[0])); // TODO (monero-project): fails if multisig hex imported individually
|
||||
|
||||
|
@ -315,7 +315,7 @@ public final class ArbitrationManager extends DisputeManager<ArbitrationDisputeL
|
|||
throw e;
|
||||
}
|
||||
|
||||
// reprocess on error
|
||||
// schedule to reprocess message unless deleted
|
||||
if (trade.getProcessModel().getDisputeClosedMessage() != null) {
|
||||
if (!reprocessDisputeClosedMessageCounts.containsKey(trade.getId())) reprocessDisputeClosedMessageCounts.put(trade.getId(), 0);
|
||||
UserThread.runAfter(() -> {
|
||||
|
|
|
@ -240,7 +240,7 @@ public final class MediationManager extends DisputeManager<MediationDisputeList>
|
|||
|
||||
// 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.
|
||||
if (trade.getTradingPeer().getMediatedPayoutTxSignature() == null) {
|
||||
if (trade.getTradePeer().getMediatedPayoutTxSignature() == null) {
|
||||
tradeProtocol.onAcceptMediationResult(() -> {
|
||||
if (trade.getPayoutTx() != null) {
|
||||
tradeManager.closeDisputedTrade(tradeId, Trade.DisputeState.MEDIATION_CLOSED);
|
||||
|
|
|
@ -63,6 +63,6 @@ public abstract class BuyerTrade extends Trade {
|
|||
|
||||
@Override
|
||||
public boolean confirmPermitted() {
|
||||
return !getDisputeState().isArbitrated();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -122,7 +122,7 @@ public class CleanupMailboxMessages {
|
|||
private boolean isPubKeyValid(DecryptedMessageWithPubKey decryptedMessageWithPubKey, Trade trade) {
|
||||
// We can only validate the peers pubKey if we have it already. If we are the taker we get it from the offer
|
||||
// Otherwise it depends on the state of the trade protocol if we have received the peers pubKeyRing already.
|
||||
PubKeyRing peersPubKeyRing = trade.getTradingPeer().getPubKeyRing();
|
||||
PubKeyRing peersPubKeyRing = trade.getTradePeer().getPubKeyRing();
|
||||
boolean isValid = true;
|
||||
if (peersPubKeyRing != null &&
|
||||
!decryptedMessageWithPubKey.getSignaturePubKey().equals(peersPubKeyRing.getSignaturePubKey())) {
|
||||
|
|
|
@ -122,7 +122,7 @@ public class CleanupMailboxMessagesService {
|
|||
private boolean isPubKeyValid(DecryptedMessageWithPubKey decryptedMessageWithPubKey, Trade trade) {
|
||||
// We can only validate the peers pubKey if we have it already. If we are the taker we get it from the offer
|
||||
// Otherwise it depends on the state of the trade protocol if we have received the peers pubKeyRing already.
|
||||
PubKeyRing peersPubKeyRing = trade.getTradingPeer().getPubKeyRing();
|
||||
PubKeyRing peersPubKeyRing = trade.getTradePeer().getPubKeyRing();
|
||||
boolean isValid = true;
|
||||
if (peersPubKeyRing != null &&
|
||||
!decryptedMessageWithPubKey.getSignaturePubKey().equals(peersPubKeyRing.getSignaturePubKey())) {
|
||||
|
|
|
@ -191,9 +191,9 @@ public class ClosedTradableManager implements PersistedDataHost {
|
|||
if (isOpenOffer(tradable)) {
|
||||
return 0;
|
||||
}
|
||||
NodeAddress addressInTrade = castToTradeModel(tradable).getTradingPeerNodeAddress();
|
||||
NodeAddress addressInTrade = castToTradeModel(tradable).getTradePeerNodeAddress();
|
||||
return (int) getTradeModelStream()
|
||||
.map(Trade::getTradingPeerNodeAddress)
|
||||
.map(Trade::getTradePeerNodeAddress)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(address -> address.equals(addressInTrade))
|
||||
.count();
|
||||
|
|
|
@ -195,7 +195,7 @@ public class HavenoUtils {
|
|||
* @return a unique deterministic id for sending a trade mailbox message
|
||||
*/
|
||||
public static String getDeterministicId(Trade trade, Class<?> tradeMessageClass, NodeAddress receiver) {
|
||||
String uniqueId = trade.getId() + "_" + tradeMessageClass.getSimpleName() + "_" + trade.getRole() + "_to_" + trade.getPeerRole(trade.getTradingPeer(receiver));
|
||||
String uniqueId = trade.getId() + "_" + tradeMessageClass.getSimpleName() + "_" + trade.getRole() + "_to_" + trade.getPeerRole(trade.getTradePeer(receiver));
|
||||
return Utilities.bytesAsHexString(Hash.getSha256Ripemd160hash(uniqueId.getBytes(Charsets.UTF_8)));
|
||||
}
|
||||
|
||||
|
|
|
@ -63,35 +63,7 @@ public abstract class SellerTrade extends Trade {
|
|||
|
||||
@Override
|
||||
public boolean confirmPermitted() {
|
||||
// For altcoin there is no reason to delay BTC release as no chargeback risk
|
||||
if (CurrencyUtil.isCryptoCurrency(getOffer().getCurrencyCode())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (getDisputeState()) {
|
||||
case NO_DISPUTE:
|
||||
return true;
|
||||
|
||||
case DISPUTE_REQUESTED:
|
||||
case DISPUTE_OPENED:
|
||||
case ARBITRATOR_SENT_DISPUTE_CLOSED_MSG:
|
||||
case ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG:
|
||||
case ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG:
|
||||
case ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG:
|
||||
case DISPUTE_CLOSED:
|
||||
case MEDIATION_REQUESTED:
|
||||
case MEDIATION_STARTED_BY_PEER:
|
||||
return false;
|
||||
|
||||
case MEDIATION_CLOSED:
|
||||
return !mediationResultAppliedPenaltyToSeller();
|
||||
|
||||
case REFUND_REQUESTED:
|
||||
case REFUND_REQUEST_STARTED_BY_PEER:
|
||||
case REFUND_REQUEST_CLOSED:
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ public interface Tradable extends PersistablePayload {
|
|||
return asTradeModel().map(Trade::getOffer).map(Offer::getMakerFee).or(() -> Optional.ofNullable(getOffer().getMakerFee()));
|
||||
}
|
||||
|
||||
default Optional<NodeAddress> getOptionalTradingPeerNodeAddress() {
|
||||
return asTradeModel().map(Trade::getTradingPeerNodeAddress);
|
||||
default Optional<NodeAddress> getOptionalTradePeerNodeAddress() {
|
||||
return asTradeModel().map(Trade::getTradePeerNodeAddress);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ import bisq.core.trade.protocol.ProcessModel;
|
|||
import bisq.core.trade.protocol.ProcessModelServiceProvider;
|
||||
import bisq.core.trade.protocol.TradeListener;
|
||||
import bisq.core.trade.protocol.TradeProtocol;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.core.trade.txproof.AssetTxProofResult;
|
||||
import bisq.core.util.VolumeUtil;
|
||||
import bisq.network.p2p.AckMessage;
|
||||
|
@ -672,8 +672,8 @@ public abstract class Trade implements Tradable, Model {
|
|||
getSelf().setNodeAddress(P2PService.getMyNodeAddress());
|
||||
}
|
||||
|
||||
public NodeAddress getTradingPeerNodeAddress() {
|
||||
return getTradingPeer() == null ? null : getTradingPeer().getNodeAddress();
|
||||
public NodeAddress getTradePeerNodeAddress() {
|
||||
return getTradePeer() == null ? null : getTradePeer().getNodeAddress();
|
||||
}
|
||||
|
||||
public NodeAddress getArbitratorNodeAddress() {
|
||||
|
@ -883,9 +883,9 @@ public abstract class Trade implements Tradable, Model {
|
|||
try {
|
||||
|
||||
// decrypt payment account payload
|
||||
getTradingPeer().setPaymentAccountKey(paymentAccountKey);
|
||||
SecretKey sk = Encryption.getSecretKeyFromBytes(getTradingPeer().getPaymentAccountKey());
|
||||
byte[] decryptedPaymentAccountPayload = Encryption.decrypt(getTradingPeer().getEncryptedPaymentAccountPayload(), sk);
|
||||
getTradePeer().setPaymentAccountKey(paymentAccountKey);
|
||||
SecretKey sk = Encryption.getSecretKeyFromBytes(getTradePeer().getPaymentAccountKey());
|
||||
byte[] decryptedPaymentAccountPayload = Encryption.decrypt(getTradePeer().getEncryptedPaymentAccountPayload(), sk);
|
||||
CoreNetworkProtoResolver resolver = new CoreNetworkProtoResolver(Clock.systemDefaultZone()); // TODO: reuse resolver from elsewhere?
|
||||
PaymentAccountPayload paymentAccountPayload = resolver.fromProto(protobuf.PaymentAccountPayload.parseFrom(decryptedPaymentAccountPayload));
|
||||
|
||||
|
@ -894,7 +894,7 @@ public abstract class Trade implements Tradable, Model {
|
|||
if (!Arrays.equals(paymentAccountPayload.getHash(), peerPaymentAccountPayloadHash)) throw new RuntimeException("Hash of peer's payment account payload does not match contract");
|
||||
|
||||
// set payment account payload
|
||||
getTradingPeer().setPaymentAccountPayload(paymentAccountPayload);
|
||||
getTradePeer().setPaymentAccountPayload(paymentAccountPayload);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
@ -977,7 +977,7 @@ public abstract class Trade implements Tradable, Model {
|
|||
try {
|
||||
syncWallet();
|
||||
} catch (Exception e) {
|
||||
log.warn("Error syncing wallet for {} {}: {}", getClass().getSimpleName(), getId(), e.getMessage());
|
||||
if (isInitialized) log.warn("Error syncing wallet for {} {}: {}", getClass().getSimpleName(), getId(), e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1074,7 +1074,7 @@ public abstract class Trade implements Tradable, Model {
|
|||
});
|
||||
}
|
||||
|
||||
public void setStateIfProgress(State state) {
|
||||
public void advanceState(State state) {
|
||||
if (state.ordinal() > getState().ordinal()) setState(state);
|
||||
}
|
||||
|
||||
|
@ -1121,7 +1121,7 @@ public abstract class Trade implements Tradable, Model {
|
|||
});
|
||||
}
|
||||
|
||||
public void setDisputeStateIfProgress(DisputeState disputeState) {
|
||||
public void advanceDisputeState(DisputeState disputeState) {
|
||||
if (disputeState.ordinal() > getDisputeState().ordinal()) setDisputeState(disputeState);
|
||||
}
|
||||
|
||||
|
@ -1193,35 +1193,35 @@ public abstract class Trade implements Tradable, Model {
|
|||
return this instanceof TakerTrade;
|
||||
}
|
||||
|
||||
public TradingPeer getSelf() {
|
||||
public TradePeer getSelf() {
|
||||
if (this instanceof MakerTrade) return processModel.getMaker();
|
||||
if (this instanceof TakerTrade) return processModel.getTaker();
|
||||
if (this instanceof ArbitratorTrade) return processModel.getArbitrator();
|
||||
throw new RuntimeException("Trade is not maker, taker, or arbitrator");
|
||||
}
|
||||
|
||||
public TradingPeer getArbitrator() {
|
||||
public TradePeer getArbitrator() {
|
||||
return processModel.getArbitrator();
|
||||
}
|
||||
|
||||
public TradingPeer getMaker() {
|
||||
public TradePeer getMaker() {
|
||||
return processModel.getMaker();
|
||||
}
|
||||
|
||||
public TradingPeer getTaker() {
|
||||
public TradePeer getTaker() {
|
||||
return processModel.getTaker();
|
||||
}
|
||||
|
||||
public TradingPeer getBuyer() {
|
||||
public TradePeer getBuyer() {
|
||||
return offer.getDirection() == OfferDirection.BUY ? processModel.getMaker() : processModel.getTaker();
|
||||
}
|
||||
|
||||
public TradingPeer getSeller() {
|
||||
public TradePeer getSeller() {
|
||||
return offer.getDirection() == OfferDirection.BUY ? processModel.getTaker() : processModel.getMaker();
|
||||
}
|
||||
|
||||
// get the taker if maker, maker if taker, null if arbitrator
|
||||
public TradingPeer getTradingPeer() {
|
||||
public TradePeer getTradePeer() {
|
||||
if (this instanceof MakerTrade) return processModel.getTaker();
|
||||
else if (this instanceof TakerTrade) return processModel.getMaker();
|
||||
else if (this instanceof ArbitratorTrade) return null;
|
||||
|
@ -1229,14 +1229,14 @@ public abstract class Trade implements Tradable, Model {
|
|||
}
|
||||
|
||||
// TODO (woodser): this naming convention is confusing
|
||||
public TradingPeer getTradingPeer(NodeAddress address) {
|
||||
public TradePeer getTradePeer(NodeAddress address) {
|
||||
if (address.equals(getMaker().getNodeAddress())) return processModel.getMaker();
|
||||
if (address.equals(getTaker().getNodeAddress())) return processModel.getTaker();
|
||||
if (address.equals(getArbitrator().getNodeAddress())) return processModel.getArbitrator();
|
||||
return null;
|
||||
}
|
||||
|
||||
public TradingPeer getTradingPeer(PubKeyRing pubKeyRing) {
|
||||
public TradePeer getTradePeer(PubKeyRing pubKeyRing) {
|
||||
if (getMaker() != null && getMaker().getPubKeyRing().equals(pubKeyRing)) return getMaker();
|
||||
if (getTaker() != null && getTaker().getPubKeyRing().equals(pubKeyRing)) return getTaker();
|
||||
if (getArbitrator() != null && getArbitrator().getPubKeyRing().equals(pubKeyRing)) return getArbitrator();
|
||||
|
@ -1250,7 +1250,7 @@ public abstract class Trade implements Tradable, Model {
|
|||
throw new IllegalArgumentException("Trade is not buyer, seller, or arbitrator");
|
||||
}
|
||||
|
||||
public String getPeerRole(TradingPeer peer) {
|
||||
public String getPeerRole(TradePeer peer) {
|
||||
if (peer == getBuyer()) return "Buyer";
|
||||
if (peer == getSeller()) return "Seller";
|
||||
if (peer == getArbitrator()) return "Arbitrator";
|
||||
|
@ -1637,7 +1637,7 @@ public abstract class Trade implements Tradable, Model {
|
|||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (isInitialized && getWallet() != null) log.warn("Error polling trade wallet {}: {}", getId(), e.getMessage()); // TODO (monero-java): poller.isPolling() and then don't need to use isInitialized here as shutdown flag
|
||||
if (isInitialized && getWallet() != null && isWalletConnected()) log.warn("Error polling trade wallet {}: {}", getId(), e.getMessage()); // TODO (monero-java): poller.isPolling() and then don't need to use isInitialized here as shutdown flag
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -343,28 +343,6 @@ public class TradeDataValidation {
|
|||
}
|
||||
}
|
||||
|
||||
public static void validateDepositInputs(Trade trade) throws InvalidTxException {
|
||||
throw new RuntimeException("TradeDataValidation.validateDepositInputs() needs updated for XMR");
|
||||
// // assumption: deposit tx always has 2 inputs, the maker and taker
|
||||
// if (trade == null || trade.getDepositTx() == null || trade.getDepositTx().getInputs().size() != 2) {
|
||||
// throw new InvalidTxException("Deposit transaction is null or has unexpected input count");
|
||||
// }
|
||||
// Transaction depositTx = trade.getDepositTx();
|
||||
// String txIdInput0 = depositTx.getInput(0).getOutpoint().getHash().toString();
|
||||
// String txIdInput1 = depositTx.getInput(1).getOutpoint().getHash().toString();
|
||||
// String contractMakerTxId = trade.getContract().getOfferPayload().getOfferFeePaymentTxId();
|
||||
// String contractTakerTxId = trade.getContract().getTakerFeeTxID();
|
||||
// boolean makerFirstMatch = contractMakerTxId.equalsIgnoreCase(txIdInput0) && contractTakerTxId.equalsIgnoreCase(txIdInput1);
|
||||
// boolean takerFirstMatch = contractMakerTxId.equalsIgnoreCase(txIdInput1) && contractTakerTxId.equalsIgnoreCase(txIdInput0);
|
||||
// if (!makerFirstMatch && !takerFirstMatch) {
|
||||
// String errMsg = "Maker/Taker txId in contract does not match deposit tx input";
|
||||
// log.error(errMsg +
|
||||
// "\nContract Maker tx=" + contractMakerTxId + " Contract Taker tx=" + contractTakerTxId +
|
||||
// "\nDeposit Input0=" + txIdInput0 + " Deposit Input1=" + txIdInput1);
|
||||
// throw new InvalidTxException(errMsg);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Exceptions
|
||||
|
|
|
@ -557,8 +557,8 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
|
|||
request.getTakerNodeAddress(),
|
||||
request.getArbitratorNodeAddress());
|
||||
|
||||
//System.out.println("TradeManager trade.getTradingPeer().setNodeAddress(): " + sender);
|
||||
//trade.getTradingPeer().setNodeAddress(sender);
|
||||
//System.out.println("TradeManager trade.getTradePeer().setNodeAddress(): " + sender);
|
||||
//trade.getTradePeer().setNodeAddress(sender);
|
||||
// TODO (woodser): what if maker's address changes while offer open, or taker's address changes after multisig deposit available? need to verify and update. see OpenOfferManager.maybeUpdatePersistedOffers()
|
||||
trade.getArbitrator().setPubKeyRing(arbitrator.getPubKeyRing());
|
||||
trade.getMaker().setPubKeyRing(trade.getOffer().getPubKeyRing());
|
||||
|
|
|
@ -20,6 +20,7 @@ package bisq.core.trade.protocol;
|
|||
import bisq.core.trade.BuyerAsMakerTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.InitTradeRequest;
|
||||
import bisq.core.trade.protocol.tasks.ApplyFilter;
|
||||
import bisq.core.trade.protocol.tasks.MakerSendInitTradeRequest;
|
||||
import bisq.core.trade.protocol.tasks.ProcessInitTradeRequest;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
|
@ -50,9 +51,8 @@ public class BuyerAsMakerProtocol extends BuyerProtocol implements MakerProtocol
|
|||
.with(message)
|
||||
.from(peer))
|
||||
.setup(tasks(
|
||||
ApplyFilter.class,
|
||||
ProcessInitTradeRequest.class,
|
||||
//ApplyFilter.class, // TODO (woodser): these checks apply when maker signs availability request, but not here
|
||||
//VerifyPeersAccountAgeWitness.class, // TODO (woodser): these checks apply after in multisig, means if rejected need to reimburse other's fee
|
||||
MakerSendInitTradeRequest.class)
|
||||
.using(new TradeTaskRunner(trade,
|
||||
() -> {
|
||||
|
|
|
@ -56,7 +56,7 @@ public class BuyerAsTakerProtocol extends BuyerProtocol implements TakerProtocol
|
|||
this.errorMessageHandler = errorMessageHandler;
|
||||
expect(phase(Trade.Phase.INIT)
|
||||
.with(TakerEvent.TAKE_OFFER)
|
||||
.from(trade.getTradingPeer().getNodeAddress()))
|
||||
.from(trade.getTradePeer().getNodeAddress()))
|
||||
.setup(tasks(
|
||||
ApplyFilter.class,
|
||||
TakerReserveTradeFunds.class,
|
||||
|
|
|
@ -95,8 +95,8 @@ public class BuyerProtocol extends DisputeProtocol {
|
|||
// User interaction
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
public void onPaymentStarted(ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||
System.out.println("BuyerProtocol.onPaymentStarted()");
|
||||
public void onPaymentSent(ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||
System.out.println("BuyerProtocol.onPaymentSent()");
|
||||
new Thread(() -> {
|
||||
synchronized (trade) {
|
||||
latchTrade();
|
||||
|
|
|
@ -87,7 +87,7 @@ public abstract class DisputeProtocol extends TradeProtocol {
|
|||
Trade.Phase.PAYMENT_SENT,
|
||||
Trade.Phase.PAYMENT_RECEIVED)
|
||||
.with(event)
|
||||
.preCondition(trade.getTradingPeer().getMediatedPayoutTxSignature() == null,
|
||||
.preCondition(trade.getTradePeer().getMediatedPayoutTxSignature() == null,
|
||||
() -> errorMessageHandler.handleErrorMessage("We have received already the signature from the peer."))
|
||||
.preCondition(trade.getPayoutTx() == null,
|
||||
() -> errorMessageHandler.handleErrorMessage("Payout tx is already published.")))
|
||||
|
|
|
@ -109,7 +109,7 @@ public class FluentProtocol {
|
|||
|
||||
NodeAddress peer = condition.getPeer();
|
||||
if (peer != null) {
|
||||
tradeProtocol.processModel.setTempTradingPeerNodeAddress(peer); // TODO (woodser): node has multiple peers (arbitrator and maker or taker), but fluent protocol assumes only one
|
||||
tradeProtocol.processModel.setTempTradePeerNodeAddress(peer); // TODO (woodser): node has multiple peers (arbitrator and maker or taker), but fluent protocol assumes only one
|
||||
tradeProtocol.processModel.getTradeManager().requestPersistence();
|
||||
}
|
||||
|
||||
|
|
|
@ -108,9 +108,9 @@ public class ProcessModel implements Model, PersistablePayload {
|
|||
transient private Transaction depositTx; // TODO (woodser): remove and rename depositTxBtc with depositTx
|
||||
|
||||
// Persistable Immutable (private setter only used by PB method)
|
||||
private TradingPeer maker = new TradingPeer();
|
||||
private TradingPeer taker = new TradingPeer();
|
||||
private TradingPeer arbitrator = new TradingPeer();
|
||||
private TradePeer maker = new TradePeer();
|
||||
private TradePeer taker = new TradePeer();
|
||||
private TradePeer arbitrator = new TradePeer();
|
||||
private String offerId;
|
||||
private String accountId;
|
||||
private PubKeyRing pubKeyRing;
|
||||
|
@ -141,10 +141,10 @@ public class ProcessModel implements Model, PersistablePayload {
|
|||
@Setter
|
||||
private byte[] myMultiSigPubKey;
|
||||
// that is used to store temp. the peers address when we get an incoming message before the message is verified.
|
||||
// After successful verified we copy that over to the trade.tradingPeerAddress
|
||||
// After successful verified we copy that over to the trade.tradePeerAddress
|
||||
@Nullable
|
||||
@Setter
|
||||
private NodeAddress tempTradingPeerNodeAddress; // TODO (woodser): remove entirely?
|
||||
private NodeAddress tempTradePeerNodeAddress; // TODO (woodser): remove entirely?
|
||||
|
||||
// Added in v.1.1.6
|
||||
@Nullable
|
||||
|
@ -195,20 +195,20 @@ public class ProcessModel implements Model, PersistablePayload {
|
|||
// PaymentSentMessage. As well we do an automatic re-send in case it was not ACKed yet.
|
||||
// To enable that even after restart we persist the state.
|
||||
@Setter
|
||||
private ObjectProperty<MessageState> paymentStartedMessageStateProperty = new SimpleObjectProperty<>(MessageState.UNDEFINED);
|
||||
private ObjectProperty<MessageState> paymentSentMessageStateProperty = new SimpleObjectProperty<>(MessageState.UNDEFINED);
|
||||
|
||||
public ProcessModel(String offerId, String accountId, PubKeyRing pubKeyRing) {
|
||||
this(offerId, accountId, pubKeyRing, new TradingPeer(), new TradingPeer(), new TradingPeer());
|
||||
this(offerId, accountId, pubKeyRing, new TradePeer(), new TradePeer(), new TradePeer());
|
||||
}
|
||||
|
||||
public ProcessModel(String offerId, String accountId, PubKeyRing pubKeyRing, TradingPeer arbitrator, TradingPeer maker, TradingPeer taker) {
|
||||
public ProcessModel(String offerId, String accountId, PubKeyRing pubKeyRing, TradePeer arbitrator, TradePeer maker, TradePeer taker) {
|
||||
this.offerId = offerId;
|
||||
this.accountId = accountId;
|
||||
this.pubKeyRing = pubKeyRing;
|
||||
// If tradingPeer was null in persisted data from some error cases we set a new one to not cause nullPointers
|
||||
this.arbitrator = arbitrator != null ? arbitrator : new TradingPeer();
|
||||
this.maker = maker != null ? maker : new TradingPeer();
|
||||
this.taker = taker != null ? taker : new TradingPeer();
|
||||
// If tradePeer was null in persisted data from some error cases we set a new one to not cause nullPointers
|
||||
this.arbitrator = arbitrator != null ? arbitrator : new TradePeer();
|
||||
this.maker = maker != null ? maker : new TradePeer();
|
||||
this.taker = taker != null ? taker : new TradePeer();
|
||||
}
|
||||
|
||||
public void applyTransient(ProcessModelServiceProvider provider,
|
||||
|
@ -233,19 +233,19 @@ public class ProcessModel implements Model, PersistablePayload {
|
|||
.setChangeOutputValue(changeOutputValue)
|
||||
.setUseSavingsWallet(useSavingsWallet)
|
||||
.setFundsNeededForTradeAsLong(fundsNeededForTradeAsLong)
|
||||
.setPaymentStartedMessageState(paymentStartedMessageStateProperty.get().name())
|
||||
.setPaymentSentMessageState(paymentSentMessageStateProperty.get().name())
|
||||
.setBuyerPayoutAmountFromMediation(buyerPayoutAmountFromMediation)
|
||||
.setSellerPayoutAmountFromMediation(sellerPayoutAmountFromMediation)
|
||||
.setDepositsConfirmedMessagesDelivered(isDepositsConfirmedMessagesDelivered);
|
||||
Optional.ofNullable(maker).ifPresent(e -> builder.setMaker((protobuf.TradingPeer) maker.toProtoMessage()));
|
||||
Optional.ofNullable(taker).ifPresent(e -> builder.setTaker((protobuf.TradingPeer) taker.toProtoMessage()));
|
||||
Optional.ofNullable(arbitrator).ifPresent(e -> builder.setArbitrator((protobuf.TradingPeer) arbitrator.toProtoMessage()));
|
||||
Optional.ofNullable(maker).ifPresent(e -> builder.setMaker((protobuf.TradePeer) maker.toProtoMessage()));
|
||||
Optional.ofNullable(taker).ifPresent(e -> builder.setTaker((protobuf.TradePeer) taker.toProtoMessage()));
|
||||
Optional.ofNullable(arbitrator).ifPresent(e -> builder.setArbitrator((protobuf.TradePeer) arbitrator.toProtoMessage()));
|
||||
Optional.ofNullable(takeOfferFeeTxId).ifPresent(builder::setTakeOfferFeeTxId);
|
||||
Optional.ofNullable(payoutTxSignature).ifPresent(e -> builder.setPayoutTxSignature(ByteString.copyFrom(payoutTxSignature)));
|
||||
Optional.ofNullable(rawTransactionInputs).ifPresent(e -> builder.addAllRawTransactionInputs(ProtoUtil.collectionToProto(rawTransactionInputs, protobuf.RawTransactionInput.class)));
|
||||
Optional.ofNullable(changeOutputAddress).ifPresent(builder::setChangeOutputAddress);
|
||||
Optional.ofNullable(myMultiSigPubKey).ifPresent(e -> builder.setMyMultiSigPubKey(ByteString.copyFrom(myMultiSigPubKey)));
|
||||
Optional.ofNullable(tempTradingPeerNodeAddress).ifPresent(e -> builder.setTempTradingPeerNodeAddress(tempTradingPeerNodeAddress.toProtoMessage()));
|
||||
Optional.ofNullable(tempTradePeerNodeAddress).ifPresent(e -> builder.setTempTradePeerNodeAddress(tempTradePeerNodeAddress.toProtoMessage()));
|
||||
Optional.ofNullable(makerSignature).ifPresent(e -> builder.setMakerSignature(makerSignature));
|
||||
Optional.ofNullable(multisigAddress).ifPresent(e -> builder.setMultisigAddress(multisigAddress));
|
||||
Optional.ofNullable(paymentSentMessage).ifPresent(e -> builder.setPaymentSentMessage(paymentSentMessage.toProtoNetworkEnvelope().getPaymentSentMessage()));
|
||||
|
@ -255,9 +255,9 @@ public class ProcessModel implements Model, PersistablePayload {
|
|||
}
|
||||
|
||||
public static ProcessModel fromProto(protobuf.ProcessModel proto, CoreProtoResolver coreProtoResolver) {
|
||||
TradingPeer arbitrator = TradingPeer.fromProto(proto.getArbitrator(), coreProtoResolver);
|
||||
TradingPeer maker = TradingPeer.fromProto(proto.getMaker(), coreProtoResolver);
|
||||
TradingPeer taker = TradingPeer.fromProto(proto.getTaker(), coreProtoResolver);
|
||||
TradePeer arbitrator = TradePeer.fromProto(proto.getArbitrator(), coreProtoResolver);
|
||||
TradePeer maker = TradePeer.fromProto(proto.getMaker(), coreProtoResolver);
|
||||
TradePeer taker = TradePeer.fromProto(proto.getTaker(), coreProtoResolver);
|
||||
PubKeyRing pubKeyRing = PubKeyRing.fromProto(proto.getPubKeyRing());
|
||||
ProcessModel processModel = new ProcessModel(proto.getOfferId(), proto.getAccountId(), pubKeyRing, arbitrator, maker, taker);
|
||||
processModel.setChangeOutputValue(proto.getChangeOutputValue());
|
||||
|
@ -276,14 +276,14 @@ public class ProcessModel implements Model, PersistablePayload {
|
|||
processModel.setRawTransactionInputs(rawTransactionInputs);
|
||||
processModel.setChangeOutputAddress(ProtoUtil.stringOrNullFromProto(proto.getChangeOutputAddress()));
|
||||
processModel.setMyMultiSigPubKey(ProtoUtil.byteArrayOrNullFromProto(proto.getMyMultiSigPubKey()));
|
||||
processModel.setTempTradingPeerNodeAddress(proto.hasTempTradingPeerNodeAddress() ? NodeAddress.fromProto(proto.getTempTradingPeerNodeAddress()) : null);
|
||||
processModel.setTempTradePeerNodeAddress(proto.hasTempTradePeerNodeAddress() ? NodeAddress.fromProto(proto.getTempTradePeerNodeAddress()) : null);
|
||||
processModel.setMediatedPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getMediatedPayoutTxSignature()));
|
||||
processModel.setMakerSignature(proto.getMakerSignature());
|
||||
processModel.setMultisigAddress(ProtoUtil.stringOrNullFromProto(proto.getMultisigAddress()));
|
||||
|
||||
String paymentStartedMessageStateString = ProtoUtil.stringOrNullFromProto(proto.getPaymentStartedMessageState());
|
||||
MessageState paymentStartedMessageState = ProtoUtil.enumFromProto(MessageState.class, paymentStartedMessageStateString);
|
||||
processModel.setPaymentStartedMessageState(paymentStartedMessageState);
|
||||
String paymentSentMessageStateString = ProtoUtil.stringOrNullFromProto(proto.getPaymentSentMessageState());
|
||||
MessageState paymentSentMessageState = ProtoUtil.enumFromProto(MessageState.class, paymentSentMessageStateString);
|
||||
processModel.setPaymentSentMessageState(paymentSentMessageState);
|
||||
|
||||
processModel.setPaymentSentMessage(proto.hasPaymentSentMessage() ? PaymentSentMessage.fromProto(proto.getPaymentSentMessage(), Version.getP2PMessageVersion()) : null);
|
||||
processModel.setPaymentReceivedMessage(proto.hasPaymentReceivedMessage() ? PaymentReceivedMessage.fromProto(proto.getPaymentReceivedMessage(), Version.getP2PMessageVersion()) : null);
|
||||
|
@ -330,15 +330,15 @@ public class ProcessModel implements Model, PersistablePayload {
|
|||
return getP2PService().getAddress();
|
||||
}
|
||||
|
||||
void setPaymentStartedAckMessage(AckMessage ackMessage) {
|
||||
void setPaymentSentAckMessage(AckMessage ackMessage) {
|
||||
MessageState messageState = ackMessage.isSuccess() ?
|
||||
MessageState.ACKNOWLEDGED :
|
||||
MessageState.FAILED;
|
||||
setPaymentStartedMessageState(messageState);
|
||||
setPaymentSentMessageState(messageState);
|
||||
}
|
||||
|
||||
public void setPaymentStartedMessageState(MessageState paymentStartedMessageStateProperty) {
|
||||
this.paymentStartedMessageStateProperty.set(paymentStartedMessageStateProperty);
|
||||
public void setPaymentSentMessageState(MessageState paymentSentMessageStateProperty) {
|
||||
this.paymentSentMessageStateProperty.set(paymentSentMessageStateProperty);
|
||||
if (tradeManager != null) {
|
||||
tradeManager.requestPersistence();
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ package bisq.core.trade.protocol;
|
|||
import bisq.core.trade.SellerAsMakerTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.InitTradeRequest;
|
||||
import bisq.core.trade.protocol.tasks.ApplyFilter;
|
||||
import bisq.core.trade.protocol.tasks.MakerSendInitTradeRequest;
|
||||
import bisq.core.trade.protocol.tasks.ProcessInitTradeRequest;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
|
@ -56,9 +57,8 @@ public class SellerAsMakerProtocol extends SellerProtocol implements MakerProtoc
|
|||
.with(message)
|
||||
.from(peer))
|
||||
.setup(tasks(
|
||||
ApplyFilter.class,
|
||||
ProcessInitTradeRequest.class,
|
||||
//ApplyFilter.class, // TODO (woodser): these checks apply when maker signs availability request, but not here
|
||||
//VerifyPeersAccountAgeWitness.class, // TODO (woodser): these checks apply after in multisig, means if rejected need to reimburse other's fee
|
||||
MakerSendInitTradeRequest.class)
|
||||
.using(new TradeTaskRunner(trade,
|
||||
() -> {
|
||||
|
|
|
@ -56,7 +56,7 @@ public class SellerAsTakerProtocol extends SellerProtocol implements TakerProtoc
|
|||
this.errorMessageHandler = errorMessageHandler;
|
||||
expect(phase(Trade.Phase.INIT)
|
||||
.with(TakerEvent.TAKE_OFFER)
|
||||
.from(trade.getTradingPeer().getNodeAddress()))
|
||||
.from(trade.getTradePeer().getNodeAddress()))
|
||||
.setup(tasks(
|
||||
ApplyFilter.class,
|
||||
TakerReserveTradeFunds.class,
|
||||
|
|
|
@ -45,7 +45,7 @@ import javax.annotation.Nullable;
|
|||
@Slf4j
|
||||
@Getter
|
||||
@Setter
|
||||
public final class TradingPeer implements PersistablePayload {
|
||||
public final class TradePeer implements PersistablePayload {
|
||||
// Transient/Mutable
|
||||
// Added in v1.2.0
|
||||
@Setter
|
||||
|
@ -130,12 +130,12 @@ public final class TradingPeer implements PersistablePayload {
|
|||
@Nullable
|
||||
private String updatedMultisigHex;
|
||||
|
||||
public TradingPeer() {
|
||||
public TradePeer() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Message toProtoMessage() {
|
||||
final protobuf.TradingPeer.Builder builder = protobuf.TradingPeer.newBuilder()
|
||||
final protobuf.TradePeer.Builder builder = protobuf.TradePeer.newBuilder()
|
||||
.setChangeOutputValue(changeOutputValue);
|
||||
Optional.ofNullable(nodeAddress).ifPresent(e -> builder.setNodeAddress(nodeAddress.toProtoMessage()));
|
||||
Optional.ofNullable(pubKeyRing).ifPresent(e -> builder.setPubKeyRing(pubKeyRing.toProtoMessage()));
|
||||
|
@ -174,52 +174,52 @@ public final class TradingPeer implements PersistablePayload {
|
|||
return builder.build();
|
||||
}
|
||||
|
||||
public static TradingPeer fromProto(protobuf.TradingPeer proto, CoreProtoResolver coreProtoResolver) {
|
||||
public static TradePeer fromProto(protobuf.TradePeer proto, CoreProtoResolver coreProtoResolver) {
|
||||
if (proto.getDefaultInstanceForType().equals(proto)) {
|
||||
return null;
|
||||
} else {
|
||||
TradingPeer tradingPeer = new TradingPeer();
|
||||
tradingPeer.setNodeAddress(proto.hasNodeAddress() ? NodeAddress.fromProto(proto.getNodeAddress()) : null);
|
||||
tradingPeer.setPubKeyRing(proto.hasPubKeyRing() ? PubKeyRing.fromProto(proto.getPubKeyRing()) : null);
|
||||
tradingPeer.setChangeOutputValue(proto.getChangeOutputValue());
|
||||
tradingPeer.setAccountId(ProtoUtil.stringOrNullFromProto(proto.getAccountId()));
|
||||
tradingPeer.setPaymentAccountId(ProtoUtil.stringOrNullFromProto(proto.getPaymentAccountId()));
|
||||
tradingPeer.setPaymentMethodId(ProtoUtil.stringOrNullFromProto(proto.getPaymentMethodId()));
|
||||
tradingPeer.setPaymentAccountPayloadHash(proto.getPaymentAccountPayloadHash().toByteArray());
|
||||
tradingPeer.setEncryptedPaymentAccountPayload(proto.getEncryptedPaymentAccountPayload().toByteArray());
|
||||
tradingPeer.setPaymentAccountKey(ProtoUtil.byteArrayOrNullFromProto(proto.getPaymentAccountKey()));
|
||||
tradingPeer.setPaymentAccountPayload(proto.hasPaymentAccountPayload() ? coreProtoResolver.fromProto(proto.getPaymentAccountPayload()) : null);
|
||||
tradingPeer.setPayoutAddressString(ProtoUtil.stringOrNullFromProto(proto.getPayoutAddressString()));
|
||||
tradingPeer.setContractAsJson(ProtoUtil.stringOrNullFromProto(proto.getContractAsJson()));
|
||||
tradingPeer.setContractSignature(ProtoUtil.stringOrNullFromProto(proto.getContractSignature()));
|
||||
tradingPeer.setSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getSignature()));
|
||||
tradingPeer.setPubKeyRing(proto.hasPubKeyRing() ? PubKeyRing.fromProto(proto.getPubKeyRing()) : null);
|
||||
tradingPeer.setMultiSigPubKey(ProtoUtil.byteArrayOrNullFromProto(proto.getMultiSigPubKey()));
|
||||
TradePeer tradePeer = new TradePeer();
|
||||
tradePeer.setNodeAddress(proto.hasNodeAddress() ? NodeAddress.fromProto(proto.getNodeAddress()) : null);
|
||||
tradePeer.setPubKeyRing(proto.hasPubKeyRing() ? PubKeyRing.fromProto(proto.getPubKeyRing()) : null);
|
||||
tradePeer.setChangeOutputValue(proto.getChangeOutputValue());
|
||||
tradePeer.setAccountId(ProtoUtil.stringOrNullFromProto(proto.getAccountId()));
|
||||
tradePeer.setPaymentAccountId(ProtoUtil.stringOrNullFromProto(proto.getPaymentAccountId()));
|
||||
tradePeer.setPaymentMethodId(ProtoUtil.stringOrNullFromProto(proto.getPaymentMethodId()));
|
||||
tradePeer.setPaymentAccountPayloadHash(proto.getPaymentAccountPayloadHash().toByteArray());
|
||||
tradePeer.setEncryptedPaymentAccountPayload(proto.getEncryptedPaymentAccountPayload().toByteArray());
|
||||
tradePeer.setPaymentAccountKey(ProtoUtil.byteArrayOrNullFromProto(proto.getPaymentAccountKey()));
|
||||
tradePeer.setPaymentAccountPayload(proto.hasPaymentAccountPayload() ? coreProtoResolver.fromProto(proto.getPaymentAccountPayload()) : null);
|
||||
tradePeer.setPayoutAddressString(ProtoUtil.stringOrNullFromProto(proto.getPayoutAddressString()));
|
||||
tradePeer.setContractAsJson(ProtoUtil.stringOrNullFromProto(proto.getContractAsJson()));
|
||||
tradePeer.setContractSignature(ProtoUtil.stringOrNullFromProto(proto.getContractSignature()));
|
||||
tradePeer.setSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getSignature()));
|
||||
tradePeer.setPubKeyRing(proto.hasPubKeyRing() ? PubKeyRing.fromProto(proto.getPubKeyRing()) : null);
|
||||
tradePeer.setMultiSigPubKey(ProtoUtil.byteArrayOrNullFromProto(proto.getMultiSigPubKey()));
|
||||
List<RawTransactionInput> rawTransactionInputs = proto.getRawTransactionInputsList().isEmpty() ?
|
||||
null :
|
||||
proto.getRawTransactionInputsList().stream()
|
||||
.map(RawTransactionInput::fromProto)
|
||||
.collect(Collectors.toList());
|
||||
tradingPeer.setRawTransactionInputs(rawTransactionInputs);
|
||||
tradingPeer.setChangeOutputAddress(ProtoUtil.stringOrNullFromProto(proto.getChangeOutputAddress()));
|
||||
tradingPeer.setAccountAgeWitnessNonce(ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessNonce()));
|
||||
tradingPeer.setAccountAgeWitnessSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessSignature()));
|
||||
tradePeer.setRawTransactionInputs(rawTransactionInputs);
|
||||
tradePeer.setChangeOutputAddress(ProtoUtil.stringOrNullFromProto(proto.getChangeOutputAddress()));
|
||||
tradePeer.setAccountAgeWitnessNonce(ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessNonce()));
|
||||
tradePeer.setAccountAgeWitnessSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getAccountAgeWitnessSignature()));
|
||||
protobuf.AccountAgeWitness protoAccountAgeWitness = proto.getAccountAgeWitness();
|
||||
tradingPeer.setAccountAgeWitness(protoAccountAgeWitness.getHash().isEmpty() ? null : AccountAgeWitness.fromProto(protoAccountAgeWitness));
|
||||
tradingPeer.setCurrentDate(proto.getCurrentDate());
|
||||
tradingPeer.setMediatedPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getMediatedPayoutTxSignature()));
|
||||
tradingPeer.setReserveTxHash(ProtoUtil.stringOrNullFromProto(proto.getReserveTxHash()));
|
||||
tradingPeer.setReserveTxHex(ProtoUtil.stringOrNullFromProto(proto.getReserveTxHex()));
|
||||
tradingPeer.setReserveTxKey(ProtoUtil.stringOrNullFromProto(proto.getReserveTxKey()));
|
||||
tradingPeer.setReserveTxKeyImages(proto.getReserveTxKeyImagesList());
|
||||
tradingPeer.setPreparedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getPreparedMultisigHex()));
|
||||
tradingPeer.setMadeMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getMadeMultisigHex()));
|
||||
tradingPeer.setExchangedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getExchangedMultisigHex()));
|
||||
tradingPeer.setDepositTxHash(ProtoUtil.stringOrNullFromProto(proto.getDepositTxHash()));
|
||||
tradingPeer.setDepositTxHex(ProtoUtil.stringOrNullFromProto(proto.getDepositTxHex()));
|
||||
tradingPeer.setDepositTxKey(ProtoUtil.stringOrNullFromProto(proto.getDepositTxKey()));
|
||||
tradingPeer.setUpdatedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getUpdatedMultisigHex()));
|
||||
return tradingPeer;
|
||||
tradePeer.setAccountAgeWitness(protoAccountAgeWitness.getHash().isEmpty() ? null : AccountAgeWitness.fromProto(protoAccountAgeWitness));
|
||||
tradePeer.setCurrentDate(proto.getCurrentDate());
|
||||
tradePeer.setMediatedPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getMediatedPayoutTxSignature()));
|
||||
tradePeer.setReserveTxHash(ProtoUtil.stringOrNullFromProto(proto.getReserveTxHash()));
|
||||
tradePeer.setReserveTxHex(ProtoUtil.stringOrNullFromProto(proto.getReserveTxHex()));
|
||||
tradePeer.setReserveTxKey(ProtoUtil.stringOrNullFromProto(proto.getReserveTxKey()));
|
||||
tradePeer.setReserveTxKeyImages(proto.getReserveTxKeyImagesList());
|
||||
tradePeer.setPreparedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getPreparedMultisigHex()));
|
||||
tradePeer.setMadeMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getMadeMultisigHex()));
|
||||
tradePeer.setExchangedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getExchangedMultisigHex()));
|
||||
tradePeer.setDepositTxHash(ProtoUtil.stringOrNullFromProto(proto.getDepositTxHash()));
|
||||
tradePeer.setDepositTxHex(ProtoUtil.stringOrNullFromProto(proto.getDepositTxHex()));
|
||||
tradePeer.setDepositTxKey(ProtoUtil.stringOrNullFromProto(proto.getDepositTxKey()));
|
||||
tradePeer.setUpdatedMultisigHex(ProtoUtil.stringOrNullFromProto(proto.getUpdatedMultisigHex()));
|
||||
return tradePeer;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -508,7 +508,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
|
|||
log.warn("Error processing payment received message: " + errorMessage);
|
||||
processModel.getTradeManager().requestPersistence();
|
||||
|
||||
// reprocess message depending on error
|
||||
// schedule to reprocess message unless deleted
|
||||
if (trade.getProcessModel().getPaymentReceivedMessage() != null) {
|
||||
UserThread.runAfter(() -> {
|
||||
reprocessPaymentReceivedMessageCount++;
|
||||
|
@ -583,8 +583,8 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
|
|||
private void onAckMessage(AckMessage ackMessage, NodeAddress peer) {
|
||||
// We handle the ack for PaymentSentMessage and DepositTxAndDelayedPayoutTxMessage
|
||||
// as we support automatic re-send of the msg in case it was not ACKed after a certain time
|
||||
if (ackMessage.getSourceMsgClassName().equals(PaymentSentMessage.class.getSimpleName()) && trade.getTradingPeer(peer) == trade.getSeller()) {
|
||||
processModel.setPaymentStartedAckMessage(ackMessage);
|
||||
if (ackMessage.getSourceMsgClassName().equals(PaymentSentMessage.class.getSimpleName()) && trade.getTradePeer(peer) == trade.getSeller()) {
|
||||
processModel.setPaymentSentAckMessage(ackMessage);
|
||||
}
|
||||
|
||||
if (ackMessage.isSuccess()) {
|
||||
|
@ -705,7 +705,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
|
|||
|
||||
private PubKeyRing getPeersPubKeyRing(NodeAddress address) {
|
||||
trade.setMyNodeAddress(); // TODO: this is a hack to update my node address before verifying the message
|
||||
TradingPeer peer = trade.getTradingPeer(address);
|
||||
TradePeer peer = trade.getTradePeer(address);
|
||||
if (peer == null) {
|
||||
log.warn("Cannot get peer's pub key ring because peer is not maker, taker, or arbitrator. Their address might have changed: " + peer);
|
||||
return null;
|
||||
|
@ -733,13 +733,13 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
|
|||
} else {
|
||||
|
||||
// valid if arbitrator or peer unknown
|
||||
if (trade.getArbitrator().getPubKeyRing() == null || (trade.getTradingPeer() == null || trade.getTradingPeer().getPubKeyRing() == null)) return true;
|
||||
if (trade.getArbitrator().getPubKeyRing() == null || (trade.getTradePeer() == null || trade.getTradePeer().getPubKeyRing() == null)) return true;
|
||||
|
||||
// valid if arbitrator's pub key ring
|
||||
if (message.getSignaturePubKey().equals(trade.getArbitrator().getPubKeyRing().getSignaturePubKey())) return true;
|
||||
|
||||
// valid if peer's pub key ring
|
||||
if (message.getSignaturePubKey().equals(trade.getTradingPeer().getPubKeyRing().getSignaturePubKey())) return true;
|
||||
if (message.getSignaturePubKey().equals(trade.getTradePeer().getPubKeyRing().getSignaturePubKey())) return true;
|
||||
}
|
||||
|
||||
// invalid
|
||||
|
|
|
@ -18,18 +18,13 @@
|
|||
package bisq.core.trade.protocol.tasks;
|
||||
|
||||
import bisq.core.filter.FilterManager;
|
||||
import bisq.core.payment.payload.PaymentAccountPayload;
|
||||
import bisq.core.trade.ArbitratorTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.InitTradeRequest;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
|
||||
import bisq.common.taskrunner.TaskRunner;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
@Slf4j
|
||||
|
@ -43,12 +38,12 @@ public class ApplyFilter extends TradeTask {
|
|||
try {
|
||||
runInterceptHook();
|
||||
|
||||
NodeAddress nodeAddress = checkNotNull(processModel.getTempTradingPeerNodeAddress());
|
||||
NodeAddress nodeAddress = checkNotNull(processModel.getTempTradePeerNodeAddress());
|
||||
|
||||
FilterManager filterManager = processModel.getFilterManager();
|
||||
if (filterManager.isNodeAddressBanned(nodeAddress)) {
|
||||
failed("Other trader is banned by their node address.\n" +
|
||||
"tradingPeerNodeAddress=" + nodeAddress);
|
||||
"tradePeerNodeAddress=" + nodeAddress);
|
||||
} else if (filterManager.isOfferIdBanned(trade.getId())) {
|
||||
failed("Offer ID is banned.\n" +
|
||||
"Offer ID=" + trade.getId());
|
||||
|
|
|
@ -27,7 +27,7 @@ import bisq.core.trade.HavenoUtils;
|
|||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.DepositRequest;
|
||||
import bisq.core.trade.messages.DepositResponse;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
import bisq.network.p2p.SendDirectMessageListener;
|
||||
import common.utils.JsonUtils;
|
||||
|
@ -65,7 +65,7 @@ public class ArbitratorProcessDepositRequest extends TradeTask {
|
|||
String signature = request.getContractSignature();
|
||||
|
||||
// get trader info
|
||||
TradingPeer trader = trade.getTradingPeer(processModel.getTempTradingPeerNodeAddress());
|
||||
TradePeer trader = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
|
||||
if (trader == null) throw new RuntimeException(request.getClass().getSimpleName() + " is not from maker, taker, or arbitrator");
|
||||
PubKeyRing peerPubKeyRing = trader.getPubKeyRing();
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ import bisq.core.offer.OfferDirection;
|
|||
import bisq.core.trade.HavenoUtils;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.InitTradeRequest;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import java.math.BigInteger;
|
||||
|
||||
import org.bitcoinj.core.Coin;
|
||||
|
@ -73,7 +73,7 @@ public class ArbitratorProcessReserveTx extends TradeTask {
|
|||
}
|
||||
|
||||
// save reserve tx to model
|
||||
TradingPeer trader = isFromTaker ? processModel.getTaker() : processModel.getMaker();
|
||||
TradePeer trader = isFromTaker ? processModel.getTaker() : processModel.getMaker();
|
||||
trader.setReserveTxHash(request.getReserveTxHash());
|
||||
trader.setReserveTxHex(request.getReserveTxHex());
|
||||
trader.setReserveTxKey(request.getReserveTxKey());
|
||||
|
|
|
@ -91,7 +91,7 @@ public abstract class BuyerSendPaymentSentMessage extends SendMailboxMessageTask
|
|||
trade.getPayoutTxHex(),
|
||||
trade.getSelf().getUpdatedMultisigHex(),
|
||||
trade.getSelf().getPaymentAccountKey(),
|
||||
trade.getTradingPeer().getAccountAgeWitness()
|
||||
trade.getTradePeer().getAccountAgeWitness()
|
||||
);
|
||||
|
||||
// sign message
|
||||
|
@ -139,7 +139,7 @@ public abstract class BuyerSendPaymentSentMessage extends SendMailboxMessageTask
|
|||
timer.stop();
|
||||
}
|
||||
if (listener != null) {
|
||||
processModel.getPaymentStartedMessageStateProperty().removeListener(listener);
|
||||
processModel.getPaymentSentMessageStateProperty().removeListener(listener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -98,16 +98,16 @@ public class MaybeSendSignContractRequest extends TradeTask {
|
|||
sig);
|
||||
|
||||
// send request to trading peer
|
||||
processModel.getP2PService().sendEncryptedDirectMessage(trade.getTradingPeer().getNodeAddress(), trade.getTradingPeer().getPubKeyRing(), request, new SendDirectMessageListener() {
|
||||
processModel.getP2PService().sendEncryptedDirectMessage(trade.getTradePeer().getNodeAddress(), trade.getTradePeer().getPubKeyRing(), request, new SendDirectMessageListener() {
|
||||
@Override
|
||||
public void onArrived() {
|
||||
log.info("{} arrived: trading peer={}; offerId={}; uid={}", request.getClass().getSimpleName(), trade.getTradingPeer().getNodeAddress(), trade.getId());
|
||||
log.info("{} arrived: trading peer={}; offerId={}; uid={}", request.getClass().getSimpleName(), trade.getTradePeer().getNodeAddress(), trade.getId());
|
||||
ack1 = true;
|
||||
if (ack1 && ack2) completeAux();
|
||||
}
|
||||
@Override
|
||||
public void onFault(String errorMessage) {
|
||||
log.error("Sending {} failed: uid={}; peer={}; error={}", request.getClass().getSimpleName(), trade.getTradingPeer().getNodeAddress(), trade.getId(), errorMessage);
|
||||
log.error("Sending {} failed: uid={}; peer={}; error={}", request.getClass().getSimpleName(), trade.getTradePeer().getNodeAddress(), trade.getId(), errorMessage);
|
||||
appendToErrorMessage("Sending message failed: message=" + request + "\nerrorMessage=" + errorMessage);
|
||||
failed();
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ package bisq.core.trade.protocol.tasks;
|
|||
import bisq.common.taskrunner.TaskRunner;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.DepositsConfirmedMessage;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.core.util.Validator;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
@ -44,11 +44,11 @@ public class ProcessDepositsConfirmedMessage extends TradeTask {
|
|||
DepositsConfirmedMessage request = (DepositsConfirmedMessage) processModel.getTradeMessage();
|
||||
checkNotNull(request);
|
||||
Validator.checkTradeId(processModel.getOfferId(), request);
|
||||
TradingPeer sender = trade.getTradingPeer(request.getPubKeyRing());
|
||||
TradePeer sender = trade.getTradePeer(request.getPubKeyRing());
|
||||
if (sender == null) throw new RuntimeException("Pub key ring is not from arbitrator, buyer, or seller");
|
||||
|
||||
// update peer node address
|
||||
sender.setNodeAddress(processModel.getTempTradingPeerNodeAddress());
|
||||
sender.setNodeAddress(processModel.getTempTradePeerNodeAddress());
|
||||
if (sender.getNodeAddress().equals(trade.getBuyer().getNodeAddress()) && sender != trade.getBuyer()) trade.getBuyer().setNodeAddress(null); // tests can reuse addresses
|
||||
if (sender.getNodeAddress().equals(trade.getSeller().getNodeAddress()) && sender != trade.getSeller()) trade.getSeller().setNodeAddress(null);
|
||||
if (sender.getNodeAddress().equals(trade.getArbitrator().getNodeAddress()) && sender != trade.getArbitrator()) trade.getArbitrator().setNodeAddress(null);
|
||||
|
@ -57,7 +57,7 @@ public class ProcessDepositsConfirmedMessage extends TradeTask {
|
|||
sender.setUpdatedMultisigHex(request.getUpdatedMultisigHex());
|
||||
|
||||
// decrypt seller payment account payload if key given
|
||||
if (request.getSellerPaymentAccountKey() != null && trade.getTradingPeer().getPaymentAccountPayload() == null) {
|
||||
if (request.getSellerPaymentAccountKey() != null && trade.getTradePeer().getPaymentAccountPayload() == null) {
|
||||
log.info(trade.getClass().getSimpleName() + " decrypting using seller payment account key");
|
||||
trade.decryptPeerPaymentAccountPayload(request.getSellerPaymentAccountKey());
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ import bisq.core.trade.MakerTrade;
|
|||
import bisq.core.trade.TakerTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.InitMultisigRequest;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
import bisq.network.p2p.SendDirectMessageListener;
|
||||
|
||||
|
@ -68,7 +68,7 @@ public class ProcessInitMultisigRequest extends TradeTask {
|
|||
XmrWalletService xmrWalletService = processModel.getProvider().getXmrWalletService();
|
||||
|
||||
// get peer multisig participant
|
||||
TradingPeer multisigParticipant = trade.getTradingPeer(processModel.getTempTradingPeerNodeAddress());
|
||||
TradePeer multisigParticipant = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
|
||||
|
||||
// reconcile peer's established multisig hex with message
|
||||
if (multisigParticipant.getPreparedMultisigHex() == null) multisigParticipant.setPreparedMultisigHex(request.getPreparedMultisigHex());
|
||||
|
@ -91,7 +91,7 @@ public class ProcessInitMultisigRequest extends TradeTask {
|
|||
}
|
||||
|
||||
// make multisig if applicable
|
||||
TradingPeer[] peers = getMultisigPeers();
|
||||
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());
|
||||
String multisigHex = multisigWallet.makeMultisig(Arrays.asList(peers[0].getPreparedMultisigHex(), peers[1].getPreparedMultisigHex()), 2, xmrWalletService.getWalletPassword()); // TODO (woodser): xmrWalletService.makeMultisig(tradeId, multisigHexes, threshold)?
|
||||
|
@ -187,8 +187,8 @@ public class ProcessInitMultisigRequest extends TradeTask {
|
|||
}
|
||||
}
|
||||
|
||||
private TradingPeer[] getMultisigPeers() {
|
||||
TradingPeer[] peers = new TradingPeer[2];
|
||||
private TradePeer[] getMultisigPeers() {
|
||||
TradePeer[] peers = new TradePeer[2];
|
||||
if (trade instanceof TakerTrade) {
|
||||
peers[0] = processModel.getArbitrator();
|
||||
peers[1] = processModel.getMaker();
|
||||
|
|
|
@ -24,7 +24,7 @@ import bisq.core.trade.MakerTrade;
|
|||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.HavenoUtils;
|
||||
import bisq.core.trade.messages.InitTradeRequest;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
|
||||
import bisq.common.taskrunner.TaskRunner;
|
||||
import org.bitcoinj.core.Coin;
|
||||
|
@ -58,7 +58,7 @@ public class ProcessInitTradeRequest extends TradeTask {
|
|||
checkTradeId(processModel.getOfferId(), request);
|
||||
|
||||
// handle request as arbitrator
|
||||
TradingPeer multisigParticipant;
|
||||
TradePeer multisigParticipant;
|
||||
if (trade instanceof ArbitratorTrade) {
|
||||
trade.getMaker().setPubKeyRing((trade.getOffer().getPubKeyRing()));
|
||||
trade.getArbitrator().setPubKeyRing(processModel.getPubKeyRing()); // TODO (woodser): why duplicating field in process model
|
||||
|
|
|
@ -68,12 +68,12 @@ public class ProcessPaymentReceivedMessage extends TradeTask {
|
|||
trade.getBuyer().setAccountAgeWitness(message.getBuyerAccountAgeWitness());
|
||||
|
||||
// update to the latest peer address of our peer if message is correct
|
||||
trade.getSeller().setNodeAddress(processModel.getTempTradingPeerNodeAddress());
|
||||
trade.getSeller().setNodeAddress(processModel.getTempTradePeerNodeAddress());
|
||||
if (trade.getSeller().getNodeAddress().equals(trade.getBuyer().getNodeAddress())) trade.getBuyer().setNodeAddress(null); // tests can reuse addresses
|
||||
|
||||
// close open disputes
|
||||
if (trade.getDisputeState().ordinal() >= Trade.DisputeState.DISPUTE_REQUESTED.ordinal()) {
|
||||
trade.setDisputeStateIfProgress(Trade.DisputeState.DISPUTE_CLOSED);
|
||||
trade.advanceDisputeState(Trade.DisputeState.DISPUTE_CLOSED);
|
||||
for (Dispute dispute : trade.getDisputes()) {
|
||||
dispute.setIsClosed();
|
||||
}
|
||||
|
@ -94,7 +94,7 @@ public class ProcessPaymentReceivedMessage extends TradeTask {
|
|||
}
|
||||
|
||||
// complete
|
||||
trade.setStateIfProgress(Trade.State.SELLER_SENT_PAYMENT_RECEIVED_MSG); // arbitrator auto completes when payout published
|
||||
trade.advanceState(Trade.State.SELLER_SENT_PAYMENT_RECEIVED_MSG); // arbitrator auto completes when payout published
|
||||
trade.requestPersistence();
|
||||
complete();
|
||||
} catch (Throwable t) {
|
||||
|
|
|
@ -54,14 +54,14 @@ public class ProcessPaymentSentMessage extends TradeTask {
|
|||
if (trade.isSeller()) trade.decryptPeerPaymentAccountPayload(message.getPaymentAccountKey());
|
||||
|
||||
// update latest peer address
|
||||
trade.getBuyer().setNodeAddress(processModel.getTempTradingPeerNodeAddress());
|
||||
trade.getBuyer().setNodeAddress(processModel.getTempTradePeerNodeAddress());
|
||||
|
||||
// set state
|
||||
String counterCurrencyTxId = message.getCounterCurrencyTxId();
|
||||
if (counterCurrencyTxId != null && counterCurrencyTxId.length() < 100) trade.setCounterCurrencyTxId(counterCurrencyTxId);
|
||||
String counterCurrencyExtraData = message.getCounterCurrencyExtraData();
|
||||
if (counterCurrencyExtraData != null && counterCurrencyExtraData.length() < 100) trade.setCounterCurrencyExtraData(counterCurrencyExtraData);
|
||||
trade.setStateIfProgress(trade.isSeller() ? Trade.State.SELLER_RECEIVED_PAYMENT_SENT_MSG : Trade.State.BUYER_SENT_PAYMENT_SENT_MSG);
|
||||
trade.advanceState(trade.isSeller() ? Trade.State.SELLER_RECEIVED_PAYMENT_SENT_MSG : Trade.State.BUYER_SENT_PAYMENT_SENT_MSG);
|
||||
trade.requestPersistence();
|
||||
complete();
|
||||
} catch (Throwable t) {
|
||||
|
|
|
@ -33,7 +33,7 @@ import bisq.core.trade.Trade;
|
|||
import bisq.core.trade.Trade.State;
|
||||
import bisq.core.trade.messages.SignContractRequest;
|
||||
import bisq.core.trade.messages.SignContractResponse;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.core.util.JsonUtil;
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
import bisq.network.p2p.SendDirectMessageListener;
|
||||
|
@ -65,7 +65,7 @@ public class ProcessSignContractRequest extends TradeTask {
|
|||
// extract fields from request
|
||||
// TODO (woodser): verify request and from maker or taker
|
||||
SignContractRequest request = (SignContractRequest) processModel.getTradeMessage();
|
||||
TradingPeer trader = trade.getTradingPeer(processModel.getTempTradingPeerNodeAddress());
|
||||
TradePeer trader = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
|
||||
trader.setDepositTxHash(request.getDepositTxHash());
|
||||
trader.setAccountId(request.getAccountId());
|
||||
trader.setPaymentAccountPayloadHash(request.getPaymentAccountPayloadHash());
|
||||
|
@ -120,8 +120,8 @@ public class ProcessSignContractRequest extends TradeTask {
|
|||
encryptedPaymentAccountPayload);
|
||||
|
||||
// get response recipients. only arbitrator sends response to both peers
|
||||
NodeAddress recipient1 = trade instanceof ArbitratorTrade ? trade.getMaker().getNodeAddress() : trade.getTradingPeer().getNodeAddress();
|
||||
PubKeyRing recipient1PubKey = trade instanceof ArbitratorTrade ? trade.getMaker().getPubKeyRing() : trade.getTradingPeer().getPubKeyRing();
|
||||
NodeAddress recipient1 = trade instanceof ArbitratorTrade ? trade.getMaker().getNodeAddress() : trade.getTradePeer().getNodeAddress();
|
||||
PubKeyRing recipient1PubKey = trade instanceof ArbitratorTrade ? trade.getMaker().getPubKeyRing() : trade.getTradePeer().getPubKeyRing();
|
||||
NodeAddress recipient2 = trade instanceof ArbitratorTrade ? trade.getTaker().getNodeAddress() : null;
|
||||
PubKeyRing recipient2PubKey = trade instanceof ArbitratorTrade ? trade.getTaker().getPubKeyRing() : null;
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ import bisq.common.taskrunner.TaskRunner;
|
|||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.DepositRequest;
|
||||
import bisq.core.trade.messages.SignContractResponse;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.network.p2p.SendDirectMessageListener;
|
||||
import java.util.Date;
|
||||
import java.util.UUID;
|
||||
|
@ -54,7 +54,7 @@ public class ProcessSignContractResponse extends TradeTask {
|
|||
}
|
||||
|
||||
// get peer info
|
||||
TradingPeer peer = trade.getTradingPeer(processModel.getTempTradingPeerNodeAddress());
|
||||
TradePeer peer = trade.getTradePeer(processModel.getTempTradePeerNodeAddress());
|
||||
PubKeyRing peerPubKeyRing = peer.getPubKeyRing();
|
||||
|
||||
// save peer's encrypted payment account payload
|
||||
|
|
|
@ -23,7 +23,7 @@ import bisq.core.support.dispute.Dispute;
|
|||
import bisq.core.trade.HavenoUtils;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.messages.DepositsConfirmedMessage;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
import bisq.core.util.Validator;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
@ -48,7 +48,7 @@ public class ResendDisputeClosedMessageWithPayout extends TradeTask {
|
|||
DepositsConfirmedMessage request = (DepositsConfirmedMessage) processModel.getTradeMessage();
|
||||
checkNotNull(request);
|
||||
Validator.checkTradeId(processModel.getOfferId(), request);
|
||||
TradingPeer sender = trade.getTradingPeer(request.getPubKeyRing());
|
||||
TradePeer sender = trade.getTradePeer(request.getPubKeyRing());
|
||||
if (sender == null) throw new RuntimeException("Pub key ring is not from arbitrator, buyer, or seller");
|
||||
|
||||
// arbitrator resends DisputeClosedMessage with payout tx when updated multisig info received
|
||||
|
|
|
@ -36,7 +36,7 @@ public class SellerPublishTradeStatistics extends TradeTask {
|
|||
//
|
||||
// checkNotNull(trade.getDepositTx());
|
||||
//
|
||||
// processModel.getP2PService().findPeersCapabilities(trade.getTradingPeer().getNodeAddress())
|
||||
// processModel.getP2PService().findPeersCapabilities(trade.getTradePeer().getNodeAddress())
|
||||
// .filter(capabilities -> capabilities.containsAll(Capability.TRADE_STATISTICS_3))
|
||||
// .ifPresentOrElse(capabilities -> {
|
||||
// // Our peer has updated, so as we are the seller we will publish the trade statistics.
|
||||
|
|
|
@ -85,7 +85,7 @@ public abstract class SellerSendPaymentReceivedMessage extends SendMailboxMessag
|
|||
trade.isPayoutPublished() ? trade.getPayoutTxHex() : null, // signed
|
||||
trade.getSelf().getUpdatedMultisigHex(),
|
||||
trade.getState().ordinal() >= Trade.State.SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG.ordinal(), // informs to expect payout
|
||||
trade.getTradingPeer().getAccountAgeWitness(),
|
||||
trade.getTradePeer().getAccountAgeWitness(),
|
||||
signedWitness,
|
||||
processModel.getPaymentSentMessage()
|
||||
);
|
||||
|
@ -106,28 +106,28 @@ public abstract class SellerSendPaymentReceivedMessage extends SendMailboxMessag
|
|||
|
||||
@Override
|
||||
protected void setStateSent() {
|
||||
trade.setStateIfProgress(Trade.State.SELLER_SENT_PAYMENT_RECEIVED_MSG);
|
||||
trade.advanceState(Trade.State.SELLER_SENT_PAYMENT_RECEIVED_MSG);
|
||||
log.info("{} sent: tradeId={} at peer {} SignedWitness {}", getClass().getSimpleName(), trade.getId(), getReceiverNodeAddress(), signedWitness);
|
||||
processModel.getTradeManager().requestPersistence();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setStateFault() {
|
||||
trade.setStateIfProgress(Trade.State.SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG);
|
||||
trade.advanceState(Trade.State.SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG);
|
||||
log.error("{} failed: tradeId={} at peer {} SignedWitness {}", getClass().getSimpleName(), trade.getId(), getReceiverNodeAddress(), signedWitness);
|
||||
processModel.getTradeManager().requestPersistence();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setStateStoredInMailbox() {
|
||||
trade.setStateIfProgress(Trade.State.SELLER_STORED_IN_MAILBOX_PAYMENT_RECEIVED_MSG);
|
||||
trade.advanceState(Trade.State.SELLER_STORED_IN_MAILBOX_PAYMENT_RECEIVED_MSG);
|
||||
log.info("{} stored in mailbox: tradeId={} at peer {} SignedWitness {}", getClass().getSimpleName(), trade.getId(), getReceiverNodeAddress(), signedWitness);
|
||||
processModel.getTradeManager().requestPersistence();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setStateArrived() {
|
||||
trade.setStateIfProgress(Trade.State.SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG);
|
||||
trade.advanceState(Trade.State.SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG);
|
||||
log.info("{} arrived: tradeId={} at peer {} SignedWitness {}", getClass().getSimpleName(), trade.getId(), getReceiverNodeAddress(), signedWitness);
|
||||
processModel.getTradeManager().requestPersistence();
|
||||
}
|
||||
|
|
|
@ -78,7 +78,7 @@ public abstract class SendDepositsConfirmedMessage extends SendMailboxMessageTas
|
|||
processModel.getMyNodeAddress(),
|
||||
processModel.getPubKeyRing(),
|
||||
deterministicId,
|
||||
trade.getBuyer() == trade.getTradingPeer(getReceiverNodeAddress()) ? trade.getSeller().getPaymentAccountKey() : null, // buyer receives seller's payment account decryption key
|
||||
trade.getBuyer() == trade.getTradePeer(getReceiverNodeAddress()) ? trade.getSeller().getPaymentAccountKey() : null, // buyer receives seller's payment account decryption key
|
||||
trade.getSelf().getUpdatedMultisigHex());
|
||||
}
|
||||
return message;
|
||||
|
|
|
@ -35,11 +35,11 @@ public abstract class SendMailboxMessageTask extends TradeTask {
|
|||
}
|
||||
|
||||
protected NodeAddress getReceiverNodeAddress() {
|
||||
return trade.getTradingPeer().getNodeAddress();
|
||||
return trade.getTradePeer().getNodeAddress();
|
||||
}
|
||||
|
||||
protected PubKeyRing getReceiverPubKeyRing() {
|
||||
return trade.getTradingPeer().getPubKeyRing();
|
||||
return trade.getTradePeer().getPubKeyRing();
|
||||
}
|
||||
|
||||
protected abstract TradeMailboxMessage getTradeMailboxMessage(String tradeId);
|
||||
|
|
|
@ -23,7 +23,7 @@ import bisq.core.offer.Offer;
|
|||
import bisq.core.payment.payload.PaymentAccountPayload;
|
||||
import bisq.core.trade.ArbitratorTrade;
|
||||
import bisq.core.trade.Trade;
|
||||
import bisq.core.trade.protocol.TradingPeer;
|
||||
import bisq.core.trade.protocol.TradePeer;
|
||||
|
||||
import bisq.common.crypto.PubKeyRing;
|
||||
import bisq.common.taskrunner.TaskRunner;
|
||||
|
@ -61,18 +61,18 @@ public class VerifyPeersAccountAgeWitness extends TradeTask {
|
|||
}
|
||||
|
||||
// skip if payment account payload is null
|
||||
TradingPeer tradingPeer = trade.getTradingPeer();
|
||||
if (tradingPeer.getPaymentAccountPayload() == null) {
|
||||
TradePeer tradePeer = trade.getTradePeer();
|
||||
if (tradePeer.getPaymentAccountPayload() == null) {
|
||||
complete();
|
||||
return;
|
||||
}
|
||||
|
||||
AccountAgeWitnessService accountAgeWitnessService = processModel.getAccountAgeWitnessService();
|
||||
PaymentAccountPayload peersPaymentAccountPayload = checkNotNull(tradingPeer.getPaymentAccountPayload(),
|
||||
PaymentAccountPayload peersPaymentAccountPayload = checkNotNull(tradePeer.getPaymentAccountPayload(),
|
||||
"Peers peersPaymentAccountPayload must not be null");
|
||||
PubKeyRing peersPubKeyRing = checkNotNull(tradingPeer.getPubKeyRing(), "peersPubKeyRing must not be null");
|
||||
byte[] nonce = checkNotNull(tradingPeer.getAccountAgeWitnessNonce());
|
||||
byte[] signature = checkNotNull(tradingPeer.getAccountAgeWitnessSignature());
|
||||
PubKeyRing peersPubKeyRing = checkNotNull(tradePeer.getPubKeyRing(), "peersPubKeyRing must not be null");
|
||||
byte[] nonce = checkNotNull(tradePeer.getAccountAgeWitnessNonce());
|
||||
byte[] signature = checkNotNull(tradePeer.getAccountAgeWitnessSignature());
|
||||
AtomicReference<String> errorMsg = new AtomicReference<>();
|
||||
boolean isValid = accountAgeWitnessService.verifyAccountAgeWitness(trade,
|
||||
peersPaymentAccountPayload,
|
||||
|
@ -81,8 +81,8 @@ public class VerifyPeersAccountAgeWitness extends TradeTask {
|
|||
signature,
|
||||
errorMsg::set);
|
||||
if (isValid) {
|
||||
trade.getTradingPeer().setAccountAgeWitness(processModel.getAccountAgeWitnessService().findWitness(trade.getTradingPeer().getPaymentAccountPayload(), trade.getTradingPeer().getPubKeyRing()).orElse(null));
|
||||
log.info("{} {} verified witness data of peer {}", trade.getClass().getSimpleName(), trade.getId(), tradingPeer.getNodeAddress());
|
||||
trade.getTradePeer().setAccountAgeWitness(processModel.getAccountAgeWitnessService().findWitness(trade.getTradePeer().getPaymentAccountPayload(), trade.getTradePeer().getPubKeyRing()).orElse(null));
|
||||
log.info("{} {} verified witness data of peer {}", trade.getClass().getSimpleName(), trade.getId(), tradePeer.getNodeAddress());
|
||||
complete();
|
||||
} else {
|
||||
failed(errorMsg.get());
|
||||
|
|
|
@ -39,7 +39,7 @@ public class FinalizeMediatedPayoutTx extends TradeTask {
|
|||
|
||||
// Transaction depositTx = checkNotNull(trade.getDepositTx());
|
||||
// String tradeId = trade.getId();
|
||||
// TradingPeer tradingPeer = trade.getTradingPeer();
|
||||
// TradePeer tradePeer = trade.getTradePeer();
|
||||
// BtcWalletService walletService = processModel.getBtcWalletService();
|
||||
// Offer offer = checkNotNull(trade.getOffer(), "offer must not be null");
|
||||
// Coin tradeAmount = checkNotNull(trade.getTradeAmount(), "tradeAmount must not be null");
|
||||
|
@ -50,8 +50,8 @@ public class FinalizeMediatedPayoutTx extends TradeTask {
|
|||
//
|
||||
// byte[] mySignature = checkNotNull(processModel.getMediatedPayoutTxSignature(),
|
||||
// "processModel.getTxSignatureFromMediation must not be null");
|
||||
// byte[] peersSignature = checkNotNull(tradingPeer.getMediatedPayoutTxSignature(),
|
||||
// "tradingPeer.getTxSignatureFromMediation must not be null");
|
||||
// byte[] peersSignature = checkNotNull(tradePeer.getMediatedPayoutTxSignature(),
|
||||
// "tradePeer.getTxSignatureFromMediation must not be null");
|
||||
//
|
||||
// boolean isMyRoleBuyer = contract.isMyRoleBuyer(processModel.getPubKeyRing());
|
||||
// byte[] buyerSignature = isMyRoleBuyer ? mySignature : peersSignature;
|
||||
|
@ -65,12 +65,12 @@ public class FinalizeMediatedPayoutTx extends TradeTask {
|
|||
// "; sellerPayoutAmount=" + sellerPayoutAmount);
|
||||
//
|
||||
// String myPayoutAddressString = walletService.getOrCreateAddressEntry(tradeId, AddressEntry.Context.TRADE_PAYOUT).getAddressString();
|
||||
// String peersPayoutAddressString = tradingPeer.getPayoutAddressString();
|
||||
// String peersPayoutAddressString = tradePeer.getPayoutAddressString();
|
||||
// String buyerPayoutAddressString = isMyRoleBuyer ? myPayoutAddressString : peersPayoutAddressString;
|
||||
// String sellerPayoutAddressString = isMyRoleBuyer ? peersPayoutAddressString : myPayoutAddressString;
|
||||
//
|
||||
// byte[] myMultiSigPubKey = processModel.getMyMultiSigPubKey();
|
||||
// byte[] peersMultiSigPubKey = tradingPeer.getMultiSigPubKey();
|
||||
// byte[] peersMultiSigPubKey = tradePeer.getMultiSigPubKey();
|
||||
// byte[] buyerMultiSigPubKey = isMyRoleBuyer ? myMultiSigPubKey : peersMultiSigPubKey;
|
||||
// byte[] sellerMultiSigPubKey = isMyRoleBuyer ? peersMultiSigPubKey : myMultiSigPubKey;
|
||||
//
|
||||
|
|
|
@ -44,10 +44,10 @@ public class ProcessMediatedPayoutSignatureMessage extends TradeTask {
|
|||
Validator.checkTradeId(processModel.getOfferId(), message);
|
||||
checkNotNull(message);
|
||||
|
||||
trade.getTradingPeer().setMediatedPayoutTxSignature(checkNotNull(message.getTxSignature()));
|
||||
trade.getTradePeer().setMediatedPayoutTxSignature(checkNotNull(message.getTxSignature()));
|
||||
|
||||
// update to the latest peer address of our peer if the message is correct
|
||||
trade.getTradingPeer().setNodeAddress(processModel.getTempTradingPeerNodeAddress());
|
||||
trade.getTradePeer().setNodeAddress(processModel.getTempTradePeerNodeAddress());
|
||||
|
||||
trade.setMediationResultState(MediationResultState.RECEIVED_SIG_MSG);
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ public class ProcessMediatedPayoutTxPublishedMessage extends TradeTask {
|
|||
// checkArgument(message.getPayoutTx() != null);
|
||||
//
|
||||
// // update to the latest peer address of our peer if the message is correct
|
||||
// trade.getTradingPeer().setNodeAddress(processModel.getTempTradingPeerNodeAddress());
|
||||
// trade.getTradePeer().setNodeAddress(processModel.getTempTradePeerNodeAddress());
|
||||
//
|
||||
// if (trade.getPayoutTx() == null) {
|
||||
// Transaction committedMediatedPayoutTx = WalletService.maybeAddNetworkTxToWallet(message.getPayoutTx(), processModel.getBtcWalletService().getWallet());
|
||||
|
|
|
@ -37,7 +37,7 @@ public class SignMediatedPayoutTx extends TradeTask {
|
|||
runInterceptHook();
|
||||
throw new RuntimeException("SignMediatedPayoutTx not implemented for xmr");
|
||||
|
||||
// TradingPeer tradingPeer = trade.getTradingPeer();
|
||||
// TradePeer tradePeer = trade.getTradePeer();
|
||||
// if (processModel.getMediatedPayoutTxSignature() != null) {
|
||||
// log.warn("processModel.getTxSignatureFromMediation is already set");
|
||||
// }
|
||||
|
@ -60,12 +60,12 @@ public class SignMediatedPayoutTx extends TradeTask {
|
|||
// boolean isMyRoleBuyer = contract.isMyRoleBuyer(processModel.getPubKeyRing());
|
||||
//
|
||||
// String myPayoutAddressString = walletService.getOrCreateAddressEntry(tradeId, AddressEntry.Context.TRADE_PAYOUT).getAddressString();
|
||||
// String peersPayoutAddressString = tradingPeer.getPayoutAddressString();
|
||||
// String peersPayoutAddressString = tradePeer.getPayoutAddressString();
|
||||
// String buyerPayoutAddressString = isMyRoleBuyer ? myPayoutAddressString : peersPayoutAddressString;
|
||||
// String sellerPayoutAddressString = isMyRoleBuyer ? peersPayoutAddressString : myPayoutAddressString;
|
||||
//
|
||||
// byte[] myMultiSigPubKey = processModel.getMyMultiSigPubKey();
|
||||
// byte[] peersMultiSigPubKey = tradingPeer.getMultiSigPubKey();
|
||||
// byte[] peersMultiSigPubKey = tradePeer.getMultiSigPubKey();
|
||||
// byte[] buyerMultiSigPubKey = isMyRoleBuyer ? myMultiSigPubKey : peersMultiSigPubKey;
|
||||
// byte[] sellerMultiSigPubKey = isMyRoleBuyer ? peersMultiSigPubKey : myMultiSigPubKey;
|
||||
//
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue