Skip to content

Commit 070d5b5

Browse files
committed
fix upgrading cloned offers after protocol update
1 parent 6fd5772 commit 070d5b5

File tree

4 files changed

+41
-14
lines changed

4 files changed

+41
-14
lines changed

core/src/main/java/haveno/core/offer/OpenOffer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,16 +122,16 @@ public OpenOffer(Offer offer) {
122122
this(offer, 0, false);
123123
}
124124

125-
public OpenOffer(Offer offer, long triggerPrice) {
126-
this(offer, triggerPrice, false);
125+
public OpenOffer(Offer offer, long triggerPrice, boolean reserveExactAmount) {
126+
this(offer, triggerPrice, reserveExactAmount, null);
127127
}
128128

129-
public OpenOffer(Offer offer, long triggerPrice, boolean reserveExactAmount) {
129+
public OpenOffer(Offer offer, long triggerPrice, boolean reserveExactAmount, String groupId) {
130130
this.offer = offer;
131131
this.triggerPrice = triggerPrice;
132132
this.reserveExactAmount = reserveExactAmount;
133133
this.challenge = offer.getChallenge();
134-
this.groupId = UUID.randomUUID().toString();
134+
this.groupId = groupId == null ? UUID.randomUUID().toString() : groupId;
135135
state = State.PENDING;
136136
}
137137

core/src/main/java/haveno/core/offer/OpenOfferManager.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,7 +1260,7 @@ private boolean isReservedByOffer(OpenOffer openOffer, MoneroTxWallet tx) {
12601260
}
12611261

12621262
private List<MoneroTxWallet> getSplitOutputFundingTxs(BigInteger reserveAmount, Integer preferredSubaddressIndex) {
1263-
List<MoneroTxWallet> splitOutputTxs = xmrWalletService.getTxs(new MoneroTxQuery().setIsIncoming(true).setIsFailed(false));
1263+
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?
12641264
Set<MoneroTxWallet> removeTxs = new HashSet<MoneroTxWallet>();
12651265
for (MoneroTxWallet tx : splitOutputTxs) {
12661266
if (tx.getOutputs() != null) { // outputs not available until first confirmation
@@ -1283,6 +1283,7 @@ private boolean hasExactOutput(MoneroTxWallet tx, BigInteger amount, Integer pre
12831283
boolean hasExactTransfer = (tx.getTransfers(new MoneroTransferQuery()
12841284
.setAccountIndex(0)
12851285
.setSubaddressIndex(preferredSubaddressIndex)
1286+
.setIsIncoming(true)
12861287
.setAmount(amount)).size() > 0);
12871288
return hasExactTransfer;
12881289
}
@@ -1972,8 +1973,10 @@ public void onFault(String errorMessage) {
19721973
///////////////////////////////////////////////////////////////////////////////////////////
19731974

19741975
private void maybeUpdatePersistedOffers() {
1975-
List<OpenOffer> openOffersClone = getOpenOffers();
1976-
openOffersClone.forEach(originalOpenOffer -> {
1976+
1977+
// update open offers
1978+
List<OpenOffer> updatedOpenOffers = new ArrayList<>();
1979+
getOpenOffers().forEach(originalOpenOffer -> {
19771980
Offer originalOffer = originalOpenOffer.getOffer();
19781981

19791982
OfferPayload originalOfferPayload = originalOffer.getOfferPayload();
@@ -2068,16 +2071,19 @@ private void maybeUpdatePersistedOffers() {
20682071
// create new offer
20692072
Offer updatedOffer = new Offer(updatedPayload);
20702073
updatedOffer.setPriceFeedService(priceFeedService);
2071-
20722074
long normalizedTriggerPrice = originalOffer.isInverted() ? PriceUtil.invertLongPrice(originalOpenOffer.getTriggerPrice(), originalOffer.getCounterCurrencyCode()) : originalOpenOffer.getTriggerPrice();
2073-
OpenOffer updatedOpenOffer = new OpenOffer(updatedOffer, normalizedTriggerPrice);
2075+
OpenOffer updatedOpenOffer = new OpenOffer(updatedOffer, normalizedTriggerPrice, originalOpenOffer.isReserveExactAmount(), originalOpenOffer.getGroupId());
20742076
updatedOpenOffer.setChallenge(originalOpenOffer.getChallenge());
2075-
addOpenOffer(updatedOpenOffer);
2076-
requestPersistence();
2077-
2078-
log.info("Updating offer completed. id={}", originalOffer.getId());
2077+
updatedOpenOffers.add(updatedOpenOffer);
20792078
}
20802079
});
2080+
2081+
// add updated open offers
2082+
updatedOpenOffers.forEach(updatedOpenOffer -> {
2083+
addOpenOffer(updatedOpenOffer);
2084+
requestPersistence();
2085+
log.info("Updating offer completed. id={}", updatedOpenOffer.getId());
2086+
});
20812087
}
20822088

20832089

core/src/main/java/haveno/core/xmr/wallet/XmrWalletService.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,7 @@ public void freezeOutputs(Collection<String> keyImages) {
575575

576576
// freeze outputs
577577
for (String keyImage : unfrozenKeyImages) wallet.freezeOutput(keyImage);
578+
cacheNonPoolTxs();
578579
cacheWalletInfo();
579580
requestSaveWallet();
580581
}
@@ -597,11 +598,31 @@ public void thawOutputs(Collection<String> keyImages) {
597598

598599
// thaw outputs
599600
for (String keyImage : frozenKeyImages) wallet.thawOutput(keyImage);
601+
cacheNonPoolTxs();
600602
cacheWalletInfo();
601603
requestSaveWallet();
602604
}
603605
}
604606

607+
private void cacheNonPoolTxs() {
608+
609+
// get non-pool txs
610+
List<MoneroTxWallet> nonPoolTxs = wallet.getTxs(new MoneroTxQuery().setIncludeOutputs(true).setInTxPool(false));
611+
612+
// replace non-pool txs in cache
613+
for (MoneroTxWallet nonPoolTx : nonPoolTxs) {
614+
boolean replaced = false;
615+
for (int i = 0; i < cachedTxs.size(); i++) {
616+
if (cachedTxs.get(i).getHash().equals(nonPoolTx.getHash())) {
617+
cachedTxs.set(i, nonPoolTx);
618+
replaced = true;
619+
break;
620+
}
621+
}
622+
if (!replaced) cachedTxs.add(nonPoolTx);
623+
}
624+
}
625+
605626
private List<Integer> getSubaddressesWithExactInput(BigInteger amount) {
606627

607628
// fetch unspent, unfrozen, unlocked outputs

core/src/test/java/haveno/core/trade/TradableListTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public void protoTesting() {
3838

3939
// test adding an OpenOffer and convert toProto
4040
Offer offer = new Offer(offerPayload);
41-
OpenOffer openOffer = new OpenOffer(offer, 0);
41+
OpenOffer openOffer = new OpenOffer(offer, 0, false);
4242
openOfferTradableList.add(openOffer);
4343
message = (protobuf.PersistableEnvelope) openOfferTradableList.toProtoMessage();
4444
assertEquals(message.getMessageCase(), TRADABLE_LIST);

0 commit comments

Comments
 (0)