fix upgrading cloned offers after protocol update (#1902)

This commit is contained in:
woodser 2025-08-11 09:17:48 -04:00 committed by GitHub
parent 6fd5772308
commit 2844337c09
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 41 additions and 14 deletions

View file

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

View file

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

View file

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

View file

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