mirror of
https://github.com/haveno-dex/haveno.git
synced 2024-12-24 23:09:36 -05:00
import multisig hex on every update and before creating payout txs
This commit is contained in:
parent
6dca11f471
commit
b585e0f105
@ -79,7 +79,6 @@ import java.util.stream.Collectors;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import monero.common.MoneroError;
|
import monero.common.MoneroError;
|
||||||
import monero.wallet.MoneroWallet;
|
|
||||||
import monero.wallet.model.MoneroTxConfig;
|
import monero.wallet.model.MoneroTxConfig;
|
||||||
import monero.wallet.model.MoneroTxWallet;
|
import monero.wallet.model.MoneroTxWallet;
|
||||||
|
|
||||||
@ -496,6 +495,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||||||
|
|
||||||
// update multisig hex
|
// update multisig hex
|
||||||
if (message.getUpdatedMultisigHex() != null) sender.setUpdatedMultisigHex(message.getUpdatedMultisigHex());
|
if (message.getUpdatedMultisigHex() != null) sender.setUpdatedMultisigHex(message.getUpdatedMultisigHex());
|
||||||
|
trade.importMultisigHex();
|
||||||
|
|
||||||
// update peer node address
|
// update peer node address
|
||||||
// TODO: tests can reuse the same addresses so nullify equal peer
|
// TODO: tests can reuse the same addresses so nullify equal peer
|
||||||
@ -820,23 +820,15 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
|
|||||||
|
|
||||||
public MoneroTxWallet createDisputePayoutTx(Trade trade, Contract contract, DisputeResult disputeResult, boolean skipMultisigImport) {
|
public MoneroTxWallet createDisputePayoutTx(Trade trade, Contract contract, DisputeResult disputeResult, boolean skipMultisigImport) {
|
||||||
|
|
||||||
|
// import multisig hex
|
||||||
|
trade.importMultisigHex();
|
||||||
|
|
||||||
// sync and save wallet
|
// sync and save wallet
|
||||||
trade.syncWallet();
|
trade.syncWallet();
|
||||||
trade.saveWallet();
|
trade.saveWallet();
|
||||||
|
|
||||||
// create unsigned dispute payout tx if not already published
|
// create unsigned dispute payout tx if not already published
|
||||||
if (!trade.isPayoutPublished()) {
|
if (!trade.isPayoutPublished()) {
|
||||||
MoneroWallet multisigWallet = trade.getWallet();
|
|
||||||
|
|
||||||
// import multisig hex
|
|
||||||
if (!skipMultisigImport) {
|
|
||||||
List<String> updatedMultisigHexes = new ArrayList<String>();
|
|
||||||
if (trade.getBuyer().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getBuyer().getUpdatedMultisigHex());
|
|
||||||
if (trade.getSeller().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getSeller().getUpdatedMultisigHex());
|
|
||||||
if (!updatedMultisigHexes.isEmpty()) {
|
|
||||||
multisigWallet.importMultisigHex(updatedMultisigHexes.toArray(new String[0])); // TODO (monero-project): fails if multisig hex imported individually
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// create unsigned dispute payout tx
|
// create unsigned dispute payout tx
|
||||||
log.info("Arbitrator creating unsigned dispute payout tx for trade {}", trade.getId());
|
log.info("Arbitrator creating unsigned dispute payout tx for trade {}", trade.getId());
|
||||||
|
@ -55,7 +55,6 @@ import com.google.inject.Inject;
|
|||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -252,6 +251,10 @@ public final class ArbitrationManager extends DisputeManager<ArbitrationDisputeL
|
|||||||
}
|
}
|
||||||
dispute.setDisputeResult(disputeResult);
|
dispute.setDisputeResult(disputeResult);
|
||||||
|
|
||||||
|
// import multisig hex
|
||||||
|
if (disputeClosedMessage.getUpdatedMultisigHex() != null) trade.getArbitrator().setUpdatedMultisigHex(disputeClosedMessage.getUpdatedMultisigHex());
|
||||||
|
trade.importMultisigHex();
|
||||||
|
|
||||||
// sync and save wallet
|
// sync and save wallet
|
||||||
if (!trade.isPayoutPublished()) {
|
if (!trade.isPayoutPublished()) {
|
||||||
trade.syncWallet();
|
trade.syncWallet();
|
||||||
@ -261,12 +264,6 @@ public final class ArbitrationManager extends DisputeManager<ArbitrationDisputeL
|
|||||||
// attempt to sign and publish dispute payout tx if given and not already published
|
// attempt to sign and publish dispute payout tx if given and not already published
|
||||||
if (disputeClosedMessage.getUnsignedPayoutTxHex() != null && !trade.isPayoutPublished()) {
|
if (disputeClosedMessage.getUnsignedPayoutTxHex() != null && !trade.isPayoutPublished()) {
|
||||||
|
|
||||||
// import multisig hex
|
|
||||||
List<String> updatedMultisigHexes = new ArrayList<String>();
|
|
||||||
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
|
|
||||||
|
|
||||||
// wait to sign and publish payout tx if defer flag set
|
// wait to sign and publish payout tx if defer flag set
|
||||||
if (disputeClosedMessage.isDeferPublishPayout()) {
|
if (disputeClosedMessage.isDeferPublishPayout()) {
|
||||||
log.info("Deferring signing and publishing dispute payout tx for {} {}", trade.getClass().getSimpleName(), trade.getId());
|
log.info("Deferring signing and publishing dispute payout tx for {} {}", trade.getClass().getSimpleName(), trade.getId());
|
||||||
|
@ -777,6 +777,14 @@ public abstract class Trade implements Tradable, Model {
|
|||||||
}, syncNormalDuration);
|
}, syncNormalDuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void importMultisigHex() {
|
||||||
|
List<String> multisigHexes = new ArrayList<String>();
|
||||||
|
if (getBuyer().getUpdatedMultisigHex() != null) multisigHexes.add(getBuyer().getUpdatedMultisigHex());
|
||||||
|
if (getSeller().getUpdatedMultisigHex() != null) multisigHexes.add(getSeller().getUpdatedMultisigHex());
|
||||||
|
if (getArbitrator().getUpdatedMultisigHex() != null) multisigHexes.add(getArbitrator().getUpdatedMultisigHex());
|
||||||
|
if (!multisigHexes.isEmpty()) getWallet().importMultisigHex(multisigHexes.toArray(new String[0]));
|
||||||
|
}
|
||||||
|
|
||||||
public void changeWalletPassword(String oldPassword, String newPassword) {
|
public void changeWalletPassword(String oldPassword, String newPassword) {
|
||||||
synchronized (walletLock) {
|
synchronized (walletLock) {
|
||||||
getWallet().changePassword(oldPassword, newPassword);
|
getWallet().changePassword(oldPassword, newPassword);
|
||||||
@ -882,9 +890,15 @@ public abstract class Trade implements Tradable, Model {
|
|||||||
*/
|
*/
|
||||||
public MoneroTxWallet createPayoutTx() {
|
public MoneroTxWallet createPayoutTx() {
|
||||||
|
|
||||||
|
// check connection to monero daemon
|
||||||
|
checkWalletConnection();
|
||||||
|
|
||||||
|
// import multisig hex
|
||||||
|
importMultisigHex();
|
||||||
|
if (getWallet().isMultisigImportNeeded()) throw new RuntimeException("Cannot create payout tx because multisig import is needed");
|
||||||
|
|
||||||
// gather info
|
// gather info
|
||||||
MoneroWallet multisigWallet = getWallet();
|
MoneroWallet multisigWallet = getWallet();
|
||||||
if (multisigWallet.isMultisigImportNeeded()) throw new RuntimeException("Cannot create payout tx because multisig import is needed");
|
|
||||||
String sellerPayoutAddress = this.getSeller().getPayoutAddressString();
|
String sellerPayoutAddress = this.getSeller().getPayoutAddressString();
|
||||||
String buyerPayoutAddress = this.getBuyer().getPayoutAddressString();
|
String buyerPayoutAddress = this.getBuyer().getPayoutAddressString();
|
||||||
Preconditions.checkNotNull(sellerPayoutAddress, "Seller payout address must not be null");
|
Preconditions.checkNotNull(sellerPayoutAddress, "Seller payout address must not be null");
|
||||||
@ -895,9 +909,6 @@ public abstract class Trade implements Tradable, Model {
|
|||||||
BigInteger buyerPayoutAmount = buyerDepositAmount.add(tradeAmount);
|
BigInteger buyerPayoutAmount = buyerDepositAmount.add(tradeAmount);
|
||||||
BigInteger sellerPayoutAmount = sellerDepositAmount.subtract(tradeAmount);
|
BigInteger sellerPayoutAmount = sellerDepositAmount.subtract(tradeAmount);
|
||||||
|
|
||||||
// check connection to monero daemon
|
|
||||||
checkWalletConnection();
|
|
||||||
|
|
||||||
// create transaction to get fee estimate
|
// create transaction to get fee estimate
|
||||||
MoneroTxWallet feeEstimateTx = multisigWallet.createTx(new MoneroTxConfig()
|
MoneroTxWallet feeEstimateTx = multisigWallet.createTx(new MoneroTxConfig()
|
||||||
.setAccountIndex(0)
|
.setAccountIndex(0)
|
||||||
|
@ -65,18 +65,6 @@ public class BuyerPreparePaymentSentMessage extends TradeTask {
|
|||||||
Preconditions.checkNotNull(trade.getTakerDepositTx(), "trade.getTakerDepositTx() must not be null");
|
Preconditions.checkNotNull(trade.getTakerDepositTx(), "trade.getTakerDepositTx() must not be null");
|
||||||
checkNotNull(trade.getOffer(), "offer must not be null");
|
checkNotNull(trade.getOffer(), "offer must not be null");
|
||||||
|
|
||||||
// get multisig wallet
|
|
||||||
MoneroWallet multisigWallet = trade.getWallet();
|
|
||||||
|
|
||||||
// import multisig hex
|
|
||||||
List<String> updatedMultisigHexes = new ArrayList<String>();
|
|
||||||
if (trade.getSeller().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getSeller().getUpdatedMultisigHex());
|
|
||||||
if (trade.getArbitrator().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getArbitrator().getUpdatedMultisigHex());
|
|
||||||
if (!updatedMultisigHexes.isEmpty()) {
|
|
||||||
multisigWallet.importMultisigHex(updatedMultisigHexes.toArray(new String[0])); // TODO (monero-project): fails if multisig hex imported individually
|
|
||||||
trade.saveWallet();
|
|
||||||
}
|
|
||||||
|
|
||||||
// create payout tx if we have seller's updated multisig hex
|
// create payout tx if we have seller's updated multisig hex
|
||||||
if (trade.getSeller().getUpdatedMultisigHex() != null) {
|
if (trade.getSeller().getUpdatedMultisigHex() != null) {
|
||||||
|
|
||||||
|
@ -53,8 +53,9 @@ public class ProcessDepositsConfirmedMessage extends TradeTask {
|
|||||||
if (sender.getNodeAddress().equals(trade.getSeller().getNodeAddress()) && sender != trade.getSeller()) trade.getSeller().setNodeAddress(null);
|
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);
|
if (sender.getNodeAddress().equals(trade.getArbitrator().getNodeAddress()) && sender != trade.getArbitrator()) trade.getArbitrator().setNodeAddress(null);
|
||||||
|
|
||||||
// store updated multisig hex for processing on payment sent
|
// update multisig hex
|
||||||
sender.setUpdatedMultisigHex(request.getUpdatedMultisigHex());
|
sender.setUpdatedMultisigHex(request.getUpdatedMultisigHex());
|
||||||
|
trade.importMultisigHex();
|
||||||
|
|
||||||
// decrypt seller payment account payload if key given
|
// decrypt seller payment account payload if key given
|
||||||
if (request.getSellerPaymentAccountKey() != null && trade.getTradePeer().getPaymentAccountPayload() == null) {
|
if (request.getSellerPaymentAccountKey() != null && trade.getTradePeer().getPaymentAccountPayload() == null) {
|
||||||
|
@ -33,9 +33,6 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import static com.google.common.base.Preconditions.checkArgument;
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -108,16 +105,11 @@ public class ProcessPaymentReceivedMessage extends TradeTask {
|
|||||||
|
|
||||||
private void processPayoutTx(PaymentReceivedMessage message) {
|
private void processPayoutTx(PaymentReceivedMessage message) {
|
||||||
|
|
||||||
// sync and save wallet
|
// update wallet
|
||||||
|
trade.importMultisigHex();
|
||||||
trade.syncWallet();
|
trade.syncWallet();
|
||||||
trade.saveWallet();
|
trade.saveWallet();
|
||||||
|
|
||||||
// import multisig hex
|
|
||||||
List<String> updatedMultisigHexes = new ArrayList<String>();
|
|
||||||
if (trade.getSeller().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getSeller().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
|
|
||||||
|
|
||||||
// handle if payout tx not published
|
// handle if payout tx not published
|
||||||
if (!trade.isPayoutPublished()) {
|
if (!trade.isPayoutPublished()) {
|
||||||
|
|
||||||
|
@ -50,6 +50,9 @@ public class ProcessPaymentSentMessage extends TradeTask {
|
|||||||
trade.getBuyer().setUpdatedMultisigHex(message.getUpdatedMultisigHex());
|
trade.getBuyer().setUpdatedMultisigHex(message.getUpdatedMultisigHex());
|
||||||
trade.getSeller().setAccountAgeWitness(message.getSellerAccountAgeWitness());
|
trade.getSeller().setAccountAgeWitness(message.getSellerAccountAgeWitness());
|
||||||
|
|
||||||
|
// import multisig hex
|
||||||
|
trade.importMultisigHex();
|
||||||
|
|
||||||
// if seller, decrypt buyer's payment account payload
|
// if seller, decrypt buyer's payment account payload
|
||||||
if (trade.isSeller()) trade.decryptPeerPaymentAccountPayload(message.getPaymentAccountKey());
|
if (trade.isSeller()) trade.decryptPeerPaymentAccountPayload(message.getPaymentAccountKey());
|
||||||
|
|
||||||
|
@ -19,13 +19,9 @@ package bisq.core.trade.protocol.tasks;
|
|||||||
|
|
||||||
import bisq.core.trade.Trade;
|
import bisq.core.trade.Trade;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import bisq.common.taskrunner.TaskRunner;
|
import bisq.common.taskrunner.TaskRunner;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import monero.wallet.MoneroWallet;
|
|
||||||
import monero.wallet.model.MoneroTxWallet;
|
import monero.wallet.model.MoneroTxWallet;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -48,14 +44,7 @@ public class SellerPreparePaymentReceivedMessage extends TradeTask {
|
|||||||
if (processModel.getPaymentReceivedMessage() == null) {
|
if (processModel.getPaymentReceivedMessage() == null) {
|
||||||
|
|
||||||
// import multisig hex
|
// import multisig hex
|
||||||
MoneroWallet multisigWallet = trade.getWallet();
|
trade.importMultisigHex();
|
||||||
List<String> updatedMultisigHexes = new ArrayList<String>();
|
|
||||||
if (trade.getBuyer().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getBuyer().getUpdatedMultisigHex());
|
|
||||||
if (trade.getArbitrator().getUpdatedMultisigHex() != null) updatedMultisigHexes.add(trade.getArbitrator().getUpdatedMultisigHex());
|
|
||||||
if (!updatedMultisigHexes.isEmpty()) {
|
|
||||||
multisigWallet.importMultisigHex(updatedMultisigHexes.toArray(new String[0]));
|
|
||||||
trade.saveWallet();
|
|
||||||
}
|
|
||||||
|
|
||||||
// verify, sign, and publish payout tx if given. otherwise create payout tx
|
// verify, sign, and publish payout tx if given. otherwise create payout tx
|
||||||
if (trade.getPayoutTxHex() != null) {
|
if (trade.getPayoutTxHex() != null) {
|
||||||
|
Loading…
Reference in New Issue
Block a user