Skip to content

Commit 812af3d

Browse files
committed
add validation and self correction for recorded security deposits
1 parent 83e1e56 commit 812af3d

File tree

3 files changed

+39
-19
lines changed

3 files changed

+39
-19
lines changed

core/src/main/java/haveno/core/trade/Trade.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2695,10 +2695,18 @@ private void doPollWallet() {
26952695
setStateDepositsSeen();
26962696

26972697
// set actual security deposits
2698-
if (getBuyer().getSecurityDeposit().longValueExact() == 0) {
2699-
BigInteger buyerSecurityDeposit = hasBuyerAsTakerWithoutDeposit() ? BigInteger.ZERO : ((MoneroTxWallet) getBuyer().getDepositTx()).getIncomingAmount();
2700-
BigInteger sellerSecurityDeposit = ((MoneroTxWallet) getSeller().getDepositTx()).getIncomingAmount().subtract(getAmount());
2698+
if (getBuyer().getDepositTx() != null) {
2699+
BigInteger buyerSecurityDeposit = ((MoneroTxWallet) getBuyer().getDepositTx()).getIncomingAmount();
2700+
if (!getBuyer().getSecurityDeposit().equals(BigInteger.ZERO) && !getBuyer().getSecurityDeposit().equals(buyerSecurityDeposit)) {
2701+
log.warn("Overwriting buyer security deposit for {} {}, old={}, new={}", getClass().getSimpleName(), getShortId(), getBuyer().getSecurityDeposit(), buyerSecurityDeposit);
2702+
}
27012703
getBuyer().setSecurityDeposit(buyerSecurityDeposit);
2704+
}
2705+
if (getSeller().getDepositTx() != null) {
2706+
BigInteger sellerSecurityDeposit = ((MoneroTxWallet) getSeller().getDepositTx()).getIncomingAmount().subtract(getAmount());
2707+
if (!getSeller().getSecurityDeposit().equals(BigInteger.ZERO) && !getSeller().getSecurityDeposit().equals(sellerSecurityDeposit)) {
2708+
log.warn("Overwriting seller security deposit for {} {}, old={}, new={}", getClass().getSimpleName(), getShortId(), getSeller().getSecurityDeposit(), sellerSecurityDeposit);
2709+
}
27022710
getSeller().setSecurityDeposit(sellerSecurityDeposit);
27032711
}
27042712

core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorProcessDepositRequest.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,8 @@ private void processDepositRequest() {
120120
// verify deposit tx
121121
boolean isFromBuyerAsTakerWithoutDeposit = isFromBuyer && isFromTaker && trade.hasBuyerAsTakerWithoutDeposit();
122122
if (!isFromBuyerAsTakerWithoutDeposit) {
123-
MoneroTx verifiedTx;
124123
try {
125-
verifiedTx = trade.getXmrWalletService().verifyDepositTx(
124+
MoneroTx verifiedTx = trade.getXmrWalletService().verifyDepositTx(
126125
offer.getId(),
127126
tradeFee,
128127
trade.getProcessModel().getTradeFeeAddress(),
@@ -133,15 +132,22 @@ private void processDepositRequest() {
133132
request.getDepositTxHex(),
134133
request.getDepositTxKey(),
135134
null);
135+
136+
// TODO: it seems a deposit tx had 0 fee once?
137+
if (BigInteger.ZERO.equals(verifiedTx.getFee())) {
138+
String errorMessage = "Deposit transaction from " + (isFromTaker ? "taker" : "maker") + " has 0 fee for trade " + trade.getId() + ". This should never happen.";
139+
log.warn(errorMessage + "\n" + verifiedTx);
140+
throw new RuntimeException(errorMessage);
141+
}
142+
143+
// update trade state
144+
sender.setSecurityDeposit(sender.getSecurityDeposit().subtract(verifiedTx.getFee())); // subtract mining fee from security deposit
145+
sender.setDepositTxFee(verifiedTx.getFee());
146+
sender.setDepositTxHex(request.getDepositTxHex());
147+
sender.setDepositTxKey(request.getDepositTxKey());
136148
} catch (Exception e) {
137149
throw new RuntimeException("Error processing deposit tx from " + (isFromTaker ? "taker " : "maker ") + sender.getNodeAddress() + ", offerId=" + offer.getId() + ": " + e.getMessage());
138150
}
139-
140-
// update trade state
141-
sender.setSecurityDeposit(sender.getSecurityDeposit().subtract(verifiedTx.getFee())); // subtract mining fee from security deposit
142-
sender.setDepositTxFee(verifiedTx.getFee());
143-
sender.setDepositTxHex(request.getDepositTxHex());
144-
sender.setDepositTxKey(request.getDepositTxKey());
145151
}
146152

147153
// update trade state

core/src/main/java/haveno/core/trade/protocol/tasks/ArbitratorProcessReserveTx.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,8 @@ protected void run() {
6767
BigInteger penaltyFee = HavenoUtils.multiply(isFromMaker ? offer.getAmount() : trade.getAmount(), offer.getPenaltyFeePct());
6868
BigInteger tradeFee = isFromMaker ? offer.getMaxMakerFee() : trade.getTakerFee();
6969
BigInteger sendAmount = isFromBuyer ? BigInteger.ZERO : isFromMaker ? offer.getAmount() : trade.getAmount(); // maker reserve tx is for offer amount
70-
MoneroTx verifiedTx;
7170
try {
72-
verifiedTx = trade.getXmrWalletService().verifyReserveTx(
71+
MoneroTx verifiedTx = trade.getXmrWalletService().verifyReserveTx(
7372
offer.getId(),
7473
penaltyFee,
7574
tradeFee,
@@ -80,16 +79,23 @@ protected void run() {
8079
request.getReserveTxHex(),
8180
request.getReserveTxKey(),
8281
null);
82+
83+
// TODO: it seems a deposit tx had 0 fee once?
84+
if (BigInteger.ZERO.equals(verifiedTx.getFee())) {
85+
String errorMessage = "Reserve transaction from " + (isFromMaker ? "maker" : "taker") + " has 0 fee for trade " + trade.getId() + ". This should never happen.";
86+
log.warn(errorMessage + "\n" + verifiedTx);
87+
throw new RuntimeException(errorMessage);
88+
}
89+
90+
// save reserve tx to model
91+
sender.setSecurityDeposit(sender.getSecurityDeposit().subtract(verifiedTx.getFee())); // subtract mining fee from security deposit
92+
sender.setReserveTxHash(request.getReserveTxHash());
93+
sender.setReserveTxHex(request.getReserveTxHex());
94+
sender.setReserveTxKey(request.getReserveTxKey());
8395
} catch (Exception e) {
8496
log.error(ExceptionUtils.getStackTrace(e));
8597
throw new RuntimeException("Error processing reserve tx from " + (isFromMaker ? "maker " : "taker ") + processModel.getTempTradePeerNodeAddress() + ", offerId=" + offer.getId() + ": " + e.getMessage());
8698
}
87-
88-
// save reserve tx to model
89-
sender.setSecurityDeposit(sender.getSecurityDeposit().subtract(verifiedTx.getFee())); // subtract mining fee from security deposit
90-
sender.setReserveTxHash(request.getReserveTxHash());
91-
sender.setReserveTxHex(request.getReserveTxHex());
92-
sender.setReserveTxKey(request.getReserveTxKey());
9399
}
94100

95101
// persist trade

0 commit comments

Comments
 (0)