mirror of
https://github.com/haveno-dex/haveno.git
synced 2024-10-29 18:47:36 +00:00
import multisig hex individually if one is invalid
This commit is contained in:
parent
8cdd65e7dd
commit
c29cdb8b0f
2 changed files with 40 additions and 5 deletions
|
@ -274,15 +274,15 @@ public final class ArbitrationManager extends DisputeManager<ArbitrationDisputeL
|
|||
}
|
||||
dispute.setDisputeResult(disputeResult);
|
||||
|
||||
// sync and save wallet
|
||||
if (!trade.isPayoutPublished()) trade.syncAndPollWallet();
|
||||
|
||||
// update multisig hex
|
||||
if (disputeClosedMessage.getUpdatedMultisigHex() != null) trade.getArbitrator().setUpdatedMultisigHex(disputeClosedMessage.getUpdatedMultisigHex());
|
||||
if (trade.walletExists()) trade.importMultisigHex();
|
||||
|
||||
// sync and save wallet
|
||||
if (!trade.isPayoutPublished()) trade.syncAndPollWallet();
|
||||
|
||||
// attempt to sign and publish dispute payout tx if given and not already published
|
||||
if (disputeClosedMessage.getUnsignedPayoutTxHex() != null && !trade.isPayoutPublished()) {
|
||||
if (!trade.isPayoutPublished() && disputeClosedMessage.getUnsignedPayoutTxHex() != null) {
|
||||
|
||||
// wait to sign and publish payout tx if defer flag set
|
||||
if (disputeClosedMessage.isDeferPublishPayout()) {
|
||||
|
|
|
@ -92,6 +92,7 @@ import javafx.collections.ObservableList;
|
|||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import monero.common.MoneroError;
|
||||
import monero.common.MoneroRpcConnection;
|
||||
import monero.common.TaskLooper;
|
||||
import monero.daemon.MoneroDaemon;
|
||||
|
@ -886,6 +887,8 @@ public abstract class Trade implements Tradable, Model {
|
|||
try {
|
||||
doImportMultisigHex();
|
||||
break;
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
log.warn("Failed to import multisig hex, attempt={}/{}, tradeId={}, error={}", i + 1, TradeProtocol.MAX_ATTEMPTS, getShortId(), e.getMessage());
|
||||
if (i == TradeProtocol.MAX_ATTEMPTS - 1) throw e;
|
||||
|
@ -909,12 +912,44 @@ public abstract class Trade implements Tradable, Model {
|
|||
log.info("Importing multisig hexes for {} {}, count={}", getClass().getSimpleName(), getShortId(), multisigHexes.size());
|
||||
long startTime = System.currentTimeMillis();
|
||||
if (!multisigHexes.isEmpty()) {
|
||||
wallet.importMultisigHex(multisigHexes.toArray(new String[0]));
|
||||
try {
|
||||
wallet.importMultisigHex(multisigHexes.toArray(new String[0]));
|
||||
} catch (MoneroError e) {
|
||||
|
||||
// import multisig hex individually if one is invalid
|
||||
if (isInvalidImportError(e.getMessage())) {
|
||||
log.warn("Peer has invalid multisig hex for {} {}, importing individually", getClass().getSimpleName(), getShortId());
|
||||
boolean imported = false;
|
||||
Exception lastError = null;
|
||||
for (TradePeer peer : getOtherPeers()) {
|
||||
if (peer.getUpdatedMultisigHex() == null) continue;
|
||||
try {
|
||||
wallet.importMultisigHex(peer.getUpdatedMultisigHex());
|
||||
imported = true;
|
||||
} catch (MoneroError e2) {
|
||||
lastError = e2;
|
||||
if (isInvalidImportError(e2.getMessage())) {
|
||||
log.warn("{} has invalid multisig hex for {} {}, error={}, multisigHex={}", getPeerRole(peer), getClass().getSimpleName(), getShortId(), e2.getMessage(), peer.getUpdatedMultisigHex());
|
||||
} else {
|
||||
throw e2;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!imported) throw new IllegalArgumentException("Could not import any multisig hexes for " + getClass().getSimpleName() + " " + getShortId(), lastError);
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
requestSaveWallet();
|
||||
}
|
||||
log.info("Done importing multisig hexes for {} {} in {} ms, count={}", getClass().getSimpleName(), getShortId(), System.currentTimeMillis() - startTime, multisigHexes.size());
|
||||
}
|
||||
|
||||
// TODO: checking error strings isn't robust, but the library doesn't provide a way to check if multisig hex is invalid. throw IllegalArgumentException from library on invalid multisig hex?
|
||||
private boolean isInvalidImportError(String errMsg) {
|
||||
return errMsg.contains("Failed to parse hex") || errMsg.contains("Multisig info is for a different account");
|
||||
}
|
||||
|
||||
public void changeWalletPassword(String oldPassword, String newPassword) {
|
||||
synchronized (walletLock) {
|
||||
getWallet().changePassword(oldPassword, newPassword);
|
||||
|
|
Loading…
Reference in a new issue