mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-09-22 14:04:44 -04:00
fix upgrading cloned offers after protocol update (#1902)
This commit is contained in:
parent
6fd5772308
commit
2844337c09
4 changed files with 41 additions and 14 deletions
|
@ -122,16 +122,16 @@ public final class OpenOffer implements Tradable {
|
|||
this(offer, 0, false);
|
||||
}
|
||||
|
||||
public OpenOffer(Offer offer, long triggerPrice) {
|
||||
this(offer, triggerPrice, false);
|
||||
public OpenOffer(Offer offer, long triggerPrice, boolean reserveExactAmount) {
|
||||
this(offer, triggerPrice, reserveExactAmount, null);
|
||||
}
|
||||
|
||||
public OpenOffer(Offer offer, long triggerPrice, boolean reserveExactAmount) {
|
||||
public OpenOffer(Offer offer, long triggerPrice, boolean reserveExactAmount, String groupId) {
|
||||
this.offer = offer;
|
||||
this.triggerPrice = triggerPrice;
|
||||
this.reserveExactAmount = reserveExactAmount;
|
||||
this.challenge = offer.getChallenge();
|
||||
this.groupId = UUID.randomUUID().toString();
|
||||
this.groupId = groupId == null ? UUID.randomUUID().toString() : groupId;
|
||||
state = State.PENDING;
|
||||
}
|
||||
|
||||
|
|
|
@ -1260,7 +1260,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
|||
}
|
||||
|
||||
private List<MoneroTxWallet> getSplitOutputFundingTxs(BigInteger reserveAmount, Integer preferredSubaddressIndex) {
|
||||
List<MoneroTxWallet> splitOutputTxs = xmrWalletService.getTxs(new MoneroTxQuery().setIsIncoming(true).setIsFailed(false));
|
||||
List<MoneroTxWallet> splitOutputTxs = xmrWalletService.getTxs(new MoneroTxQuery().setIsFailed(false)); // TODO: not using setIsIncoming(true) because split output txs sent to self have false; fix in monero-java?
|
||||
Set<MoneroTxWallet> removeTxs = new HashSet<MoneroTxWallet>();
|
||||
for (MoneroTxWallet tx : splitOutputTxs) {
|
||||
if (tx.getOutputs() != null) { // outputs not available until first confirmation
|
||||
|
@ -1283,6 +1283,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
|||
boolean hasExactTransfer = (tx.getTransfers(new MoneroTransferQuery()
|
||||
.setAccountIndex(0)
|
||||
.setSubaddressIndex(preferredSubaddressIndex)
|
||||
.setIsIncoming(true)
|
||||
.setAmount(amount)).size() > 0);
|
||||
return hasExactTransfer;
|
||||
}
|
||||
|
@ -1972,8 +1973,10 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
|||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
private void maybeUpdatePersistedOffers() {
|
||||
List<OpenOffer> openOffersClone = getOpenOffers();
|
||||
openOffersClone.forEach(originalOpenOffer -> {
|
||||
|
||||
// update open offers
|
||||
List<OpenOffer> updatedOpenOffers = new ArrayList<>();
|
||||
getOpenOffers().forEach(originalOpenOffer -> {
|
||||
Offer originalOffer = originalOpenOffer.getOffer();
|
||||
|
||||
OfferPayload originalOfferPayload = originalOffer.getOfferPayload();
|
||||
|
@ -2068,16 +2071,19 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
|||
// create new offer
|
||||
Offer updatedOffer = new Offer(updatedPayload);
|
||||
updatedOffer.setPriceFeedService(priceFeedService);
|
||||
|
||||
long normalizedTriggerPrice = originalOffer.isInverted() ? PriceUtil.invertLongPrice(originalOpenOffer.getTriggerPrice(), originalOffer.getCounterCurrencyCode()) : originalOpenOffer.getTriggerPrice();
|
||||
OpenOffer updatedOpenOffer = new OpenOffer(updatedOffer, normalizedTriggerPrice);
|
||||
OpenOffer updatedOpenOffer = new OpenOffer(updatedOffer, normalizedTriggerPrice, originalOpenOffer.isReserveExactAmount(), originalOpenOffer.getGroupId());
|
||||
updatedOpenOffer.setChallenge(originalOpenOffer.getChallenge());
|
||||
addOpenOffer(updatedOpenOffer);
|
||||
requestPersistence();
|
||||
|
||||
log.info("Updating offer completed. id={}", originalOffer.getId());
|
||||
updatedOpenOffers.add(updatedOpenOffer);
|
||||
}
|
||||
});
|
||||
|
||||
// add updated open offers
|
||||
updatedOpenOffers.forEach(updatedOpenOffer -> {
|
||||
addOpenOffer(updatedOpenOffer);
|
||||
requestPersistence();
|
||||
log.info("Updating offer completed. id={}", updatedOpenOffer.getId());
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -575,6 +575,7 @@ public class XmrWalletService extends XmrWalletBase {
|
|||
|
||||
// freeze outputs
|
||||
for (String keyImage : unfrozenKeyImages) wallet.freezeOutput(keyImage);
|
||||
cacheNonPoolTxs();
|
||||
cacheWalletInfo();
|
||||
requestSaveWallet();
|
||||
}
|
||||
|
@ -597,11 +598,31 @@ public class XmrWalletService extends XmrWalletBase {
|
|||
|
||||
// thaw outputs
|
||||
for (String keyImage : frozenKeyImages) wallet.thawOutput(keyImage);
|
||||
cacheNonPoolTxs();
|
||||
cacheWalletInfo();
|
||||
requestSaveWallet();
|
||||
}
|
||||
}
|
||||
|
||||
private void cacheNonPoolTxs() {
|
||||
|
||||
// get non-pool txs
|
||||
List<MoneroTxWallet> nonPoolTxs = wallet.getTxs(new MoneroTxQuery().setIncludeOutputs(true).setInTxPool(false));
|
||||
|
||||
// replace non-pool txs in cache
|
||||
for (MoneroTxWallet nonPoolTx : nonPoolTxs) {
|
||||
boolean replaced = false;
|
||||
for (int i = 0; i < cachedTxs.size(); i++) {
|
||||
if (cachedTxs.get(i).getHash().equals(nonPoolTx.getHash())) {
|
||||
cachedTxs.set(i, nonPoolTx);
|
||||
replaced = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!replaced) cachedTxs.add(nonPoolTx);
|
||||
}
|
||||
}
|
||||
|
||||
private List<Integer> getSubaddressesWithExactInput(BigInteger amount) {
|
||||
|
||||
// fetch unspent, unfrozen, unlocked outputs
|
||||
|
|
|
@ -38,7 +38,7 @@ public class TradableListTest {
|
|||
|
||||
// test adding an OpenOffer and convert toProto
|
||||
Offer offer = new Offer(offerPayload);
|
||||
OpenOffer openOffer = new OpenOffer(offer, 0);
|
||||
OpenOffer openOffer = new OpenOffer(offer, 0, false);
|
||||
openOfferTradableList.add(openOffer);
|
||||
message = (protobuf.PersistableEnvelope) openOfferTradableList.toProtoMessage();
|
||||
assertEquals(message.getMessageCase(), TRADABLE_LIST);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue