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:
woodser 2023-02-05 18:56:13 -05:00
parent a50e151c98
commit aafb47e2ce
112 changed files with 527 additions and 567 deletions

View file

@ -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");

View file

@ -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,

View file

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

View file

@ -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");
}

View file

@ -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" +

View file

@ -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;
}

View file

@ -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.

View file

@ -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.

View file

@ -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);
}
}
}

View file

@ -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");

View file

@ -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();

View file

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

View file

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

View file

@ -63,6 +63,6 @@ public abstract class BuyerTrade extends Trade {
@Override
public boolean confirmPermitted() {
return !getDisputeState().isArbitrated();
return true;
}
}

View file

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

View file

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

View file

@ -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();

View file

@ -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)));
}

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -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
}
}

View file

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

View file

@ -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());

View file

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

View file

@ -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,

View file

@ -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();

View file

@ -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.")))

View file

@ -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();
}

View file

@ -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();
}

View file

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

View file

@ -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,

View file

@ -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;
}
}
}

View file

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

View file

@ -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());

View file

@ -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();

View file

@ -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());

View file

@ -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);
}
}
}

View file

@ -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();
}

View file

@ -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());
}

View file

@ -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();

View file

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

View file

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

View file

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

View file

@ -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;

View file

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

View file

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

View file

@ -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.

View file

@ -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();
}

View file

@ -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;

View file

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

View file

@ -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());

View file

@ -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;
//

View file

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

View file

@ -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());

View file

@ -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;
//